野牛错误恢复(紧急模式)不起作用?

时间:2019-02-13 19:17:32

标签: c++ bison error-recovery

我一直在阅读如何使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)

在这些情况下,我们想忽略它们,解析器会正确地引发“意外令牌” 错误。在上面的示例中,错误将为"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; }(在某些情况下我已经看到过)

可悲的是,我的尝试都没有成功...而且我一直遇到相同的“意外” 错误。我不知道是否需要配置一些才能正确使用它...我注意到我的lexer文件中有%option nodefault并试图删除它,但结果也相同。

1 个答案:

答案 0 :(得分:0)

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

  

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

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

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