如何最好地处理许多接受案例
How to best handle many accept cases
对于class,我正在研究解释器,目前正在研究扫描仪。作为一个将被多次调用的 class,我希望它能针对速度进行优化。在扫描仪中,要对运算符进行分类,您必须将当前令牌与 6 个左右的运算符进行比较。哪种方法最适合速度,但也适合可读性。
- if 语句中的许多情况
- 遍历每个运算符的字符数组并进行比较
- 切换语句
这些是我唯一能想到的情况。哪个最好,或者如果您有更好的方法,请分享。我实现了#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.
}
对于class,我正在研究解释器,目前正在研究扫描仪。作为一个将被多次调用的 class,我希望它能针对速度进行优化。在扫描仪中,要对运算符进行分类,您必须将当前令牌与 6 个左右的运算符进行比较。哪种方法最适合速度,但也适合可读性。
- if 语句中的许多情况
- 遍历每个运算符的字符数组并进行比较
- 切换语句
这些是我唯一能想到的情况。哪个最好,或者如果您有更好的方法,请分享。我实现了#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.
}