7

私はC++アプリケーションを持っており、そのソースコードも持っており、.NetFramework上に構築されています。私が今探しているのは、ソースコードを入力として取得するツール(理想的には無料)であり、前処理または必要なプログラミングの後に、ASTやコールグラフ。私はJavaを使用してこのC++ソースコードを検査しているので、ソリューションがEclipseなどのプラグインのようなJava環境にあるとはるかに良いでしょう。私のニーズに合った利用可能なツールはありますか?皆さん、ありがとうございました。

4

6 に答える 6

4

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ヘッダーファイルの解析/読み取り

于 2012-10-13T06:54:58.480 に答える
4

あなたはdoxygenに興味があるかもしれません、それはソースコードに基づいてドキュメントを生成する無料のツールです。追加の作業をしなくても、コールグラフ、継承図、コラボレーション図、およびその他の多くの便利なツールを生成できます。

http://www.doxygen.nl/

于 2012-10-12T19:17:35.687 に答える
1

純粋なJavaで実装され、たった 2 つの jarであるEclipse パーサーを使用できます。使用方法の詳細を説明しました。リンクを参照してください: https://stackoverflow.com/a/27496664/955857

上記のリンクには、Eclipse パーサーを抽象化して構造を単純化するプロジェクトもあります (ただし、すべてのケースに適合するわけではありません)。

于 2014-12-16T02:54:41.657 に答える
0

Xogastanをチェックするべきだと思います。C++用のASTをXMLドキュメントとして生成します。Xogastanには多くの世代のオプションがあります。

Xogastanホーム

ご挨拶、

編集:Javaと直接接続されていませんが、外部ツールとして使用して、生成されたXMLを分析できます。

于 2012-10-12T19:39:40.073 に答える
0

要件によっては、Synopsis が興味深いものになる可能性があります: http://synopsis.fresco.org/

これは、ソース コード (C/C++/Python/IDL) を解析し、抽象構文グラフを生成するモジュラー ツールです。グラフは、API を介してトラバースできます (または、たとえば、ソース ドキュメントを生成するために他の概要モジュールに渡すことができます)。Synopsis は C++ と Python の API を提供しますが、残念ながら Java API はありません - しかし、Jython (またはもちろん JNI ;-) を介して Java から使用できると思います。

于 2012-10-12T19:35:09.170 に答える