Игнорирование пробелов в ANTLRworks - PullRequest
3 голосов
/ 26 октября 2011

У меня есть следующая грамматика 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;}
    ;

На самом деле только правило ASSIGNMENT принадлежит мне, остальные значения по умолчанию добавлены ANTLRWorks 1.4.3.

Когда я прихожу попробовать грамматику в интерпретаторе, строки, такие как "a = 5", успешно выполняются, но строки, такие как "b [space] = [space] 6", терпят неудачу: я получаю исключение MismatchedTokenException из-за пробелов:

Picture of the interface with a MismatchedTokenException

Из прочтения веб-сайта ANTLR и правила для текста / грамматики

Ignore rules: WS
и
{$channel=HIDDEN}
кажется, что пробел следует игнорировать, однако это не тот случай.

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

1 Ответ

6 голосов
/ 26 октября 2011

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

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

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

...