Bison 错误恢复(恐慌模式)不起作用?
Bison error recovery (panic-mode) not working?
我一直在阅读如何使 Bison 解析 "error resistant",看起来 pretty straightforward. No matter where i've looked, it pretty much comes down to the same simple solution。
然而,我一直无法让它工作,而且我看不到缺陷。解析器保留 stopping/exiting 而不是 continuing/recovering...
我所拥有的基本上是一条处理所有 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 not preceded by 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; }
(我在某些情况下见过)
遗憾的是,我的 none 次尝试都成功了...而且我不断收到相同的 "unexpected" 错误。我想知道在能够正确使用它之前我是否必须配置一些东西...我注意到我的词法分析器文件中有 %option nodefault
并尝试删除它,但结果也一样。
这个 post here 让我对问题可能是什么有了一些了解。在某些情况下,问题的发生是因为 "error rule" 中的停止条件不满足,在他的情况下是因为解析器是 ignoring/skipping 换行符 ('\n'
)。所以规则:
error '\n' { yyerrok; yyclearin; }
永远不会工作...(因为 '\n'
从未被捕获)
因此,我隔离了 2 个已知标记之间的错误以排除这种可能性,但仍然出现错误。进一步调查后,我发现问题出在导致程序退出的 yyerror
函数中。
我一直在阅读如何使 Bison 解析 "error resistant",看起来 pretty straightforward. No matter where i've looked, it pretty much comes down to the same simple solution。
然而,我一直无法让它工作,而且我看不到缺陷。解析器保留 stopping/exiting 而不是 continuing/recovering...
我所拥有的基本上是一条处理所有 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 not preceded by 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; }
(我在某些情况下见过)
遗憾的是,我的 none 次尝试都成功了...而且我不断收到相同的 "unexpected" 错误。我想知道在能够正确使用它之前我是否必须配置一些东西...我注意到我的词法分析器文件中有 %option nodefault
并尝试删除它,但结果也一样。
这个 post here 让我对问题可能是什么有了一些了解。在某些情况下,问题的发生是因为 "error rule" 中的停止条件不满足,在他的情况下是因为解析器是 ignoring/skipping 换行符 ('\n'
)。所以规则:
error '\n' { yyerrok; yyclearin; }
永远不会工作...(因为 '\n'
从未被捕获)
因此,我隔离了 2 个已知标记之间的错误以排除这种可能性,但仍然出现错误。进一步调查后,我发现问题出在导致程序退出的 yyerror
函数中。