Восстановление бизонов (panic-mode) не работает? - PullRequest
0 голосов
/ 13 февраля 2019

Я читал о том, как сделать синтаксический анализ 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 и попытался удалить его, но у меня тоже был тот же результат.

1 Ответ

0 голосов
/ 20 февраля 2019

Этот пост здесь дал мне немного понимания того, в чем может быть проблема.В некоторых случаях проблема возникает из-за того, что условие остановки в «правиле ошибки» не выполняется, что в его случае было потому, что синтаксический анализатор игнорировал / пропускал перевод строки ('\n').Итак, правило:

error '\ n' {yyerrok;yyclearin;}

никогда бы не сработало ... (поскольку '\n' никогда не захватывалось)

Таким образом, я выделил ошибку между двумя известными токенами, чтобы исключить эту возможность, но все еще получилОшибка.После более подробного изучения я обнаружил, что проблема заключалась в функции yyerror, которая вызывала выход из программы.

...