Bison 如何摆脱野牛

Bison 如何摆脱野牛,bison,yacc,reduce-reduce-conflict,Bison,Yacc,Reduce Reduce Conflict,我的代码如下: %% %token blablabla %% expresion: operand operand '-' expresion |operand '+' expresion | '(' expresion ')' /*Conflict line*/ ; /*terminal symbols */operand: IDENTIFIER { printf (" %s ", $1)

我的代码如下:

%%
%token blablabla
%%

expresion:  operand
            operand '-' expresion
           |operand '+' expresion
           | '(' expresion ')'  /*Conflict line*/
;

/*terminal symbols */operand: IDENTIFIER                { printf (" %s ", $1) ; } 
                             | NUMBER                   { printf (" %s ", $1) ; }
       ;
我在编译时收到3条reduce/reduce警告(即使代码运行正确)。我怎样才能摆脱这些警告呢?

我想是你想要的

     %left '-' '+'


     expression : operand
                 | expression '-' expression
                 | expression '+' expression
                 | '(' expression ')'

PS:reduce来自第二句,当我放置其他内容时,它们不会出现。生产树如何终止?例如,你的终端表达式是什么?我对Bison很生疏,但我记得当两个或多个规则可以应用于同一个输入时,会发生reduce/reduce错误。您的代码运行正确,因为Bison只选择了第一条有效的规则,并遵循该规则。你能告诉我们你想解析什么吗?这些规则本身没有任何问题。也许您可以检查bison生成的.output文件,并查看冲突涉及哪些规则。代码的主要问题是,它无法匹配任何内容,因为对于
expresion
,没有非递归规则。然而,这不是您描述的问题,所以我必须假设您在这里发布的代码不是您真正的代码。因此,请解决这个问题。虽然这应该是可行的,但没有理由在语法中编码优先级而不是使用
%left
会导致冲突。这将解决OP代码中的一系列其他问题,但无论是什么原因导致了真正代码中的冲突,都可能不是因为缺少
%left
s。这在这种情况下不起作用,@sepp2k当然是真正的代码,不是全部代码,因为复制和粘贴400行代码是没有意义的,而其余的代码是完全独立的模块。@user1920212正如我已经告诉过你的,你在这里发布的代码包含与冲突无关的错误,在修复这些错误后,代码工作正常(除了我已经提到的无关问题)没有冲突。因此,不,因此它不是您的真实代码,也不能代表您的真实代码。