Как получить «ожидаемый токен» в GLR-парсере bison / yacc? - PullRequest
1 голос
/ 12 июля 2011

Как получить 'ожидаемый токен' в GLR-парсере bison / yacc?

Привет,

В проекте, который я делаю, есть несколько неоднозначных грамматических правил.Поэтому я пытаюсь использовать% glr-parser для решения конфликтов сдвига / уменьшения.

Когда я использовал синтаксический анализатор не-GLR, я могу использовать yystate (глобальную переменную), чтобы получить «ожидаемый токен», когдаобнаружить синтаксическую ошибку. Но после переключения на анализатор GLR, я считаю, что это больше не глобальная переменная.

Итак, мой вопрос: есть ли вообще получить "ожидаемый токен" в GLR-парсере при синтаксической ошибке?

1 Ответ

1 голос
/ 26 февраля 2015

Правильно, что в синтаксическом анализаторе GLR нет действительной yystate информации, и поэтому не может быть простого решения «ожидаемого токена».

Чтобы понять, почему нужно понимать разницу между синтаксическим анализатором LALR по умолчанию и алгоритмами синтаксического анализа GLR.Это хорошо задокументировано здесь: http://www.delorie.com/gnu/docs/bison/bison_11.html. По сути, GLR (Обобщенный LR) выполняет несколько параллельных потоков, каждый из которых пробует разные неоднозначные альтернативы для поиска соответствия.Когда ни один из них не совпадает, синтаксический анализ не выполняется, и вы находитесь в ситуации синтаксической ошибки.Поэтому не может быть ни одного ожидаемого токена, но может быть много ожидаемых токенов.Вот почему это неоднозначно.Хороший документ, объясняющий, как работает синтаксический анализатор бизонов, находится здесь: http://www.cs.uic.edu/~spopuri/cparser.html,, который объясняет функцию переменной yystate при синтаксическом анализе без GLR.

Метод создания лучшего сообщения об ошибке для синтаксического анализатора GLRлучше всего освещено в ответе @ rici на этот вопрос: Дополнительное сообщение об синтаксической ошибке в анализаторе GLR, когда синтаксис неоднозначен ;и во многих отношениях этот вопрос действительно является дубликатом этого вопроса.

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

...