由于空规则导致 bison 的转移/减少问题

问题描述 投票:0回答:1

我在野牛中有以下语法会产生移位/减少冲突:

%token  a

%start A
%% 

A: a B C | /* empty */
;
B: D E
;
E: D E | /* empty */
;
D: error
;
C: error
;

如何在不使用优先级的情况下重写语法?

bison context-free-grammar
1个回答
0
投票

这里的基本问题是你在C和D之间的错误恢复中有歧义。在恢复第一个错误1(作为D)之后,任何后续错误都可以恢复为C或D,这是不明确的.因此,您需要重新考虑您实际上正在尝试做什么——没有(非空)输入可以被无误地识别,所以它没有多大意义。


1实际上,您甚至无法从第一个错误中恢复过来,因为没有任何东西可以合法地跟在 D 之后,因此它会立即重新出错(并丢弃更多令牌)——最终结果是它将简单地丢弃输入的其余部分,然后返回解析失败。您可能可以通过明确设置

yyerrok
的操作获得更多信息,但不清楚重点是什么

© www.soinside.com 2019 - 2024. All rights reserved.