如何最好地处理许多接受案例

How to best handle many accept cases

对于class,我正在研究解释器,目前正在研究扫描仪。作为一个将被多次调用的 class,我希望它能针对速度进行优化。在扫描仪中,要对运算符进行分类,您必须将当前令牌与 6 个左右的运算符进行比较。哪种方法最适合速度,但也适合可读性。

  1. if 语句中的许多情况
  2. 遍历每个运算符的字符数组并进行比较
  3. 切换语句

这些是我唯一能想到的情况。哪个最好,或者如果您有更好的方法,请分享。我实现了#2,因为它占用的代码行最少。

就几个项目而言,差异很小。如果你有很多物品,你一定要使用开关。

如果开关包含五个以上的项目,则使用查找 table 或哈希列表来实现。这意味着与 if 的列表相比,所有项目都获得相同的访问时间,其中最后一项需要更多时间才能到达,因为它必须首先评估每个先前的条件。

而且正如@Qix 评论的那样switch 它更具可读性。

任何明智的 hand-written 扫描器都基于 switch 语句。请注意,如果您 return 将特殊字符直接作为它们本身发送给解析器,则可以节省大小写操作:

switch (ch) // the next incoming character
{
    case '+':
    case '-':
    case '*':
    case '/':
    case '%':
    // etc.
        return ch;
    case 'A':
    case 'B':
    // ...
    case 'Z':
    case 'a':
    case 'b':
    // ...
    case 'z':
        // start of an identifier: accumulate it, with a do/while loop,
        // save it somewhere, return IDENTIFIER
        return IDENTIFIER;
    case '0':
    case '1':
    // ...
    case '9':
        // start of a numeric literal: ...
        return NUMERIC_LITERAL;
    // etc. 
}