我简化了发生错误的代码:
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>
我已经尝试了很多方法,但是没有一种可以用。有人可以帮助我吗?
答案 0 :(得分:0)
如果您为输入打印令牌流(通过将-tokens
作为grun
的参数添加),则会看到a
被识别为{{1} },而不是LETTER
。发生这种情况是因为WORD
和LETTER
都产生了相同长度的匹配项(即都匹配WORD
),并且a
在语法中排在首位(这称为最大值)规则)。
因此,您可以通过将LETTER
规则移到“规则”一词之后来解决问题,但是由于您实际上从来不想在任何情况下都产生LETTER
令牌,因此更好的解决方案是告诉ANTLR通过将规则标记为LETTER
。