2009-09-16 10 views
11

Javaソースコードを生成する必要があります。抽象構文木をモデリングし、実際のソースコードテキストを生成するツリーウォーカーを作成します。これまでずっと良い。Javaコード解析ツリーの生成とテスト用の評価

私のASTコードは少し古いので、注釈やジェネリックはサポートされていません。だから私は、コード生成の必要性を伴う将来のプロジェクトに使用するオープンなプロジェクトを探しています。これが実際の問題の原因です。生成されたコードが正しい動作をしていることをテストします。

ここでは、Javaソースコードを生成してコンパイルし、そのコードに対してテストを実行する代わりに、実際にASTを評価するアイデアを得ました。評価者は単体テストをスピードアップし、メソッドのように生成されたコードの小さな部分を評価し、「単位」をより合理的にすることができます。

これまでのところ、現代的な(java5と6の機能のサポート)ASTベースのコード生成ソリューションであると思われるcom.sun.codemodelプロジェクトが見つかりました。

私はASTの部分を直接評価できる別のプロジェクトがあるかどうかは誰でも知っています(単一の生成されたメソッドなど)。

+1

興味深い質問がありましたら、私たちは今答えがほしいと思っています:-) – KLE

+1

私はちょうどそのメソッドのコードを生成し、コンパイルしてテストします。インタプリタの作成はかなりの作業です。 –

+0

javacが解析木や中間表現などを出力するオプションはありませんか? (型解決、クラスルックアップ、Ira Baxterが答えたところによる)。 –

答えて

2

で詳細情報を取得することができます

、あなたは(「この識別子の範囲が何であるか?それはどのような種類がありますか?」)だけでなく、それに伴って行くすべての意味解析を必要とします通訳として。

意味解析を行うには、完全な名前解決(シンボルテーブル構築)と型解決(式が見つかった文脈で式が有効であるという表現型と検証の判定が必要です。 )、実際の方法はFOOを参照ん だけでなく、クラスのルックアップ(?)

ことで、あなたは実行順に木の上にクロールによってインタプリタの構築を検討することができます。また、ストレージマネージャを構築する必要があります。完全なガベージコレクタを実行する必要はないかもしれませんが、何かが必要になります。実際に何かを実行したい場合は、 の.classファイルも必要です。つまり、パーサー (クラスファイルの名前とタイプの解決も必要です)が必要です。

Eclipseにすべてのものが含まれているかどうかはわかりません(少なくとも、あなたが無料で入手できるストレージマネージャの部分はあります)。オリジナルの設計がJava開発をサポートしていたことを考えると、私はそれを期待していますが、何年もの間、多くのツールに非常に失望しています。

DMS Software Reengineering Toolkitも多くの言語を処理するプログラム解析/変換です。構文解析、AST構築、シンボルテーブルの作成と名前解決、型解決、コールグラフの作成(仮想関数呼び出しの解決に必要)、名前解決で起動する.classファイルリーダーを含む完全なJava front endを持っています。そうすれば、通訳者を育成するための良い基礎となるでしょう。

DMSでも任意のASTを作成してからソースコードを生成することができるので、コード生成の終了も処理できます。

[DMSが存在する理由は「非常に失望している」部分]です。

2

これはあなたが探しているものかどうかわかりませんが、EclipseのJDTプロジェクトはJava AST(Java 5および6の機能を含む)について非常によく見ています。これは、コードの表示/書き換え(必ずしも生成ではない)のための一連のユーティリティとツールを備えています。それらはすべてEclipse Public Licenseの下でライセンスされています。あなたは、Javaを評価するためにhttp://eclipse.org/jdt/

+1

ええ、それとSunのコードモデルは、ASTを構築してコードを生成するための最良の選択肢のようです。しかし、さらに私が望むのは、AST(コンパイルされたJavaに続くセマンティクス)を解釈する能力です。 – Christian

+0

JDT Core(http://www.eclipse.org/jdt/core/index.php)は、「スクラップブック・ページまたはデバッガ・コンテキストの評価サポート」を宣言しています。 Methinks私はそれを見て与えるだろう... –

関連する問題