私はC++アプリケーションを持っており、そのソースコードも持っており、.NetFramework上に構築されています。私が今探しているのは、ソースコードを入力として取得するツール(理想的には無料)であり、前処理または必要なプログラミングの後に、ASTやコールグラフ。私はJavaを使用してこのC++ソースコードを検査しているので、ソリューションがEclipseなどのプラグインのようなJava環境にあるとはるかに良いでしょう。私のニーズに合った利用可能なツールはありますか?皆さん、ありがとうございました。
6 に答える
NetBeansのCNDモジュールを使用して、JavaでC++を解析することに成功しました。それはまだお尻が醜いですが、おそらく生のANTLRを使用するよりも良いでしょう。まず、簡単にするためにhttp://netbeans.org/downloads/zip.htmlから「all-in-one」パッケージをダウンロードし(CNDは実際にはこれらすべてのクラスを必要としません)、現在のディレクトリのどこかに解凍します。次に、これが私が遊んでいるおもちゃのC++ヘッダーファイルです。
namespace foo {
int f(int p);
template<typename A> class bar {
void run(A) { }
};
}
そして、これがCNDでそれを解析する私の試みです:
import java.io.*;
import java.util.*;
import org.openide.filesystems.*;
import org.netbeans.modules.cnd.api.model.*;
import org.netbeans.modules.cnd.api.model.services.*;
import org.netbeans.modules.cnd.modelimpl.csm.*;
public class Foo {
public static void main(String[] args) throws Exception {
FileObject fo = FileUtil.toFileObject(new File(args[0]));
CsmStandaloneFileProvider fp = CsmStandaloneFileProvider.getDefault();
CsmModel model = CsmModelAccessor.getModel();
CsmModelState modelState = CsmModelAccessor.getModelState();
CsmFile cf = fp.getCsmFile(fo);
cf.scheduleParsing(true);
Collection<CsmOffsetableDeclaration> c = cf.getDeclarations();
c = ((CsmNamespaceDefinition)c.toArray()[0]).getDeclarations();
for (CsmOffsetableDeclaration d : c) {
if (d instanceof CsmFunction) {
CsmFunction f = (CsmFunction)d;
System.out.print(f.getQualifiedName() + " " + f.getName() + "(");
Collection<CsmParameter> pp = f.getParameters();
for (CsmParameter p : pp) {
System.out.print(p.getType().getClassifierText());
}
System.out.println(")");
} else if (d instanceof ClassImpl) {
ClassImpl cls = (ClassImpl)d;
System.out.println("Got template? " + cls.isTemplate());
List<CsmTemplateParameter> lt = cls.getTemplateParameters();
for (CsmTemplateParameter t : lt) {
System.out.println(t.getQualifiedName() + " " + t.getName());
}
Collection<CsmMember> cm = cls.getMembers();
for (CsmMember m : cm) {
CsmFunction f = (CsmFunction)m;
System.out.print(f.getQualifiedName() + " " + f.getName() + "(");
Collection<CsmParameter> pp = f.getParameters();
for (CsmParameter p : pp) {
System.out.print(p.getType().getClassifierText());
}
System.out.println(")");
}
}
}
}
}
クラスパスに追加する必要のあるJARファイルの量は非常に多く、これを処理するためのより良い方法が必要ですが、これは今のところ機能します。
$ export CLASSPATH=netbeans/platform/modules/org-netbeans-modules-editor-mimelookup.jar:netbeans/platform/modules/org-netbeans-modules-queries.jar:netbeans/dlight/modules/org-netbeans-modules-dlight-libs-common.jar:netbeans/ide/modules/org-netbeans-modules-projectapi.jar:netbeans/platform/modules/org-netbeans-api-progress.jar:netbeans/platform/modules/org-openide-windows.jar:netbeans/platform/modules/org-openide-text.jar:netbeans/platform/modules/org-openide-awt.jar:netbeans/platform/lib/org-openide-modules.jar:netbeans/platform/modules/org-openide-nodes.jar:netbeans/platform/modules/org-netbeans-modules-masterfs.jar:netbeans/platform/core/org-openide-filesystems.jar:netbeans/platform/lib/org-openide-util.jar:netbeans/platform/lib/org-openide-util-lookup.jar:netbeans/platform/modules/org-openide-loaders.jar:netbeans/cnd/modules/org-netbeans-modules-cnd-api-model.jar:netbeans/cnd/modules/org-netbeans-modules-cnd-api-project.jar:netbeans/cnd/modules/org-netbeans-modules-cnd-model-services.jar:netbeans/cnd/modules/org-netbeans-modules-cnd-modelimpl.jar:netbeans/cnd/modules/org-netbeans-modules-cnd-modelutil.jar:netbeans/cnd/modules/org-netbeans-modules-cnd-utils.jar:netbeans/cnd/modules/org-netbeans-modules-cnd-repository.jar:netbeans/cnd/modules/org-netbeans-modules-cnd-repository-api.jar:netbeans/cnd/modules/org-netbeans-modules-cnd-apt.jar:netbeans/cnd/modules/org-netbeans-modules-cnd-source.jar:netbeans/cnd/modules/org-netbeans-modules-cnd-antlr.jar:.
$ javac Foo.java
$ java Foo Foo.h
そして、それは以下を出力します:
foo::f f(int)
Got template? true
foo::bar::A A
foo::bar::run run(A)
ところで、EclipseCDTと同様のことができ ます。Javaを使用したCヘッダーファイルの解析/読み取り
あなたはdoxygenに興味があるかもしれません、それはソースコードに基づいてドキュメントを生成する無料のツールです。追加の作業をしなくても、コールグラフ、継承図、コラボレーション図、およびその他の多くの便利なツールを生成できます。
純粋なJavaで実装され、たった 2 つの jarであるEclipse パーサーを使用できます。使用方法の詳細を説明しました。リンクを参照してください: https://stackoverflow.com/a/27496664/955857
上記のリンクには、Eclipse パーサーを抽象化して構造を単純化するプロジェクトもあります (ただし、すべてのケースに適合するわけではありません)。
Xogastanをチェックするべきだと思います。C++用のASTをXMLドキュメントとして生成します。Xogastanには多くの世代のオプションがあります。
ご挨拶、
編集:Javaと直接接続されていませんが、外部ツールとして使用して、生成されたXMLを分析できます。
要件によっては、Synopsis が興味深いものになる可能性があります: http://synopsis.fresco.org/
これは、ソース コード (C/C++/Python/IDL) を解析し、抽象構文グラフを生成するモジュラー ツールです。グラフは、API を介してトラバースできます (または、たとえば、ソース ドキュメントを生成するために他の概要モジュールに渡すことができます)。Synopsis は C++ と Python の API を提供しますが、残念ながら Java API はありません - しかし、Jython (またはもちろん JNI ;-) を介して Java から使用できると思います。