2

C++ と flex + bison を使用した変数のスコープをサポートするカスタム C ベース言語用のコンパイラを作成しようとしています。レクサーとパーサーを作成しましたが、スコープの問題を解決できません。バイソンパーサーファイルにセマンティックアクションを実装しました。

while_stmt  :   WHILE LEFT_PAREN expr RIGHT_PAREN LEFT_CBRACE stmts RIGHT_CBRACE { $$ = new WhileStatement($3, *$6); }
            ;

私が問題を抱えているのは、新しいシンボル テーブルをコンテキスト シンボル テーブル スタックに配置するタイミングを見つけることです。ボトムアップのパーサーなので、新しいブロックがいつ開始されるか、いつ終了するか、リダクションが実行されてからでは手遅れです。ルールの後ろに置いたコードは、縮小後に実行されます。

バイソンを使用してこれをどのように解決できますか? 私はしばらくの間ブレインストーミングを行っていますが、解決策はありません。ありがとう。

4

1 に答える 1

2

コンパイラでは、スコープはセマンティック アクションであり、通常は解析レベルでは処理されませんが、セマンティック ツリー ウォーク中の後の段階で処理されます。

解析時にそれを実行しようとすると、説明した問題が発生します。解析は、トークンのシーケンスが文法と一致することを確認することのみを目的としています。他のすべては、解析時に作成された解析ツリーから実行する必要があります。

これはバイソン固有の質問ではありません。これは、任意のコンパイラとパーサー (文脈自由文法を使用するもの) に適用されます。

于 2015-07-12T19:11:57.800 に答える