2010-12-18 8 views
2

私は独占的言語用のASTを構築する方法を理解しようとしています。 ASTを構築する必要があるので、ソースコードのエラーの可能性をチェックするためのルールとガイドラインを作成することができます。独自言語のASTを構築するにはどうすればよいですか?

ASTを構築するにはどうすればよいですか?私が始めるのに役立つ本、記事がありますか?コンパイラのドラゴンブックは助けてくれますか?

私は非CSバックグラウンドから来ていることに注意してください。

ありがとうございました

+1

コンパイラの基本的な質問:[コンパイラの作成を学ぶ](http://stackoverflow.com/q/1669/2509) Crenshawチュートリアル(コード生成は直ちに実行されるため、ASTはありません...)を除いて、そこに表示されているものはすべて動作します。 – dmckee

答えて

2

これはかなり大きな質問です。私はあなたの苦痛を感じます。私も非CSの背景からこの問題に取り組んでいます。私はCSの方がずっと感謝しています。

あなたの研究では、EBNF(Extended Backus-Naur Form)が多分あなたによく見られるでしょう。それは基本的にあなたの言語を記述する方法です。あなたの言語用のEBNFを作成すると、それを解析するためにコンピュータが必要とするものを頭で囲むのに役立ちます。

手元の問題に戻る:おそらく、レクサー/パーサーを使用してツリーを構築しています。

これを行うために使用する伝統的なツールは、lexとyacc、あるいはやや近代的ないとこのフレックスとバイソンです。

新しいアプローチはAntlrです。それは非常にお勧めしますが、私の頭の上にあった。

私が見つけた第3のアプローチは、Pythonのpyparsingライブラリです。これは私がPythonに精通していることと、解析するために必要なものを記述する読みやすい方法のために私が最終的に行ったものです。

パイピングのために利用できるplenty of examplesがあり、助けになりました。私がパーサーを構築するのに最も役に立つと分かったものはSimpleCalcでした。しかし、これはかなり古いバージョンのpyparsingに基づいており、後で実装されるpyparsingの強力な操作のいくつかと比べて複雑です。 SimpleArithは似ていますが新しいバージョンです。

私がまだ実際にはpyparsingで処理していないことの1つは、構文エラーを適切に分析することです。しかし、あなたがそうするために必要なツールを提供しているようです。

これは本当にあなたの質問に対する完全な答えではありませんが、私はそれが少なくともいくつかの場所であなたを指し示すことを願っています。複雑な言語のパーサーを構築するのは簡単ではありません!

+0

おそらく、Pythonの文脈自由文法を見て、それらがどのように機能するかを見ていくことも役に立つでしょう。 Pythonは他のほとんどのパワフルな言語よりもシンプルで(より強力です)、どこからでもほとんどのものを許可します(例えば、 'if'ブロック内の' class'、 'class'の' if'の中の 'def')。これは助けてもよく、妨げてもよい。 –

+0

ANTLRが良いです。詳細情報が必要です – codeanalyser

+1

パーサーを作成するのが最も簡単です。アナライザを構築するのが難しいのは何ですか。人々はこれを理解していないようです。 –

1

コード解析エンジンは、通常、ASTを構築するだけでなく、非常に多くの洗練を必要とします。

深刻なコード分析を行うには、コード内の識別子の意味とそれらの定義方法(シンボルテーブル)を知っている必要があります。また、プログラムの周りをどのように情報が移動するかを知る必要がありますデータフロー分析)。これらのすべてをサポートするための機械が必要です。その機械を独自の言語に結びつける必要があります。

エベレストをアナロジーとして登場させると思います。 ASTを取得することは、10,000フィートのベースキャンプに行くようなものです。基本的な技術(ハイキングブーツ)を使用して丘を歩くだけで、どんな塊もできます。最後の17,000フィートを登るには、技術、コミットメント、プランの種類がまったく違っていて、最初の10,000フィートを歩いた大部分の人は、残りの旅行の準備ができていません。 (私はここでいくつかの経験がある、私のバイオをチェックする)。

これらはすべてかなり詳細なトピックであり、あなたのCSバックグラウンドがないと、あなたの道がかなり粗くなるでしょう。 (しかし、私たちはすべてどこかで始まるので、これは本当に野心の問題です)。ドラゴンの本は、この機械が何をするのか、それがなぜ必要なのかを理解するのに役立つ優れた資料です。他の多くの細かいコンパイラの書籍が存在し、一般的には同様に機能します。しかし、深刻な読書をする準備ができている必要があります。

カーブを上げる1つの方法は、このようなツールを構築する際に経験を積んだ多くのコンピュータ科学者によって、この機械の多くがすでに考え出され実装されているツールを使用することです。それであなたの問題はかなり軽減されます。必要なものを理解しようとするのではなく、提供されたものを使う方法を学ぶだけで、必要なサポート機械をすべて実装するだけです。

ANTLR(すでに言及したように、かなり良いCS教授によって行われました)は、構文解析機能を提供し、ASTの構築方法と結果として生じるASTを手続き的に乗り越える方法を定義できます。しかしそれはあなたの仕事に必要なことを他にはあまり提供しません。

私たちのDMS Software Reengineering Toolkitは、最初の段落で述べたすべての機能を備えています。 DMSを使って作業することに気付く最初の違いの1つは、文法を提供することだけです。あなたの助けを借りずにASTを構築します。

このexample of DMS applied to high school algebra and calculusでは、DMSでどのような作業をしているのかを知ることができます。特に、代数/微積分のための単純な文法の使用を簡単に定義でき、その言語の「プログラム」を操作する方法を示しています。このアプリケーションは、コードを分析するのではなく "変換する"ものですが、基本は同じです。

独自の言語を分析した「実際の」DMSアプリケーションは、かなり複雑になります。

関連する問題