ANTLR рассматривает несколько EOL как один? - PullRequest
1 голос
/ 09 февраля 2012

Я хочу разобрать язык, на котором операторы разделяются EOL.Я попробовал это в грамматике лексера (скопировано из примера в документации):

EOL : ('\r'? '\n')+ ; // any number of consecutive linefeeds counts as a single EOL

, а затем использовал это в грамматике парсера:

stmt_sequence : (stmt EOL)* ;

Парсер отклонил код с операторамиразделенные одной или несколькими пустыми строками.

Однако, это было успешно:

EOL : '\r'? '\n' ;

stmt_sequence : (stmt EOL+)* ;

Я новичок в ANTLR.Кажется, что оба должны работать.Есть ли что-то в жадном / несжатом сканировании лексера, которого я не понимаю?

Я пробовал это как с 3.2, так и с 3.4;Я использую ANTLR IDE в Eclipse Indigo на OS X 10.6.

Спасибо.

1 Ответ

0 голосов
/ 10 февраля 2012

Ошибка не была в исходной грамматике;но во входных данных.Я использовал редактор (в Eclipse), который автоматически вставлял вкладки после EOL, поэтому мои «пустые строки» не были действительно пустыми.

Я изменил грамматику следующим образом:

fragment SPACE: ' ' | '\t';

EOL : ( '\r'? '\n' SPACE* )+;

Эта грамматика работает, как и ожидалось.

Урок здесь заключается в том, что нужно быть осторожным с пробелами.Лексер может видеть пробелы во входных данных, которые синтаксический анализатор не видит (потому что он уже был отправлен в скрытый канал).

...