我一直在阅读如何使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
并试图删除它,但结果也相同。
答案 0 :(得分:0)
这篇帖子here使我对可能出现的问题有一些了解。在某些情况下,由于不满足“错误规则”中的停止条件而发生问题,在这种情况下,这是因为解析器忽略/跳过了换行符('\n'
)。因此,规则:
错误'\ n'{yyerrok; yyclearin; }
永远不会工作...(因为从未'\n'
被捕获)
因此,我隔离了2个已知令牌之间的错误,以排除这种可能性,但仍然收到错误。经过更多调查后,我发现问题出在yyerror
函数内部,导致程序退出。