- blogs:
- cles::blog
Eclipse の ASTParser を単体で使う
java eclipseちょっと Java プログラムの解析をしないといけないことになったので、 JavaCC をしばらくいじっていたのですが、どうもしっくり来ないのでなにか他に良い選択肢はないかなとしばらく考えていました。
以前に後輩がEclipseプラグインを作ったときには、けっこう良い具合にASTが出来ていたことを思い出したので、もしかしてEclipseのParserが単体で使えたりしないかなとちょっと調べてみたところ、 IBM のサイトで「EclipseのASTParserを試す」という記事をみつけました。残念ながらこの記事の内容はちょっと古く、 JLS2 (Java1.4) のプログラムしか解析できません。今回は JLS3 (Java5) 対応が必須だったのでこれは十分ではありません。
仕方がないので日本語のリソースを諦めて、 ASTParser の FQCN である org.eclipse.jdt.core.dom.ASTParser をキーワードにいろいろと検索して見ると、 JDT のメーリングリストの下記の議論で ASTParser を単独で動かすことができるという記述を見つけました。
[news.eclipse.tools.jdt] Re: Using ASTParser with binding resolving in a standalone application
Exactly. Simple AST parsing without binding resolving of Java source files as char[] works perfectly. These jars are needed in order to make this work outside the Eclipse context:
- org.eclipse.core.contenttype_3.2.100.v20070319.jar
- org.eclipse.core.jobs_3.3.1.R33x_v20070709.jar
- org.eclipse.core.resources_3.3.1.R33x_v20080205.jar
- org.eclipse.core.runtime_3.3.100.v20070530.jar
- org.eclipse.equinox.common_3.3.0.v20070426.jar
- org.eclipse.equinox.preferences_3.2.101.R33x_v20080117.jar
- org.eclipse.jdt.core_3.3.3.v_793_R33x.jar
- org.eclipse.osgi_3.3.2.R33x_v20080105.jar
結論から述べるとこの Tips は現在も有効で、自分の PC の Galileo から上記と同じ Jar (バージョンは新しくなっていますが)を取り出すことで ASTParser 単体での動作が可能でした。実際にビルドして、サンプルのプログラムからメソッドのシグニチャを取り出しているのが上記の画像になります。
抽象構文木はコンパイラの授業で習ったし、デザインパターンもきちんと理解しているつもりなので、理解するための素地は整っているとはいえ、普段は処理系とかあまり低レベルな処理に手を出していない人なのでこの作業は正直なかなかしんどかったです。珍しく夜を明かしてしまいましたが、まぁ実質6時間くらいでできたので、それでも省エネだったとは思いますが。
以下、作業メモを残しておきます。
† ASTParser を使うための参考資料
ASTParser の API の使い方については前述のIBMの記事の他、「JDT プラグイン・デベロッパー・ガイド - org.eclipse.jdt.core.dom」が非常に役立ちます。そのほかにデザインパターンの Visitor パターンをきちんと理解しているというのは大前提になりますが。
また、実際に Eclipse が AST をどのように生成しているかについては、「org.eclipse.jdt.astview - AST View」というプラグインを Eclipse にインストールすることでリアルタイムに表示させることが出来ます。開発中には上記のAPIとこのプラグインがとても参考になりました。
また、これも API の注意事項に書かれていることですがハマったのでメモしておきます。 AST にはコメントのノードは入っていません。CompilationUnit#getCommentList()を使って別途取り出す必要があります。
† 作成したサンプル
ビルドパスに追加したライブラリ*1
commons-lang-2.5.jar
org.eclipse.core.contenttype_3.4.1.R35x_v20090826-0451.jar
org.eclipse.core.jobs_3.4.100.v20090429-1800.jar
org.eclipse.core.resources_3.5.2.R35x_v20091203-1235.jar
org.eclipse.core.runtime_3.5.0.v20090525.jar
org.eclipse.equinox.common_3.5.1.R35x_v20090807-1100.jar
org.eclipse.equinox.preferences_3.2.301.R35x_v20091117.jar
org.eclipse.jdt.core_3.5.2.v_981_R35x.jar
org.eclipse.osgi_3.5.2.R35x_v20100126.jar
ASTTest.java(メインクラス)
MyVisitor.java(Visitorクラス)
Test.java(パース対象としたJavaファイル。先日のjjmltの時のものをちょっと改造)
- *1: commons-langはASTParserの動作には必須ではない。
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3567
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . Word で数式がグレーアウトされていて挿入できないときは(15759)
3 . アーロンチェアのポスチャーフィットを修理(12278)
4 . awk で指定した n カラム目以降を出力する(12159)
5 . 福岡銀がデマの投稿者への刑事告訴を検討中(10203)