Очистка состояния парсера сгенерированного бизоном - PullRequest
2 голосов
/ 22 октября 2008

Я использую лексер C, сгенерированный Flex, и синтаксический анализатор C ++, сгенерированный Bison. Я изменил синтаксический анализатор, чтобы принимать только строковый ввод.

Я вызываю функцию парсера yyparse() в цикле и читаю построчно вводимые пользователем данные. Я останавливаю цикл, если вход «выход».

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

Работает нормально, если ввод действителен и соответствует правилу парсера.

При синтаксической ошибке я переопределил функцию yyerror(), которая отображает простое сообщение об ошибке.

Как очистить состояние анализатора, когда входные данные не соответствуют ни одному правилу синтаксического анализатора, чтобы на следующей итерации анализатор запускался заново?

Ответы [ 2 ]

2 голосов
/ 22 октября 2008

Согласно моей книге Lex & Yacc есть функция yyrestart (файл).

Остальное (и я цитирую абзац книги:

Это означает, что вы не можете перезапустить лексер, просто вызвав yylex (). Вы должны сбросить его в состояние по умолчанию, используя BEGIN INITIAL, отбросить любой вводимый текст, буферизованный с помощью unput (), и иначе организовать так, чтобы следующий вызов input () начал читать новый ввод.

0 голосов
/ 22 октября 2008

Интересный вопрос - у меня есть синтаксический анализатор, который можно скомпилировать с помощью Bison, Byacc, MKS Yacc или Unix Yacc, и я не делаю ничего особенного, чтобы справиться с сбросом грамматики, если она выйдет из строя или удастся. Я не использую токенайзер Flex или Lex; это кодирование вручную, но оно работает строго от строк. Итак, я должен согласиться с Gamecat; наиболее вероятная причина проблемы - лексический анализатор, а не сам синтаксический анализатор.

(Если вы хотите получить мой код, вы можете загрузить SQLCMD с веб-сайта IIUG (Международная группа пользователей Informix). Хотя для полного продукта требуется Informix ESQL / C, грамматика в принципе может , может быть преобразован в отдельную тестовую программу. К сожалению, похоже, что я не запускал этот тест некоторое время - есть некоторые проблемы с компиляцией теста. Некоторые имена элементов структуры изменились в апреле 2006 года, плюс есть проблемы с сцеплением. Мне нужно будет реорганизовать код, чтобы грамматика могла быть снова протестирована автономно.)

...