如果解析器规则具有自己的数字文字,则 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 为子项创建隐式词法分析器标记。由于它们是在词法分析器中自动创建的,因此您无法控制在词法分析器规则的优先评估中的位置。
因此,最好的策略是从不在解析器规则中使用文字;始终明确定义您的标记。
我在尝试在我的语法中定义整数时遇到了一些困难。
假设我有这个小语法:
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 为子项创建隐式词法分析器标记。由于它们是在词法分析器中自动创建的,因此您无法控制在词法分析器规则的优先评估中的位置。
因此,最好的策略是从不在解析器规则中使用文字;始终明确定义您的标记。