私は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は「関数プロトタイプ」ルールをスキップします。この矛盾と優先順位の問題を解決するにはどうすればよいですか?