Я читал о том, как сделать синтаксический анализ Bison «устойчивым к ошибкам», и кажется, довольно просто .Неважно, где я посмотрел , это в значительной степени сводится к тому же простому решению .
Тем не менее, я не смог заставить его работать, и яне вижу недостатокПарсер продолжает останавливаться / выходить, а не продолжать / восстанавливать ...
То, что у меня есть, - это правило для обработки всех keywords
(и их паттернов), например:
keywords:
key1_rule
| key2_rule
| key3_rule
;
И над этим у меня есть file
правило итератора:
file:
%empty
| file keywords
;
У меня проблема в том, что иногда ключевые слова используются в шаблоне, который не обрабатывается, но это не проблемапотому что мы не хотим фиксировать эти случаи (и просто хотим их игнорировать).Например:
Мы фиксируем шаблон:
KEY1 NAME KEY2 VALUE
Мы хотимигнорировать:
KEY1 NAME KEY3 KEY2 VALUE
или
KEY2 VALUE
(KEY2 не предшествует KEY1)
В этих случаях, которые мы хотим игнорировать, синтаксический анализатор правильно запускает ошибку «неожиданный токен» .В приведенном выше примере ошибка будет "Parse error: syntax error, unexpected KEY3"
(или "Parse error: syntax error, unexpected KEY2"
).
Итак, из того, что я видел, я решил, что решение будет таким же простым, как использование токена error
, например, так:
file:
%empty
| file keywords
| file error
;
Я также пытался *:
keywords:
key1_rule
| key2_rule
| key3_rule
| keywords error
;
*, а также пытался: error '\n'
и error '\n' { yyerrok; }
(что я видел в некоторых случаях)
К сожалению, ни одна из моих попыток не увенчалась успехом ... и я продолжаю получать одну и ту же "неожиданную" ошибку.Интересно, есть ли что-то, что мне нужно настроить, прежде чем я смогу правильно его использовать ... Я заметил, что у меня есть %option nodefault
в моем файле lexer и попытался удалить его, но у меня тоже был тот же результат.