0

我一直在阅读有关如何使 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在我的词法分析器文件中有并尝试删除它,但也有相同的结果。

4

1 回答 1

0

这篇文章在这里让我对问题可能是什么有了一些了解。在某些情况下,问题的发生是因为“错误规则”中的停止条件未得到满足,在他的情况下,这是因为解析器忽略/跳过了换行符 ( '\n')。所以规则:

错误 '\n' { yyerrok; yyclearin; }

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

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

于 2019-02-20T14:20:13.333 回答