如果解析器规则具有自己的数字文字,则 ANTLR4 无法解析 Integer

ANTLR4 can't parse Integer if a parser rules has an own numeric literal

我在尝试在我的语法中定义整数时遇到了一些困难。

假设我有这个小语法:

grammar Hello;
r  : 'hello' INTEGER; 
INTEGER : [0-9]+ ;
WS : [ \t\r\n]+ -> skip ; 

如果我再输入

hello 5

它解析正确。

但是,如果我有一个额外的解析器规则(即使它未被使用)定义了一个标记“5”, 那我就无法再解析前面的例子了

所以这个语法:

grammar Hello;
r  : 'hello' INTEGER;
unusedRule: 'hi' '5';
INTEGER : [0-9]+ ;
WS : [ \t\r\n]+ -> skip ; 

hello 5

将不再解析。它给了我以下错误:

Hello::r:1:6: mismatched input '5' expecting INTEGER

这怎么可能,我该如何解决这个问题?

当你定义一个像

这样的解析器规则时
unusedRule: 'hi' '5';

Antlr 为子项创建隐式词法分析器标记。由于它们是在词法分析器中自动创建的,因此您无法控制在词法分析器规则的优先评估中的位置。

因此,最好的策略是从不在解析器规则中使用文字;始终明确定义您的标记。