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
Odpowiedz
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.
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 ;-))
Myślę, że powinieneś sprawdzić Xogastan. Generuje on AST dla C++ jako dokument XML. Xogastan ma wiele opcji generacji.
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.
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
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.
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)
Najgorszy przypadek, można użyć narzędzi C++: http://stackoverflow.com/a/2318476/839436 –
eclipse i netbeans mają wtyczki open source dla C++. Możesz zacząć od tych. –
To "prosta sprawa" implementacji parsera C++. (Niestety, C++ jest jedną z najbrzydszych architektur do przeanalizowania). –