Доброго всем дня.
Пытаюсь написать небольшой парсер, но не получается сделать грамотно error recovery.
Вкратце. Есть такая конструкция: ВЫРАЖЕНИЕ и СПИСОК ВЫРАЖЕНИЙ, разделенных ';'. Также есть БЛОК: список выражений, завершенный ';'.
expression_list
: expression
{ ... }
| expression_list ';' expression
{ ... }
// | error // this doesn't work
// { yyerrok; }
// | error ';' // this neither work
// { yyerrok; }
expression
: '{' expression_list ';' '}'
{ ... }
...
Хочется сделать error recovery, то есть при возникновении ошибки внутри выражения продолжить парсинг со следующего (того, что после ';').
Руки у меня оказались кривые, и при попытке сделать что-то вроде того, что закомментировано на предыдущем отрывке, парсинг следующего выражения продолжается уже не с чистого состояния, а уже как-то криво (то есть при парсинге программы со списком из одинаковых выражений с ошибкой первое выражение дает syntax error в нужном месте, а последующие уже нет).
Может, есть здесь кто-нибудь набивший руку на таких вещах, покажет на пальцах, как в принципе такое делается?
P.S. Доку по бизону почитал, но пока мне это не помогло.