Java コンパイラ ツリー API を使用して、Java ソース ファイルの ast を生成しました。ただし、ソース ファイルのコメントにアクセスできません。
これまでのところ、ソース ファイルからコメントを抽出する方法を見つけることができませんでした..コンパイラ API または他のツールを使用する方法はありますか?
Java コンパイラ ツリー API を使用して、Java ソース ファイルの ast を生成しました。ただし、ソース ファイルのコメントにアクセスできません。
これまでのところ、ソース ファイルからコメントを抽出する方法を見つけることができませんでした..コンパイラ API または他のツールを使用する方法はありますか?
SD Javaフロントエンドは、AST(およびオプションでシンボルテーブル)を構築するJavaパーサーです。ツリーノードに直接コメントをキャプチャします。
Javaフロントエンドは、コンパイラ言語のフロントエンド(C、C ++、C#、COBOL、JavaScriptなど)のファミリのメンバーであり、これらはすべてDMS SoftwareReengineeringToolkitによってサポートされています。DMSは、変換の目的で言語を処理するように設計されているため、コメント、レイアウト、および形式をキャプチャして、元のレイアウトを可能な限り維持したままコードを再生成できます。
2012年3月29日編集:(ANTLRでこれを行うために投稿された回答とは対照的に)
DMSのASTノードに関するコメントを取得するには、DMS(lispのような)関数を呼び出します。
(AST:GetComments <node>)
ASTノードに関連付けられたコメントの配列へのアクセスを提供します。この配列の長さ(nullの場合もあります)について問い合わせるか、配列要素ごとに、次のプロパティのいずれかを要求できます:(AST:Get ... FileIndex、Line、Column、EndLine、EndColumn、String(正確なUnicodeコメントコンテンツ)。
CompilationUnitgetCommentList
のメソッドで取得したコメントにはコメント本文がありません。また、コメントは AST 訪問中に訪問されません。コメントにアクセスするには、コメント リストの各コメントに対してメソッドを呼び出します。accept
for (Comment comment : (List<Comment>) compilationUnit.getCommentList()) {
comment.accept(new CommentVisitor(compilationUnit, classSource.split("\n")));
}
コメントの本文は、単純なロジックを使用して取得できます。以下のコメント用の AST ビジターでは、初期化中に Complied クラス ユニットとクラスのソース コードを指定する必要があります。
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.BlockComment;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.LineComment;
public class CommentVisitor extends ASTVisitor {
CompilationUnit compilationUnit;
private String[] source;
public CommentVisitor(CompilationUnit compilationUnit, String[] source) {
super();
this.compilationUnit = compilationUnit;
this.source = source;
}
public boolean visit(LineComment node) {
int startLineNumber = compilationUnit.getLineNumber(node.getStartPosition()) - 1;
String lineComment = source[startLineNumber].trim();
System.out.println(lineComment);
return true;
}
public boolean visit(BlockComment node) {
int startLineNumber = compilationUnit.getLineNumber(node.getStartPosition()) - 1;
int endLineNumber = compilationUnit.getLineNumber(node.getStartPosition() + node.getLength()) - 1;
StringBuffer blockComment = new StringBuffer();
for (int lineCount = startLineNumber ; lineCount<= endLineNumber; lineCount++) {
String blockCommentLine = source[lineCount].trim();
blockComment.append(blockCommentLine);
if (lineCount != endLineNumber) {
blockComment.append("\n");
}
}
System.out.println(blockComment.toString());
return true;
}
public void preVisit(ASTNode node) {
}
}
編集:ソースの分割をビジターの外に移動しました。
記録のために。Java 8 では、コメントやドキュメントの詳細を操作するためのインターフェイス全体がここにあります。
ANTLRのJava文法など、別のツールを使用することもできます。javac
コメントは役に立たず、完全に破棄される可能性があります。IDEのようなツールが構築されているパーサーは、ASTにコメントを保持する可能性が高くなります。
getsourceposition()といくつかの文字列操作を使用して問題を解決することができました(正規表現は必要ありませんでした)