0

現在、boost spirit x3を使用してコンパイラを作成しようとしています。 私はパーサーを終了しました(セマンティックアクションとエラー処理なしで、今すぐastにパース)。 スコープと関数の呼び出しをサポートする言語を実装したいので、呼び出された関数が存在するかどうかをいつチェックするのですか? ast(ビルド時に現在のスコープにセマンティクアクションで解析中)が存在するかどうかを確認するか、astをコンパイルする際にこれをチェックすべきですか? スコープスタックと同じです。意味解析を使用してスコープスタックを構築するか、またはastをコンパイルするときにスコープスタックを構築する必要がありますか?boost spiritでの意味チェックx3

答えて

1

問題は明らかに不明です。

大部分は、実装している言語の性質に大きく依存します(スコープはどのようになっていますか、レキシカルスコープですか、クローズですか、動的スタックを持ちますか?静的?タイピング?)。

ASTを構築しながら(セマンティックアクションを解析中)関数は、現在のスコープ内に存在している場合、私は確認する必要があり、またはASTをcompileingながら、私はこれを確認する必要がありますか?

私が言ったように、両方ともでした。私は通常Separation Of Concernsを勧めます。単純に構文解析し、その後AST(複数回)を操作するだけで、多くの場合、より洗練されたコードを簡単に拡張できるようになります。

状況に応じて(たとえば、変数に一部のキーワードや解析中の他のコンテキスト認識述語を隠す可能性がある場合など)は、たとえば、スコープ内に既知の識別子を持つシンボルテーブルを維持する。これは - IME - デザインの匂いを構成し、複雑さが必要かどうかを検討する必要があります。

スコープスタックと同じです。意味解析を使用してスコープスタックを構築するか、またはastをコンパイルするときにスコープスタックを構築する必要がありますか?

ここでも、コンパイルパスでの処理は、はるかに簡単です。

関連する問題