2013-10-04 76 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'。你的兩個語法(一個和一個沒有註釋的行)顯示了它發生的一種情況,以及它沒有發生的一種情況。 –