ANTLR - Почему неиспользуемые лексические правила влияют на функцию грамматики? - PullRequest
0 голосов
/ 25 июня 2019

Итак, я пытаюсь разобрать следующий текстовый файл:

    555 5555 

С этой грамматикой:

grammar PEntry;

entry               : Tab Number Nl;

Tab : '\t';
Nl : '\n';

Number          : Num RSp Num RSp;
//Name       : (RWord RSp)+;

fragment RWord      : (~[\p{Z}])+;
fragment Num        : [0-9]+;
fragment RSp        : [\p{Z}]+;

Через командную строку вот так:

grun PEntry entry test.txt -gui

Что меня отталкивает, так это то, что, если вы оставите правило имени закомментированным, оно прекрасно его проанализирует, но если правило имени не закомментировано, произойдет следующая ошибка:

line 1:0 mismatched input '\t555 5555 ' expecting '   '

Почему это происходит, когда имя даже не указано в целевом правиле (записи)? В неконтекстной грамматике любые неиспользуемые правила, на которые не ссылается переменная start, вообще отсутствуют в языке, так что же отличает antlr?

Обновление: (~ [\ p {Z}]) + должно было быть [~ \ p {Z}] +, но не должно ли это правило по-прежнему не влиять на грамматику? Я хочу знать, есть ли способ, которым antlr анализирует правила, которые отличают его от CFG.

1 Ответ

0 голосов
/ 25 июня 2019

Лексер работает независимо от парсера, он не знает, какие правила лексера используются парсером, а какие нет. Принцип работы лексера заключается в том, что он просматривает все правила лексера, которые вы определили 1 , а затем выбирает то, которое дает наибольшее совпадение на текущем входе (в случае связей он выбирает то, которое определено первым). ). Вот почему добавление нового правила лексера, особенно правила, которое приводит к длинным совпадениям, может изменить результат.

Весь анализатор работает в два этапа: лексер и фактический анализатор. Лексер превращает источник, представляющий собой последовательность символов, в последовательность токенов, а затем анализатор превращает последовательность токенов в дерево разбора, анализируя их в соответствии с правилом синтаксического анализа. Правила синтаксического анализа do действуют как CFG, но правила лексера не являются частью этого CFG. Вместо этого токены являются терминалами CFG, а правила токенов влияют только на процесс производства указанных токенов - процесс, который не зависит от правил синтаксического анализа.


1 Если вы не используете режимы, в этом случае он будет смотреть только на режимы в текущем режиме.

...