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