假设我的语法中有以下规则。
expr: expr op expr
| NUMBER
op: '+' | '-' | '*' | '/'我已经完成了以下声明
%token NUMBER
%left '+' '-'
%right '*' '/'这会导致4个shift-reduce冲突
State 12
4 expr: expr . op expr
4 | expr op expr .
'+' shift, and go to state 6
'-' shift, and go to state 7
'*' shift, and go to state 8
'/' shift, and go to state 9
'+' [reduce using rule 4 (expr)]
'-' [reduce using rule 4 (expr)]
'*' [reduce using rule 4 (expr)]
'/' [reduce using rule 4 (expr)]
$default reduce using rule 4 (expr)
op go to state 11但是,如果我将语法重写为
expr: expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| NUMBER优先级规则生效,冲突得到解决。我认为冲突的产生是因为当bison遇到op时,它不会跟踪转移到堆栈中的前一个op。有没有一种方法可以将所有运算符组合在一起,同时仍然解决冲突?
发布于 2013-01-25 10:45:42
显然,这里已经回答了这个问题,1。
通过对运算符进行分组,会丢失优先级信息。
https://stackoverflow.com/questions/14514424
复制相似问题