转移减少中间规则行动野牛的冲突

Shift reduce conflicts in mid rule action bison

我有以下语法可以减少三班次冲突:

boolexpression:         boolexpression OR boolterm 
                        | boolterm ;

boolterm:              boolterm AND boolfact
                        | boolfact;

boolfact:               "!" "(" boolexpression ")"
                        | "(" boolexpression ")"
                        | BOOLLITERAL
                        | expression boolop expression

boolop:                 "<"| ">"| BOOLOPLEQ /* <= */ | BOOLOPGEQ /* >= */ | BOOLOPEQ /* == */ | BOOLOPNEQ /* != */; 

expression:             sum ;

sum:                    sum "+" term         
                        | sum "-" term      
                        | term ;

term:                 term "*" factor
                        | term "/" factor 
                        | factor;

factor:                 ID        
                        | NUMBER       
                        | "(" {/* rules to generate IR/*} expression ")";

当我删除 {/* rules to generate IR/*} 时,一切正常。

此冲突是因为您在 factor 规则的 "(" 之后立即执行了中间规则操作。在这种情况下,您不能这样做,因为缩减 boolfact --> "(" boolexpression ")"factor --> "(" {/* rules to generate IR/*} expression ")" 都包含 "(" 标记作为它们识别的第一个标记。所以当bison识别出一个"("时,它不知道要归约到哪个规则

一个解决方案是将 {/* 生成 IR/<em>} 的规则放在 中的 <code>expression 之后"(" {/规则生成IR/*}表达式")";。在 https://www.gnu.org/software/bison/manual/html_node/Mid_002dRule-Conflicts.html#Mid_002dRule-Conflicts.

中还可以找到更多有用的信息