2017-01-29 12 views
1

私はBisonを使用しています。私のCFGにはShiftを減らして競合を解消しています。Bison Shift Reduce Conflicts

これは私のコードです:

Decl  : vartype T_Identifier T_Semicolon { 
              // replace it with your implementation 
              Identifier *id = new Identifier(@2, $2); 
              $$ = new VarDecl(id, $1); 
              } 
     | vartype T_Identifier T_Equal primaryExpr T_Semicolon { 
                Identifier *id = new Identifier(@2, $2); 
                $$ = new VarDecl(id, $1, $4); 
          } 

     | function_prototype T_Semicolon {$$ = $1;} 
     ; 

私はシフトがこの特定のルールの競合を減らすことがあります。最後の行(function_prototype ...)の優先順位を最も高くしたいが、競合がシフトして別の状態になる。参考までに、 "function_prototype"は、 "vartype T_Identifier T_LeftParenth"の規則を持つ非終端記号です。これはbisonの出力ファイルです:

State 28 conflicts: 1 shift/reduce 
... 
state 28 

    4 Decl: vartype . T_Identifier T_Semicolon 
    5  | vartype . T_Identifier T_Equal primaryExpr T_Semicolon 
    11 fully_specified_type: vartype . 

    T_Identifier shift, and go to state 34 

    T_Identifier [reduce using rule 11 (fully_specified_type)] 
... 
state 34 

    4 Decl: vartype T_Identifier . T_Semicolon 
    5  | vartype T_Identifier . T_Equal primaryExpr T_Semicolon 

    T_Equal  shift, and go to state 36 
    T_Semicolon shift, and go to state 37 

状態34は「関数プロトタイプ」ルールをスキップします。この矛盾と優先順位の問題を解決するにはどうすればよいですか?

答えて

1

競合がDecl: vartype ...ルールとfully_specified_type: vartypeルールの間にある - 先読みがT_Identifierときvartypeを見た後、これはfully_specified typeであるかどうか分かりません。それで、それはDeclの単純なvartypeとして扱います(デフォルトの解像度)。

一般に、この種の問題は、物事を解析する方法を知るために複数のトークン先読みが必要な場合には通常問題ですが、fully_specified_typeルールに関連するものは何も表示しないため、修理する。おそらく、あなたの文法をリファクタリングする方法があります(たぶんfully_qualified_typeを取り除き、使用されているところなら直接vartypeを使ってください)。

関連する問題