Заставить ANTLRWorks автоматически обрабатывать пробелы - PullRequest
1 голос
/ 05 сентября 2011

У меня есть грамматика ANTLR, такая как:

grammar HelloGrammar1;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
STATEMENT : 'hello' ID ';' ;
WS  :   (' '|'\t'|'\r'|'\n')* ;

Я хочу, чтобы она проанализировала следующий текст: hello qwerty ;.Это не работает таким образом.Если я изменю свою строку на helloqwerty;, все в порядке.Я также могу изменить грамматику на:

grammar HelloGrammar2;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
STATEMENT : 'hello' WS ID WS ';' ;
WS  :   (' '|'\t'|'\r'|'\n')* ;

И в этом случае hello qwerty ; работает нормально.Можно ли заставить ANTLR автоматически пропускать пробелы?(т.е. - я хочу, чтобы HelloGrammar1 работал с hello qwerty ;)

Обновление

Если это имеет смысл: я тестирую его в ANTLRWorks.

Обновление 2

Также пробовал так:

grammar HelloGrammar;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
STATEMENT : 'hello' ID ';' ;
WS  :   (' '|'\t'|'\r'|'\n') { $channel = HIDDEN; } ;

Все еще не работает.

Обновление 3

Я использую вкладку "Переводчик" с выбранным правилом "ЗАЯВЛЕНИЕ".

1 Ответ

2 голосов
/ 05 сентября 2011

Я думаю, что проблема может заключаться в том, что вы должны изменить STATEMENT (в настоящее время правило лексера) на выражение (правило синтаксического анализатора)

grammar HelloGrammar;

statement : 'hello' ID ';' ;
ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
WS  :   (' '|'\t'|'\r'|'\n') { $channel = HIDDEN; } ;

В ANTLRWorksэто принимает:

hello qwerty;
hello   qwerty;
hello loki2302;
hello   qwerty  ;

, но не принимает:

helloqwerty;
helloqwerty ;
hello;
hello qwerty
...