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