2013-10-04 72 views
4

鉴于以下ANTLR 4.1语法,一个行故意注释掉...ANTLR不匹配输入 '<EOF>'

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

你看到一个罕见的,但已知的bug的影响:
No viable alternative can be incorrectly thrown for start rules without explicit EOF

的妥善解决这个性能的影响目前惊人,所以我们没有应用补丁可预见的未来的打算。解决方法是创建一个以显式EOF结束的规则,并在那里开始解析。

+1

我相信你,但是我的'whyDoesThisRuleHelp'规则中没有明确的EOF。是否有一个有趣的(或教育)的原因,为什么没有明确的EOF规则也解决了这个问题?谢谢。 (我读了[你提到的问题](https://github.com/antlr/antlr4/issues/118),但不明白任何它lol) –

+0

@JaredBeck它不会发生每次你失踪'EOF'。你的两个语法(一个和一个没有注释的行)显示了它发生的一种情况,以及它没有发生的一种情况。 –