【发布时间】: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