Как лучше всего моделировать необязательные данные в yacc?У меня есть следующее утверждение:
StmtBlock : '{' VariableDeclList StmtList '}' { $$ = new StmtBlock($2, $3); }
;
Оба, VariableDeclList и StmtList являются необязательными (epsilon), поэтому я смоделировал их следующим образом:
VariableDeclList : VariableDeclList VariableDecl { ($$=$1)->Append($2); }
| { $$ = new List<VarDecl*>; }
и
StmtList : StmtList Stmt { ($$=$1)->Append($2); }
| { $$ = new List<Stmt*>; }
;
Единственная проблема - когда я думаю, что это вызывает сдвиг / уменьшение конфликтов.Когда я пытаюсь скомпилировать мой код, мой файл 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
...
Есть ли более правильный способ для моделирования этого?