私はシェーディングエンジン用のコンパイラを書いていますが、ステートメントの解析部分に到達するまで、すべてが正常に機能していました。
クラスで定義された抽象構文ツリーを使用して、すべての作業を実行しました(タイプチェックと中間コード生成を簡素化するため)。したがって、祖先クラスASTNode
と、、などのすべての子孫クラスがありASTFloat
ます。ASTExpression
ASTIdentifier
.y
ファイルでは、一般的な方法でASTを構築できます。
nexp:
T_LPAR nexp T_RPAR { $$ = $2; }
| nexp OP_PLUS nexp { $$ = new ASTBExpression('+', (ASTExpression*)$1, (ASTExpression*)$3); }
| nexp OP_MINUS nexp { $$ = new ASTBExpression('-', (ASTExpression*)$1, (ASTExpression*)$3); }
| nexp OP_TIMES nexp { $$ = new ASTBExpression('*', (ASTExpression*)$1, (ASTExpression*)$3); }
そしてそれは非常にうまく機能しますが、それから私はこの方法でスコープのステートメント(例えばifステートメントの本体)を生成しようとしました:私は遭遇した各ステートメントでパーサーによって埋められなければならないASTStatements
リストを持つクラスを使用しました。ASTNode*
したがって、アプローチは次のようになります。
statements:
statement { if ($$ == null) $$ = new ASTStatements(); ((ASTStatements*)$$)->addStatement($1); } statements { $$->generateASM(); }
;
問題は、アイテムがステートメントのブロックごとに1回だけ初期化される必要があるということですが、それを行う方法がわかりません。使用は私が試したハックですが、それまでの内容が含まれている可能性がif ($$ == null)
あるため、機能しません。yylval
バイソンを使用してこの種の状況を処理するための通常の/最良の方法はどれですか?