Как правило, вы хотите использовать правила восстановления после ошибок в файле yacc / bison.Лучше иметь только одно или два правила ошибок верхнего уровня, а не множество правил ошибок в конечных продуктах, поскольку на самом деле правильная повторная синхронизация в листовом праве очень трудна.
Самый простой подход для языка, похожего на Javaдолжно иметь просто правило вроде:
BlockStatement: error ';'
В этом случае, если вы получите какую-либо синтаксическую ошибку при синтаксическом анализе оператора, синтаксический анализатор просто выбросит входные токены, пока не достигнет ;
и действовать так, как будто он только что завершил утверждение.Это работает адекватно для ошибок, ДРУГИХ, чем отсутствующий ;
в конце блока.