У меня есть приложение на C ++, у меня также есть исходный код, и оно было построено на основе .Net. то, что я сейчас ищу, — это инструмент (в идеале бесплатный), который получает мой исходный код в качестве входных данных, и после некоторой предварительной обработки или некоторого необходимого программирования дает мне одно промежуточное представление структурной зависимости элементов исходного кода, например, AST или граф вызовов. Я работаю с Java, чтобы проверить этот исходный код C ++, поэтому было бы намного лучше, если бы решение находилось в среде Java, такой как плагин для затмения или что-то еще. Есть ли какой-нибудь инструмент, который подходит мне?
Спасибо вам всем.
Возможно, вас заинтересует doxygen, это бесплатный инструмент, который генерирует документацию на основе исходного кода. Без дополнительной работы с вашей стороны вы можете создавать графы вызовов, диаграммы наследования, диаграммы сотрудничества и многие другие полезные инструменты.
Я успешно разбираю C ++ в Java, используя модуль CND от NetBeans. Это все еще безобразно, но, вероятно, лучше, чем использование сырого ANTLR или что-то еще. Сначала загрузите пакет «все в одном» с http://netbeans.org/downloads/zip.html для простоты (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-файлов, которые мы должны добавить в classpath, довольно велико, и должен быть лучший способ справиться с этим, но пока это работает:
$ 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)
Кстати, мы можем сделать нечто подобное с Eclipse CDT:
Разбор / чтение файлов C-Header с использованием Java
Вы можете использовать Eclipse Parser что реализовано в чистом виде Джава и только 2 банки.
Я дал подробную информацию о том, как использовать, смотрите ссылку:
https://stackoverflow.com/a/27496664/955857
Ссылка выше также имеет проект, который делает абстракцию Eclipse Parser, предоставляя более простую структуру (но не подходит для всех случаев)
В зависимости от ваших требований, синопсис может быть вам интересен: http://synopsis.fresco.org/
Это модульный инструмент, который анализирует исходный код (C / C ++ / Python / IDL) и генерирует абстрактный синтаксический граф. График может быть пройден через API (или он может быть передан другим модулям синопсиса, например, для генерации исходной документации). Synopsis предоставляет C ++ и Python API, к сожалению, нет Java API — но я предполагаю, что его можно использовать из Java через Jython (или, конечно, JNI ;-))
Я думаю, что вы должны проверить Xogastan. Он генерирует AST для C ++ как документ XML. Xogastan имеет много вариантов генерации.
Привет,
РЕДАКТИРОВАТЬ:
Он не связан напрямую с Java, но вы можете использовать его как внешний инструмент, а затем анализировать сгенерированный XML.
Сэмюэл Одет прав! но ему не хватает файлов JAR. Вам необходимо добавить следующие JAR-файлы:
org-netbeans-modules-cnd-indexing.jar, org-netbeans-modules-parsing-lucene.jar, org-netbeans-libs-lucene.jar и lucene-core-3.5.0.jar.