#antlr #antlrworks
#antlr #antlrworks
Вопрос:
У меня есть следующая грамматика ANTLR:
grammar mygrammar;
ASSIGNMENT
: ID '=' INT
;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
INT : '0'..'9'
;
WS : ( ' '
| 't'
| 'r'
| 'n'
) {$channel=HIDDEN;}
;
На самом деле моим является только правило ПРИСВАИВАНИЯ, остальные — значения по умолчанию, добавленные ANTLRWorks 1.4.3.
Когда я пытаюсь попробовать грамматику в интерпретаторе, строки, такие как «a = 5», завершаются успешно, но строки, такие как «b [пробел] = [пробел] 6», терпят неудачу: я получаю исключение MismatchedTokenException из-за пробелов:
Из чтения веб-сайта ANTLR и
Игнорировать правила: WS
и
{$channel=СКРЫТЫЙ}
правило текста / грамматики, кажется, что пробелы следует игнорировать, однако это не так.
Что я делаю не так?
Комментарии:
1. Указание «присваивания» вместо «ПРИСВАИВАНИЯ» исправило это.
Ответ №1:
Я знаю, что вы уже нашли ответ, но позвольте мне объяснить, почему изменение ASSIGNMENT
assignment
решило его.
Потому что правила, начинающиеся с заглавной буквы, являются правилами лексера (то есть токенами). И {skip();}
или {$channel=HIDDEN;}
вызывают пропуск (или скрытие) правил лексера из правил синтаксического анализа, а не из правил лексера.
Вот почему ASSIGNMENT
(правило лексера) не принимает никаких пробелов, а assignment
(правило синтаксического анализатора) их игнорирует.