ANTLR输入'<EOF>'不匹配

Jar*_*eck 5 antlr antlr4

鉴于以下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]+ ;
Run Code Online (Sandbox Code Playgroud)

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

line 1:6 mismatched input '<EOF>' expecting WS
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*ell 6

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

正确解决这个问题的性能影响目前是惊人的,因此我们无意在可预见的未来应用补丁.解决方法是创建一个以显式结束的规则EOF,并在那里开始解析.