1

これは[ファイル名]からの抜粋です。出力状態94

   32 expr: expr . opt_at_type '.' TYPEID '(' opt_expr_list ')'
   39     | expr . '+' expr
   40     | expr . '-' expr
   41     | expr . '*' expr
   42     | expr . '/' expr
   42     | expr '/' expr .
   44     | expr . '<' expr
   45     | expr . LE expr
   46     | expr . '=' expr

    '@'  shift, and go to state 73

    '.'       reduce using rule 23 (opt_at_type)
    '.'       [reduce using rule 42 (expr)]
    $default  reduce using rule 42 (expr)

    opt_at_type  go to state 74

opt_at_typeは次のように定義されます。

    opt_at_type:
            { $$ = idtable.add_string("SELF_TYPE"); }
            |       '@' TYPEID
            { $$ = $2;   }
            ;

なぜそれが起こっているのか教えてくれませんか?

4

2 に答える 2

1

あなたが直面している問題は、yaccの優先順位レベルがシフト/リデュースの競合を解決するためにのみ考慮され、reduce/reduceではないということです。この場合、opt_at_typeルールは空の文字列(オプション)と一致する可能性があり、reduce/reduceの競合が発生します。

これを修正するには、ルールをアンファクタリングしてイプシロンの生成を取り除く必要があります。

expr: expr '.' TYPEID '(' opt_expr_list ')'
    | expr '@' TYPEID '.' TYPEID '(' opt_expr_list ')'
    | expr '+' expr
       :

イプシロンの生成がなければ、早期のリデュースは必要ないため、競合はシフト/リデュースの競合になり、通常はyaccの優先順位で解決できます。

于 2012-11-13T17:32:09.067 に答える
0

バイソンが次のことを確認したとき:

expr '/' expr '.'

これが次のように等しいかどうかはわかりません。

1) expr opt_at_type '.'

また

2) expr '/' expr opt_at_type '.'

1)最初に減少expr '/' exprexpr、2)/*空*/をopt_at_type最初に減少します。

したがって、あいまいさを発見しました。それを解決するには、必要な構文を決定する必要があります。1つの解決策は、最初のexprルールを別のルールにして、次のように他の式の中で使用できないようにすることです。

typeexpr: expr opt_at_type '.' TYPEID '(' opt_expr_list ')'
于 2012-11-13T17:14:46.827 に答える