文法に次の規則があると仮定します。
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
優先順位の規則が適用され、競合が解決されます。バイソンが に遭遇したとき、スタックにシフトされたop
前のものを追跡しないため、競合が発生すると思います。op
すべてのオペレーターをグループ化して競合を解決する方法はありますか?