2013-02-01 22 views
6

javaファイルの解析にtools.jar(つまりJavaCompiler)のjavacを使用しています。私はTreePathScannerの実装を使用してソースを解析します。これまでのところ、インポート、パッケージ名、クラス名、メソッド名、指示などを解析できるので、すべてがうまくいくようです...javacツールパーサーを使用してJavaファイルからインラインコメントを読み取る方法は?

インラインでのコメントがあります。作成されたASTツリー、またはそれらを訪問しました。しかし、私はjavadocのコメントをクラスやメソッドなどに読み込むことはできますが、インラインコメントはありません。

最良の方法でインラインコメントを読むにはどうすればよいですか?私はnetbeansのソースコードを見ています(これも解析用のjavacを使用しています)が、簡単には何も見つかりません。

私の必死の解決策は、ソースファイルのステートメントの位置を使用し、次に2つのステートメント間のすべてのコメントを手動で解析することです。または同様のことですが、2つのツリーノード間です。

もっと良い解決法を知っている人はいますか?ありがとうございました!

+0

com.sun.tools.javac.main.JavaCompilerには、デフォルトでfalseに設定されたkeepCommentsフラグがいくつかあります。それはあなたが使ってみたいことですか?それを変更しようとしましたか? – jdb

+0

はい、私はすでにこれを真にしていましたが、何の違いに気付かなかった。 – igr

答えて

4

できません。コンパイラはそれらを投げ捨てる。コンパイラは常にそれを行います。 Javaコンパイラは、Javadocのコメントを捨てないのは、Javadocがコンパイラを使ってそれらを見つけ、Javadocの人たちがコンパイラの人たちと一緒になったからです。

+0

これは本当です。 javacのソースと 'Scanner'クラスのソースを確認しました。デバッグメッセージを単に出力する' protected void processComment(CommentStyle style) 'メソッドがあります。私はそれを無効にすることができるかどうかを調べるつもりです。 – igr

+0

** JavaCompiler **を使用せず、** Scanner **および** Parser **クラスのみを使用してパーサーを実行できました。 'processComment'メソッドをオーバーライドすることができましたが...このメソッドは、コメントが処理され、コメントのタイプとそれ以上のもの(値、位置などの情報)を与えます。 – igr

+0

btw、それは日食ASTコンパイラがコメントを保存するようだ。 – igr

1

"コンパイラーパーサー"と "リエンジニアリングパーサー"の主な違いは、リテラルのレイアウト、コメント、および形式についてどのような情報が取り込まれているかにあります。他の人が見てきたように、ほとんどのコンパイラは、低レベルのコードにコンパイルするのは難しいので、この情報をすべて放棄します。

同様に、古典的なパーサジェネレータ(JavaCC、ANTLRなど)は、この情報のキャプチャリング/再生成をほとんどサポートしていません。

リエンジニアリングパーサーは、対照的にコードのコメントを分析するために使用され、時にはコードを失うことなく(または適切にコメントを修正して)コードを改訂するためにも使用されます。コメントを含むコード分析の場合、コメントを捨てることはできません: - コード変更の場合、元のコードに基づいて変更されたコードを再生成すると、変更されたコードがコードレイアウト、コメント、およびリテラルの "フォーマット"(例小数のリテラルを10進値として再定義することは合法であり、同等ですが、元の作者はかなり不幸になります)。これを行うには、リエンジニアリングパーサーは、このデータをすべてキャプチャして、それを捨てない機械を解析する特別なレクサーが必要です。

私たちのDMSソフトウェアリエンジニアリングツールキットには、汎用機械としてのリエンジニアリングパーサーが含まれています。 DMSベースのパーサーは、多種多様な言語(OPのJavaへの関心を含む)に対応しています。 DMSはすべてのコメント/レイアウト/書式設定情報を取得します。分析ツールはすべてそれにアクセスできます。

TXLとStrategoもこれをサポートしています。

関連する問題