現在、boost spirit x3を使用してコンパイラを作成しようとしています。 私はパーサーを終了しました(セマンティックアクションとエラー処理なしで、今すぐastにパース)。 スコープと関数の呼び出しをサポートする言語を実装したいので、呼び出された関数が存在するかどうかをいつチェックするのですか? ast(ビルド時に現在のスコープにセマンティクアクションで解析中)が存在するかどうかを確認するか、astをコンパイルする際にこれをチェックすべきですか? スコープスタックと同じです。意味解析を使用してスコープスタックを構築するか、またはastをコンパイルするときにスコープスタックを構築する必要がありますか?boost spiritでの意味チェックx3
0
A
答えて
1
問題は明らかに不明です。
大部分は、実装している言語の性質に大きく依存します(スコープはどのようになっていますか、レキシカルスコープですか、クローズですか、動的スタックを持ちますか?静的?タイピング?)。
ASTを構築しながら(セマンティックアクションを解析中)関数は、現在のスコープ内に存在している場合、私は確認する必要があり、またはASTをcompileingながら、私はこれを確認する必要がありますか?
私が言ったように、両方ともはでした。私は通常Separation Of Concernsを勧めます。単純に構文解析し、その後AST(複数回)を操作するだけで、多くの場合、より洗練されたコードを簡単に拡張できるようになります。
状況に応じて(たとえば、変数に一部のキーワードや解析中の他のコンテキスト認識述語を隠す可能性がある場合など)は、たとえば、スコープ内に既知の識別子を持つシンボルテーブルを維持する。これは - IME - デザインの匂いを構成し、複雑さが必要かどうかを検討する必要があります。
スコープスタックと同じです。意味解析を使用してスコープスタックを構築するか、またはastをコンパイルするときにスコープスタックを構築する必要がありますか?
ここでも、コンパイルパスでの処理は、はるかに簡単です。
関連する問題
- 1. boost :: spirit :: x3でコンパイルエラー
- 2. Boost Spirit X3で "ストリーム"解析を行うには?
- 3. デフォルトのコンストラクタを使用しないBoost-Spirit(X3)解析
- 4. boost :: spirit :: x3の属性としてstd :: arrayを使用する
- 5. Spirit X3で始まる
- 6. boost :: spirit :: x3を使用してベクトル<boost :: string_view>を解析します。
- 7. boost :: spirit :: karma :: lit
- 8. Boost Spirit QI slow
- 9. Boost :: Spirit mini_cチュートリアル
- 10. boost :: spiritパーサーでのコンパイルエラー
- 11. boost :: spirit char/string mix
- 12. boost :: spirit :: lex&whitespaceのトラブル
- 13. boost :: spiritのスケーリングin assign_a
- 14. Boost :: Spiritの合成文法
- 15. boost spirit x3(A | A)の属性タイプは、Aの代わりに<A, ?>です
- 16. boost :: spiritのクラスv/s構造体
- 17. boost :: spirit :: qiと順序外変数
- 18. Boost :: Spiritを使用したカスタムスキップパーサー
- 19. boost :: spiritでdoubleのリストを解析する
- 20. boost :: spirit :: multi_passが述語と代替語でクラッシュする
- 21. boost :: spiritはBOOST_FUSION_ADAPT_STRUCTで問題をコンパイルします
- 22. boost :: filesystem :: filesystem_errorからエラーコードの意味を取得する方法
- 23. ブーストスピリットでコンパイル時間x3
- 24. スピリットX3:Ubuntuの16.04
- 25. boost spiritを使用しているときの内部コンパイルエラーx12
- 26. boost spirit:セマンティックアクションとフェニックスを使用する場合のパラメータタイプ
- 27. Boost :: Spirit:基本的な論理と表現の構文解析
- 28. ブーストスピリットX3とstd :: unordered_map
- 29. boost ::任意のデストラクタクラッシュ
- 30. nvccがboost :: spiritでCUDAファイルをコンパイルできないのはなぜですか?