使用以下语法
grammar Gram;
exprEof
: expr EOF
;
expr
: Uident
| expr '(' Uident ')'
;
Uident
: [A-Z][a-z]*
;
WS
: [ \n\t]+ -> skip
;
如果我尝试从Foo(A B)
解析输入exprEof
,我会收到预期的错误
line 1:6 extraneous input 'B' expecting ')'
但是如果我添加一个额外的规则
expr2
: expr '(' Uident ')'
;
然后错误是
line 1:3 mismatched input '(' expecting <EOF>
这是令人惊讶的,因为expr2
实际上并未从exprEof
调用mismatched input '( expecting <EOF>
。在我的完整语法中,它会导致非常无用的错误消息,其中表达式深处的语法错误在表达式的开头附近报告为WHERE
。
我正在使用ANTLR 4.5.3。