Вам нужно дать yacc некоторые правила для восстановления после синтаксической ошибки и попытки продолжить.В вашей грамматике вы можете добавить правило вроде:
declaration: error ';'
Это правило позволит восстанавливаться после ошибок, обнаруженных при синтаксическом анализе объявления - анализатор будет сканировать ввод, пока не увидит ';'и сказать, что это конец декларации и попытаться продолжить оттуда.Вы также можете добавить такие правила, как:
struct_or_union_specifier
: struct_or_union IDENTIFIER '{' error '}'
| struct_or_union '{' error '}'
, чтобы перейти к следующему }
, когда вы столкнетесь с ошибкой в спецификаторе структуры.Вы можете поэкспериментировать с добавлением большего количества правил, но сложно определить, какое правило восстановления после ошибок будет использоваться в любой конкретной ситуации (yacc выдает состояния, пока не найдет правило, которое имеет действие для ошибки, поэтому вам действительно нужно понять состояниемашина, которую он собирает для вашего парсера)