yaccでオプションのデータをモデル化する最良の方法は何ですか?オプションの非終端子をサポートするyaccコードを構成する方法
StmtBlock : '{' VariableDeclList StmtList '}' { $$ = new StmtBlock($2, $3); }
;
どちらも、VariableDeclListとStmtListはオプション(イプシロン)されているので、次のように私はそれらをモデル化:私は、次のステートメントを持っている
VariableDeclList : VariableDeclList VariableDecl { ($$=$1)->Append($2); }
| { $$ = new List<VarDecl*>; }
と
StmtList : StmtList Stmt { ($$=$1)->Append($2); }
| { $$ = new List<Stmt*>; }
;
唯一の問題はときです私はこれがshift/reduceの衝突を引き起こすと思います。私のコードをコンパイルしようとすると、y.ouputファイルは次のようになります。
State 74 conflicts: 1 shift/reduce
...
state 74
38 StmtBlock: '{' VariableDeclList . StmtList '}'
39 VariableDeclList: VariableDeclList . VariableDecl
T_Bool shift, and go to state 2
T_Int shift, and go to state 3
T_Double shift, and go to state 4
T_String shift, and go to state 5
T_Identifier shift, and go to state 8
T_Identifier [reduce using rule 18 (Epsilon)]
$default reduce using rule 18 (Epsilon)
VariableDecl go to state 80
Variable go to state 13
Type go to state 34
Epsilon go to state 81
StmtList go to state 82
...
これをモデル化するより適切な方法はありますか?
クリスの提案に感謝します。最初の提案でポストチェックをどうやってやるのか、正しい方向に向けることができますか? – blcArmadillo