Игнорирование пробелов в ANTLRWorks

#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 из-за пробелов:

Изображение интерфейса с исключением MismatchedTokenException

Из чтения веб-сайта ANTLR и

Игнорировать правила: WS

и

{$channel=СКРЫТЫЙ}

правило текста / грамматики, кажется, что пробелы следует игнорировать, однако это не так.

Что я делаю не так?

Комментарии:

1. Указание «присваивания» вместо «ПРИСВАИВАНИЯ» исправило это.

Ответ №1:

Я знаю, что вы уже нашли ответ, но позвольте мне объяснить, почему изменение ASSIGNMENT assignment решило его.

Потому что правила, начинающиеся с заглавной буквы, являются правилами лексера (то есть токенами). И {skip();} или {$channel=HIDDEN;} вызывают пропуск (или скрытие) правил лексера из правил синтаксического анализа, а не из правил лексера.

Вот почему ASSIGNMENT (правило лексера) не принимает никаких пробелов, а assignment (правило синтаксического анализатора) их игнорирует.