是否有可能指定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个分支。
我可以为这些代币添加前缀以实现我的目标,但这看起来相当丑陋并且妨碍了可读性。还有另一种方式吗?
答案 0 :(得分:0)
保证ANTLR对特定标记使用特定常量的唯一方法是编写自己的.tokens
文件(在编译语法时,您会看到它们生成了ANTLR)。然后,您可以使用tokenVocab
选项指定自定义令牌文件的名称。
也就是说,根据我的经验,令牌的排序从未被证明是一个重要的性能问题。 ANTLR 3的C#端口通过消除某些代码路径上出现的冗余范围检查来解决性能问题。