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

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

Hi,

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

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

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


person user789265    schedule 12.07.2011    source источник


Ответы (1)


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

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

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

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

person Brian Tompsett - 汤莱恩    schedule 26.02.2015