当 Yacc/Bison 中存在 shift/reduce 冲突时,是否可以强制冲突完全按照您的意愿解决?换句话说:是否可以明确强制它优先考虑转变或减少?
对于我所阅读的内容,如果您对默认分辨率感到满意,您可以告诉生成器不要抱怨它。我真的不喜欢这样,因为它混淆了你的理性选择。
另一种选择是重写语法以解决问题。我不知道这是否总是可能的,而且这通常会使它更难理解。
最后,我已经阅读了优先规则可以解决这个问题。我无能为力地尝试了很多方法,但我无法让它发挥作用。是否可以为此使用优先规则?如何?
虽然我的模棱两可的语法非常不同,但我可以使用Bison 手册中的经典 if-then-else来举一个具体的例子:
%token IF THEN ELSE variable
%%
stmt:
expr
| if_stmt
;
if_stmt:
IF expr THEN stmt
| IF expr THEN stmt ELSE stmt
;
expr:
variable
;