Токен «error» на самом деле не является токеном. Используется только для обработки ошибок.
На http://dinosaur.compilertools.net/yacc/index.html вы можете прочитать: Ошибка имени токена зарезервирована для обработки ошибок и не должна использоваться наивно.
В моем собственном парсере я использую токен ошибки, подобный этому (для разбора C-подобного макроязыка:
StatementList :
| StatementList Statement ';'
| error ';'
Если пользователь делает ошибку, yacc / bison будет продолжаться до следующей точки с запятой (конец инструкции), а затем продолжит работу со следующей инструкцией.