转移减少中间规则行动野牛的冲突
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.
中还可以找到更多有用的信息
我有以下语法可以减少三班次冲突:
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.