2012-10-12 10 views
5

Mam aplikację C++, a także mam jej kod źródłowy i został on zbudowany na platformie .Net. to, czego teraz szukam, to narzędzie (najlepiej bezpłatne), które pobiera mój kod źródłowy jako dane wejściowe, a po pewnym wstępnym przetwarzaniu lub jakimś wymaganym programowaniu daje mi jedną pośrednią reprezentację strukturalnej zależności elementów kodu źródłowego, takich jak AST lub wykres połączeń. Pracuję z java, aby sprawdzić kod źródłowy C++, więc byłoby znacznie lepiej, gdyby rozwiązanie było w środowisku java, jak wtyczka do eclipse lub coś podobnego. czy istnieje jakieś dostępne narzędzie dostosowane do moich potrzeb? dziękuję wszystkim.parsowanie kodu źródłowego C++ w środowisku java

+0

Najgorszy przypadek, można użyć narzędzi C++: http://stackoverflow.com/a/2318476/839436 –

+0

eclipse i netbeans mają wtyczki open source dla C++. Możesz zacząć od tych. –

+0

To "prosta sprawa" implementacji parsera C++. (Niestety, C++ jest jedną z najbrzydszych architektur do przeanalizowania). –

Odpowiedz

4

Być może zainteresuje Cię doxygen, to darmowe narzędzie, które generuje dokumentację na podstawie kodu źródłowego. Bez dodatkowej pracy z twojej strony możesz generować wykresy połączeń, diagramy dziedziczenia, diagramy współpracy i wiele innych przydatnych narzędzi.

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

0

W zależności od wymagań, Fabuła może być dla Ciebie interesujący: http://synopsis.fresco.org/

to modularne narzędzie, które analizuje kod źródłowy (C/C++/Python/IDL) i generuje streszczenie wykres składni . Wykres można przejść przez interfejs API (lub można go przekazać do innych modułów podsumowania, na przykład w celu wygenerowania dokumentacji źródłowej). Synopsis udostępnia C++ i Python API, niestety nie ma Java API - ale przypuszczam, że można go używać z Java przez Jython (lub oczywiście JNI ;-))

0

Myślę, że powinieneś sprawdzić Xogastan. Generuje on AST dla C++ jako dokument XML. Xogastan ma wiele opcji generacji.

Xogastan home

Pozdrowienia,

EDIT: To nie jest bezpośrednio połączony z Java, ale można go używać jako narzędzia zewnętrznego, a następnie analizować wygenerowane XML.

3

Miałem sukces parsujący C++ w Javie przy użyciu modułu CND z NetBeans. Wciąż jest brzydki, ale prawdopodobnie lepszy niż przy użyciu surowego ANTLR lub czego nie. Najpierw pobierz pakiet "all-in-one" z http://netbeans.org/downloads/zip.html dla uproszczenia (CND tak naprawdę nie wymaga tych wszystkich klas) i rozpakuj go, jak w bieżącym katalogu. Następnie oto nagłówek pliku ++ zabawka C Grałem z:

namespace foo { 

int f(int p); 

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

} 

A oto mój próbę analizowania że z 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(")"); 
       } 
      } 
     } 
    } 
} 

Ilość plików JAR musimy dodać do ścieżka klasy jest dość duży, i nie musi być lepszy sposób na radzenie sobie z tym, ale to działa na teraz:

$ 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 

i wyprowadza następujące:

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

BTW, możemy zrobić coś podobnego z Eclipse CDT: Parsing/reading C-Header files using Java

0

Samuel Audet ma rację! ale brakuje plików JAR. Należy dodać następujące pliki JAR: org-netbeans-modules-cnd-indexing.jar, org-netbeans-modules-parsing-lucene.jar, org-netbeans-libs-lucene.jar i lucene-core-3.5. 0.jar.

1

Można użyć Eclipse Parser, który jest realizowany w czystej Java i tylko 2 słoiki. dałem szczegółów, jak używać, zobacz link:
https://stackoverflow.com/a/27496664/955857

Powyższy link posiada również projekt, który pozwala abstrakcję Eclipse Parser przynosząc prostszą strukturę (ale nie pasował przypadków)