2012-10-12 8 views
5

Ich habe eine C++ - Anwendung und ich habe auch den Quellcode davon und es wurde auf .Net-Framework gebaut. Was ich jetzt suche, ist ein Werkzeug (idealerweise frei), das meinen Quellcode als Eingabe erhält, und nach einiger Vorverarbeitung oder einiger erforderlicher Programmierung gibt mir eine Zwischenrepräsentation der strukturellen Abhängigkeit der Quellcodeelemente, wie ein AST oder ein Anrufdiagramm. Ich arbeite mit Java, um diesen C++ - Quellcode zu inspizieren, also wäre es viel besser, wenn die Lösung in Java-Umgebung wie ein Plugin für Eclipse oder etwas ist. Gibt es ein verfügbares Werkzeug, das meinem Bedarf entspricht? danke euch allen.C++ - Quelltext in Java-Umgebung analysieren

+0

Im schlimmsten Fall könnten Sie C++ - Tools verwenden: http://stackoverflow.com/a/2318476/839436 –

+0

Eclipse und Netbeans haben Open-Source-Plugins für C++. Du könntest mit denen anfangen. –

+0

Es ist eine "einfache Sache" der Implementierung eines C++ Parsers. (Leider ist C++ eine der hässlichsten Architekturen, die es zu parsen gibt.) –

Antwort

4

Sie könnten an Doxygen interessiert sein, es ist ein kostenloses Tool, das Dokumentation basierend auf Quellcode generiert. Ohne zusätzliche Arbeit auf Ihrer Seite können Sie Anrufdiagramme, Vererbungsdiagramme, Kollaborationsdiagramme und viele andere nützliche Tools erstellen.

http://www.stack.nl/~dimitri/doxygen/

0

Je nach Bedarf könnte Synopsis für Sie interessant sein: http://synopsis.fresco.org/

Dies ist ein modular aufgebautes Werkzeug, das Quellcode (C/C++/Python/IDL) und generiert eine abstrakte Syntax Graph parst . Der Graph kann über eine API durchlaufen werden (oder er kann an andere Synopsis-Module übergeben werden, um beispielsweise eine Quellendokumentation zu erzeugen). Synopsis bietet C++ - und Python-APIs, leider keine Java-API - aber ich nehme an, es könnte von Java über Jython (oder JNI natürlich ;-)) verwendet werden

0

Ich denke, dass Sie Xogastan überprüfen sollten. Es generiert AST für C++ als XML-Dokument. Xogastan hat viele Möglichkeiten der Generierung.

Xogastan home

Grüße,

EDIT: Es ist nicht direkt mit Java verbunden ist, aber Sie können es als ein externes Tool verwenden können, und dann erzeugt XML analysieren.

3

Ich hatte Erfolg beim Parsen von C++ in Java mit dem CND-Modul von NetBeans. Es ist immer noch hässlich, aber wahrscheinlich besser als roher ANTLR oder was auch immer. Laden Sie zuerst das "All-in-One" -Paket von http://netbeans.org/downloads/zip.html zur Vereinfachung herunter (CND benötigt nicht wirklich alle diese Klassen) und entpacken Sie es wie im aktuellen Verzeichnis. Als nächstes ist hier eine ++ Header-Datei Spielzeug C I mit gespielt haben:

namespace foo { 

int f(int p); 

template<typename A> class bar { 
    void run(A) { } 
}; 

} 

mit CND mein Versuch, Und hier ist bei Parsen, dass:

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(")"); 
       } 
      } 
     } 
    } 
} 

Die Menge der JAR-Dateien müssen wir auf die hinzufügen classpath ist ziemlich groß, und es muss ein besserer Weg, damit umzugehen, aber das funktioniert jetzt:

$ 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 

und das gibt die folgenden:

012 BTW
foo::f f(int) 
Got template? true 
foo::bar::A A 
foo::bar::run run(A) 

, können wir etwas Ähnliches mit Eclipse CDT tun: Parsing/reading C-Header files using Java

0

Samuel Audet ist richtig! aber er vermisst JAR-Dateien. Sie müssen die folgenden JAR-Dateien hinzufügen: org-netbeans-modules-cnd-indexing.jar, org-netbeans-modules-parsing-lucene.jar, org-netbeans-libs-lucene.jar und lucene-core-3.5. 0.jar.

1

können Sie den Eclipse-Parser verwenden, die in reinem Java und sind nur 2 Gläser umgesetzt wird. Ich habe gegeben Einzelheiten, wie die Verbindung zu verwenden, finden Sie unter:
https://stackoverflow.com/a/27496664/955857

Der Link oben hat auch ein Projekt, das eine Abstraktion von Eclipse Parser bringt eine einfachere Struktur macht (aber nicht passen alle Fälle)