2016-04-14 3 views
1

, если я использую эту грамматику:antlr4 разбора с неиспользуемыми правилами

grammar NameValue; 
nameValue: (name=ID ':' value=ID)+ EOF; 
//idWithSpace : ID (' ' ID)*; 
ID : [a-zA-Z]+ ; 
WS : [ \t\r\n]+ -> skip ; // Define whitespace rule, toss it out 

и этот вход:

a:b 
a : b 
A : B 

я получаю эту разобрана:

(nameValue a : b a : b A : B <EOF>) 

но если я раскомментировать idWithSpace line, я получаю этот сингл:

line 2:1 extraneous input ' ' expecting ':' 
line 2:3 extraneous input ' ' expecting ID 
(nameValue a : b a : b A : B <EOF>) 

почему добавление правила idWithSpace

idWithSpace : ID (' ' ID)*; 

что не ссылается, вызывает синтаксический анализ изменить?

+0

Я предполагаю, что проблема в том, что пространство как пропущено, так и используется в правиле idWithSpace. Зачем вам нужно это пространство перед ID? – Divisadero

ответ

0

Это правило:

idWithSpace : ID (' ' ID)*; 

благодаря встроенной строке «», неявно создает правило лексического анализатора, который соответствует один символ пробела и помещается перед всеми другими правилами LeXeR. В результате он эффективно маскировал ваше правило WS всякий раз, когда встречается один пробельный символ. Следовательно, одно пространство больше не может быть пропущено и обозначено и передано парсеру. Но нет никакого правила синтаксического анализа, что позволяет использовать одно пространство перед:, поэтому он жалуется на дополнительный «» вход:

line 2:1 extraneous input ' ' expecting ':' 

меня укусил много, такого рода ошибки, когда я впервые использовал ANTLR.

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