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

Compiler construction 转移减少中间规则行动中的冲突野牛,compiler-construction,grammar,bison,bnf,shift-reduce-conflict,Compiler Construction,Grammar,Bison,Bnf,Shift Reduce Conflict,我有以下语法,可以让我三个班次减少冲突: boolexpression: boolexpression OR boolterm | boolterm ; boolterm: boolterm AND boolfact | boolfact; boolfact: "!" "(" boolexpression ")"

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

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 ")";
boolexpression:boolexpression或boolterm
|布尔特姆;
布尔特姆:布尔特姆和布尔法特
|野性;
boolfact:!(“boolexpression”)“
|“(“boolexpression”)”
|布尔侧
|表达式boolop表达式
boolop:“| BOOLOPLEQ/*=*/| BOOLOPEQ/*=*/| BOOLOPEQ/*!=*/;
表达式:sum;
总和:总和“+”项
|总和“-”项
|术语;
术语:术语“*”系数
|术语“/”因子
|因素;
因子:ID
|数
|“({/*生成IR/*}表达式的规则”)”;

当我删除
{/*规则以生成IR/*}
时,一切正常

此冲突是因为在
规则之后立即有一个中间规则操作(“
因子”
中的“
”。在这种情况下,您不能这样做,因为缩减
boolfact-->”(“boolexpression”)“
因子-->(“{/*规则生成IR/*}表达式”)
都包含
”(“
标记作为他们识别的第一个标记。因此,当野牛识别出一个
“(“
”)时,它不知道应该简化为哪个规则


一种解决方案是将
{/*规则以生成IR/}
放在
表达式
之后(“{/rules以生成IR/*}表达式”)”
。在中还可以找到更多有用的信息。

您发布的语法没有冲突,因此您看到的冲突来自您在发布中遗漏的语法的其他部分。。。