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/*}表达式”)”
。在中还可以找到更多有用的信息。您发布的语法没有冲突,因此您看到的冲突来自您在发布中遗漏的语法的其他部分。。。