2017-05-26 10 views
0

私はコンパイラデザインには新しく、Ravindrababu Ravulaによってseries of youtube videosを見てきました。抽象構文木(AST)の共通プロパティは何ですか?

私は楽しみのためにmy own languageを作成しています。私はそれを抽象構文木(AST)に解析しています。私の理解は、他の言語と同じ構造に従えば、これらの木は移植可能であるということです。

移植可能なASTを作成するにはどうすればよいですか?

サイドノート:

  1. 私のパーサは、現在、JavaScriptで書かれているが、私は、C#に移動することがあります。
  2. 私はSpiderMonkeyの指針を見てきました。それは良いアプローチですか?
+0

作成方法は?多くのパーサジェネレータは、ASTクラスを生成します。オフトピック。 – EJP

+0

@EJP私のコードへのリンクを提供しました:https://github.com/christo8989/erl。私はパースジェネレータが何であるか、それをどのように使用するのかはわかりません。今私のパーサーはjavascriptになっていますが、私はC#で書き直すかもしれません。 – christo8989

+0

@ EJP私は質問に話題を付け加えました。 – christo8989

答えて

2

移植性(ただし定義されている)は、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を調べる必要があります。これは、パーサーとスキャナのメンテナンスから多くの不具合を取り除くためです(実験を簡単にすることができます)。

関連する問題