0

文法に次の規則があると仮定します。

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すべてのオペレーターをグループ化して競合を解決する方法はありますか?

4

1 に答える 1

1

どうやら、これはここで答えられています1

演算子をグループ化すると、優先順位情報が失われます。

于 2013-01-25T02:45:42.110 に答える