在下面的简单语法中,在状态 4 的冲突中,'shift' 是否可以在不改变规则的情况下成为采取的行动?(我认为默认情况下 shift 是野牛的首选动作)
%token one two three
%%
start : a;
a : X Y Z;
X : one;
Z : two | three;
Y : two | ;
%%
shift 是 bison 的首选操作,您可以在状态输出中看到它将two
在状态 4 中转换。它仍然会报告 shift-reduce 冲突,但如果您愿意,可以将其作为警告。(请参阅%expect
。)您最好修正语法:
start : a;
a : X Z | X Y Z;
X : one;
Y : two;
Z : two | three;
Shift 是默认设置,但这会导致生成的解析器为输入提供错误,one two
因此这可能不是您想要的。相反,请遵循 rici 的建议并修正语法。