При использовании yacc / bison ошибка синтаксического анализа переводит инструмент в режим устранения ошибок, если это возможно.Он попытается сбросить токены на пути к «чистому» состоянию.
Мне не удалось найти ссылку на lemon, поэтому я не могу показать какой-нибудь лимонный код, чтобы это исправить, но с yacc / bison можно использовать правила здесь .
А именно, вам нужно настроить правило ошибки, чтобы заявить, что анализатор в порядке с yyerrok
, чтобы он не сбрасывал токены.Затем он попытается перечитать «плохой» токен, поэтому вам нужно очистить его с помощью yyclearin
.Наконец, поскольку правило, прикрепленное к вашему коду ошибки, содержит содержимое вашего токена, вам необходимо настроить функцию, которая корректирует ваш стек ввода, беря текущее содержимое токена и создавая новый (правильный) токен с тем же содержимым.
Например, если грамматика, определенная как MyOther, MyOther увидела MyTok MyOther:
stack
MyTok: "the text"
MyOther: "new text"
stack
MyOther: "the text"
MyOther: "new text"
Чтобы выполнить это, посмотрите на использование yybackup .Я не могу найти альтернативный метод, хотя yybackup
осуждается.