[英]antlr4 mismatched input 'a' expecting NAME
我简化了发生错误的代码:
grammar simperr;
var
: VAR_IDS NAME EQU NAME SPLIT
;
VAR_IDS : ('var'|'let')+;
LETTER : [a-zA-Z$_];
NUM : [0-9];
NAME : LETTER (LETTER|NUM)*;
EQU : '=';
SPLIT : ';';
WS : [ \t\n\r]+ -> skip;
我明白了
var a=ijf;
enter var, LT(1)=var
consume [@0,0:2='var',<1>,1:0] rule var
line 1:4 mismatched input 'a' expecting NAME
exit var, LT(1)=<EOF>
我已经尝试了很多方法,但是没有一种可以用。有人可以帮我吗?
如果打印标流为您的输入(通过添加-tokens
作为参数传递给grun
),你会看到a
被公认的LETTER
,而不是一个WORD
。 发生这种情况是因为LETTER
和WORD
产生相同长度的匹配(即两者都匹配a
),而LETTER
在语法中排在第一位(这被称为最大munch规则)。
因此,您可以通过在单词规则之后移动LETTER
规则来解决您的问题,但由于您实际上从未想要在任何情况下生成LETTER
标记,因此更好的解决方案是通过将规则标记为fragment
来告诉ANTLR。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.