ANTLR v3:命令令牌以提高树步行者的性能

时间:2014-03-08 16:30:20

标签: performance antlr3

是否有可能指定ANTLR v3生成的令牌的顺序? 我的目标是以这样的方式对令牌进行排序,使得我的规则“表达式”中的有效令牌彼此跟随,以便树步行者(具有大约90个不同分支)中的条件可以简化为一个分支。像

这样的东西
if(LA18_0 >= ARRAY_ACCESS && LA18_0 <= VariableId){}

ANTLR按字母顺序将值分配给标记。这意味着,以“a”开头的令牌具有最低值,令牌“z”最高。

说明我的问题的一个例子。 “abstract”(在我的规则“expression”中不是有效的标记)在ARRAY_ACCESS(值为4)之后的值为5,因此条件必须如下所示:

if(LA18_0 == ARRAY_ACCESS || (LA18_0 >= Assign && LA18_0 <= VariableId)){}

这只是一个例子,正如我所说,大约有90个分支。

我可以为这些代币添加前缀以实现我的目标,但这看起来相当丑陋并且妨碍了可读性。还有另一种方式吗?

1 个答案:

答案 0 :(得分:0)

保证ANTLR对特定标记使用特定常量的唯一方法是编写自己的.tokens文件(在编译语法时,您会看到它们生成了ANTLR)。然后,您可以使用tokenVocab选项指定自定义令牌文件的名称。

也就是说,根据我的经验,令牌的排序从未被证明是一个重要的性能问题。 ANTLR 3的C#端口通过消除某些代码路径上出现的冗余范围检查来解决性能问题。