5

给定以下 ANTLR 4.1 语法,有意注释掉一行...

grammar Foobar;

//whyDoesThisRuleHelp : expression ;
expression : operand | binaryOperation ;
binaryOperation : operand WS BINARY_OPERATOR WS expression ;
operand : LETTER ;

BINARY_OPERATOR : 'EQ' ;
LETTER : [a-z] ;
WS : [ \n]+ ;

..为什么会echo -n "a EQ b" | grun Foobar expression产生

line 1:6 mismatched input '<EOF>' expecting WS

..但是如果我们取消注释上面的block : expression ;行,那么grun 不会产生错误

4

1 回答 1

6

您正在看到一个罕见但已知的错误的影响:
如果没有明确的 EOF,就不会为启动规则错误地抛出可行的替代方案

正确修复此问题的性能影响目前令人震惊,因此我们无意在可预见的将来应用该补丁。解决方法是创建一个以显式结尾的规则EOF,然后从那里开始解析。

于 2013-10-04T04:00:08.343 回答