移植性(ただし定義されている)は、ASTを構築する際の主な目標ではありません。外部ASTの使用を可能にする明確なインターフェースを提供するコンパイラー・フレームワークはほとんどありません。特定のAST構造は、ひどく文書化され、予告なしに変更される傾向があります。
ASTは、使用されている特定の構文解析戦略だけでなく、言語の構文の詳細に非常に結びついています。コンパイル、linting、きれいな印刷、インタラクティブな編集、静的解析などの複数のタスクに対してASTを再利用できるのは便利ですが、これらの異なるユースケースの相反する要求は複雑さを増しがちです。特に言語開発の初期段階では、迅速なプロトタイプ作成のための幅を広げたいと考えています。
移植可能なASTの最も魅力的な理由は、他の言語をターゲットとして使用することです。これにより、コード生成などのコストを節約できます。実際には、通常、他の言語のテキスト表現を生成する方が簡単ですパーサーが外国のASTを使用するよりも、自分のASTの言語を使用することができます。さらにうまく文書化された仮想マシン(LLVM、.Net IL、JVMなど)をターゲットにすることは、Cコードの生成よりもはるかに重要ではありません。
LLVM Kaleidoscope tutorialを参照してください(2番目のセクションでは、C++で実装されていますが、ASTについて説明しています)。また、this question on a sister site興味深い読書を見つけるかもしれません。最後に、Javascriptで実装を行う場合は、少なくともjison parser generatorを調べる必要があります。これは、パーサーとスキャナのメンテナンスから多くの不具合を取り除くためです(実験を簡単にすることができます)。
作成方法は?多くのパーサジェネレータは、ASTクラスを生成します。オフトピック。 – EJP
@EJP私のコードへのリンクを提供しました:https://github.com/christo8989/erl。私はパースジェネレータが何であるか、それをどのように使用するのかはわかりません。今私のパーサーはjavascriptになっていますが、私はC#で書き直すかもしれません。 – christo8989
@ EJP私は質問に話題を付け加えました。 – christo8989