Обнаружение/восстановление ошибок в YACC/Bison

Я читал руководства об использовании символа ошибки, yyerrok и т. д. Меня беспокоит, как добавить правила ошибок в синтаксический анализатор, не переусердствуя или не добавляя достаточно.

Есть ли какие-либо общие рекомендации, которым я должен следовать, учитывая, что я буду анализировать упрощенную программу Java? Должно ли каждое правило содержать какое-либо обнаружение/восстановление ошибок? Существует ли простейший подход, который успешно справляется с этими задачами? Я ищу только синтаксические ошибки на данный момент.

Спасибо за любой/все ответы заранее.


person Leif    schedule 28.02.2012    source источник


Ответы (1)


Как правило, в файле yacc/bison следует экономно использовать правила восстановления после ошибок. Лучше иметь только одно или два правила обработки ошибок верхнего уровня, а не множество правил обработки ошибок в конечных продуктах, так как на самом деле правильная ресинхронизация в листовом правиле очень сложна.

Самый простой подход к языку, подобному Java, состоит в том, чтобы иметь такое правило, как:

BlockStatement: error ';'

В этом случае, если вы получите какую-либо синтаксическую ошибку при анализе оператора, синтаксический анализатор просто отбросит входные токены, пока не дойдет до ;, и будет действовать так, как будто он только что завершил оператор. Это работает адекватно для ошибок, ДРУГИХ, чем отсутствующий ; в конце блока.

person Chris Dodd    schedule 28.02.2012