web-dev-qa-db-ja.com

AST Javaソースコードから生成する方法は?

私の知る限り、Java source-code to AST(Abstract Syntax Tree))を解析する唯一の方法は JavaコンパイラツリーAPI :com.Sun.source.tree

2つの質問があります。

  1. どのJDKがcom.Sun.source.treeをサポートしていますか?
  2. すべてのJDKで機能するポータブルな代替品はありますか?
37
Gili

おそらくtools.jarを取得して使用できます。 javacはオープンソースです なので、そのコードを取得できます(ライセンスを処理できると仮定)。 Antlr にはJavaの文法もあります。

8
TofuBeer

2番目の質問に関しては、Sunの他に数十のJavaパーサーが利用可能です。ここに小さなサンプルがあります:

  • Eclipseの org.Eclipse.jdt.core.dom パッケージ。
  • スプーン は、タイプ情報と変数バインディングを含む、非常に素晴らしい注釈付き解析ツリーを出力します(内部的にEclipseのパーサーを使用します)。
  • [〜#〜] antlr [〜#〜] はパーサージェネレーターですが、Javaの文法があります
  • javaparser (これは使用していません)

私の最善のアドバイスは、それぞれを試してみて、どれがあなたのニーズに最適かを確認することです。

23
Brett Daniel

私はEclipseのASTパーサーを使用しました。かなり良いことがわかりました(まあ、それはEclipseプラグインの一部だったので、それを使用する意味がありました)。参照 EclipseのASTParserを調べる

7
Jeremy Raymond

機能する、使いやすいJava Parser is ... JavaParser 。プロジェクトはすでに数年アクティブです。最初はGoogleコードでホストされていましたが、 GitHubで利用可能になりました: https://github.com/javaparser/javaparser

使い方はとても簡単で、依存関係の数は少ないです。 Mavenでも利用できます。

これは数年使用されているため、非常にうまく機能し、コメントも解析して、ASTを変更してコードを再生成することができます。

3

それが唯一の方法ではありません。

Javaフロントエンド をご覧ください。これは、フル機能のJava DMS Software Reengineering Toolkit)の上に構築されたパーサー です。Javaを解析します。 ASTを内部データ構造として構築します。

DMSのポイントは、多種多様な追加便利な機構(属性文法、シンボルテーブル、フロー分析、ASTアクセスと更新、およびソースからソースへの変換を含む操作)ASTを結果および/または変更されたソースコードに分析および変換します。 Javaパーサー(例:JavaCC + Java文法)、私見ですが、多くのことはできません。DMSを使用すると、多くの場合、そのような余分な機械をすべて自分で発明する必要はありません。

DMSが提供する追加の機構を本当に使用したくない場合は、 ツリーをXMLとしてダンプ します。

1
Ira Baxter

JexastJDTのASTParser から Eclipseに依存しない作業org.Eclipse.jdt.internal.compiler.**に依存)。

まだ試していませんが、面白そうです。

1
Esteban Küber