2013-10-04 3 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

Вы видите эффекты редкой, но известная ошибки:
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». Ваши две грамматики (один с одним и без строки прокомментировал) показывают один случай, когда это происходит, и один случай, когда этого не происходит. –

Смежные вопросы