Сброс буфера ввода Flex после ошибки

Я использую flex & bison для анализа пользовательского языка, и я в ситуации, описанной здесь: http://www.gnu.org/software/bison/manual/html_node/How-Can-I-Reset-the- Parser.html. Чтобы быть более точным

Я вызываю yyparse несколько раз, и на правильном вводе он работает правильно; но когда обнаруживается ошибка синтаксического анализа, все остальные вызовы также терпят неудачу. Как сбросить флаг ошибки yyparse?

Мой анализатор и сканер запускаются внутри отдельного потока, но есть только один поток, который работает с входным файлом. По моему мнению, мне не нужно писать повторный сканер, так как только один поток работает с входным файлом. На этой странице проблема четко объясняется, но решение мне не ясно. В нем говорится:

Поэтому, всякий раз, когда вы меняете ****, вы должны сообщить сканеру Lex-генерации отказаться от своего текущего буфера и переключиться на новый. Это зависит от вашей реализации Lex; см. его документацию. Для Flex достаточно вызвать "YY_FLUSH_BUFFER" после каждого изменения в ****. Если ваш Flex-сгенерированный сканер должен читать из нескольких потоков ввода для обработки таких функций, как include файлы, вы можете использовать функции Flex, такие как `yy_switch_to_buffer, которые управляют несколькими входными буферами

Моя ветка парсера вызывает yyparse, чтобы построить мой АСТ. Мне не ясно, когда и где я должен позвонить yy_flush_buffer, чтобы исправить эту проблему. По моему мнению, код сканера (сгенерированный Flex) вызывается кодом парсера (сгенерированным Bison). Сгенерированный код Bison генерируется грамматикой. В результате код парсера не находится под моим прямым контролем. Это означает, что я не могу включить вызов yy_flush_buffer в код парсера, поскольку он будет перезаписываться каждый раз, когда я генерирую код парсера по грамматике. Это означает, что я должен поместить файл yy_flush_buffer в файл grammr. Но где?

1 ответ

Я исправил проблему, выполнив:

...
FILE *f = fopen(_filename, "r");
yyrestart(f);
yyparse();
...

Я оставляю вопрос, поскольку он может быть полезен другим людям.

licensed under cc by-sa 3.0 with attribution.