【问题标题】:Bison error recovery (panic-mode) not working?Bison 错误恢复(恐慌模式)不起作用?
【发布时间】:2019-02-13 19:17:32
【问题描述】:

我一直在阅读有关如何使 Bison 解析“抗错”的信息,似乎 pretty straightforward。不管where i've looked,它几乎都归结为same simple solution

然而,我一直无法让它工作,我看不到缺陷。解析器不断停止/退出,而不是继续/恢复...

我所拥有的基本上是处理所有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)

在我们想要忽略的这些情况下,解析器会正确启动 “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; }(我在某些情况下见过)

遗憾的是,我的尝试都没有成功...而且我一直收到相同的 “意外” 错误。我想知道在正确使用它之前是否必须配置一些东西...我注意到我的词法分析器文件中有%option nodefault 并尝试将其删除,但结果也相同。

【问题讨论】:

  • 您似乎正试图隐藏错误消息本身。你不能。错误产生是为了帮助 enoarser 从错误中恢复,通过帮助它丢弃输入而不是产生进一步错误。
  • 我不确定我是否理解,因为我认为使用error 令牌将允许解析继续(即停止进程退出)。我想要的行为是不可能的(即跳过不符合任何规则但有已知标记的行)?如果是这样,您能解释一下error 令牌的用途吗?
  • 为了让事情更清楚,我不想“隐藏错误消息本身”。我只想让解析器继续运行这些错误。

标签: c++ bison error-recovery


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 2015-10-20
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 2019-10-07
    • 2018-10-01
    • 2018-05-28
    相关资源
    最近更新 更多