Bison 错误恢复(恐慌模式)不起作用?

Bison error recovery (panic-mode) not working?

我一直在阅读如何使 Bison 解析 "error resistant",看起来 pretty straightforward. No matter where i've looked, it pretty much comes down to the same simple solution

然而,我一直无法让它工作,而且我看不到缺陷。解析器保留 stopping/exiting 而不是 continuing/recovering...

我所拥有的基本上是一条处理所有 keywords(及其模式)的规则,例如:

keywords:
    key1_rule
    | key2_rule
    | key3_rule
;

在它上面,我有我的 file 迭代器规则:

file:
    %empty
    | file keywords
;

我遇到的问题是,有时关键字在未处理的模式中使用,但这不是问题,因为我们不想捕获这些情况(只想忽略它们) .例如:

在这些情况下我们想忽略,解析器会正确地启动一个 "unexpected token" 错误。在上面的示例中,错误将是 "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; }(我在某些情况下见过)

遗憾的是,我的 none 次尝试都成功了...而且我不断收到相同的 "unexpected" 错误。我想知道在能够正确使用它之前我是否必须配置一些东西...我注意到我的词法分析器文件中有 %option nodefault 并尝试删除它,但结果也一样。

这个 post here 让我对问题可能是什么有了一些了解。在某些情况下,问题的发生是因为 "error rule" 中的停止条件不满足,在他的情况下是因为解析器是 ignoring/skipping 换行符 ('\n')。所以规则:

error '\n' { yyerrok; yyclearin; }

永远不会工作...(因为 '\n' 从未被捕获)

因此,我隔离了 2 个已知标记之间的错误以排除这种可能性,但仍然出现错误。进一步调查后,我发现问题出在导致程序退出的 yyerror 函数中。