我有一個C++應用程序,我也有它的源代碼,它已經建立在.Net框架上。我現在要找的是一個工具(理想情況下是免費的),它將我的源代碼作爲輸入,經過一些預處理或某些所需的編程後,我可以得到源代碼元素的結構依賴關係的一種中間表示,如AST或一個調用圖。我正在與java一起檢查這個C++源代碼,所以如果解決方案在Java環境中就像eclipse的插件或其他東西一樣,那麼它會好得多。有沒有適合我需要的工具? 謝謝大家。解析java環境中的C++源代碼
回答
您可能感興趣的doxygen,它是一款基於源代碼生成文檔的免費工具。如果沒有任何額外的工作,您可以生成調用圖,繼承圖,協作圖和許多其他有用的工具。
根據您的要求,大綱可以爲你很有趣:http://synopsis.fresco.org/
這是一個模塊化的工具,它解析源代碼(C/C++/Python的/ IDL),並生成一個抽象語法圖。該圖可以通過API遍歷(或者可以將其傳遞給其他大綱模塊以生成源文檔)。 Synopsis提供了C++和Python API,不幸的是沒有Java API--但我認爲它可以從Java通過Jython(或JNI當然;-))使用
我認爲你應該檢查Xogastan。它爲C++生成AST作爲XML文檔。 Xogastan有很多選擇。
問候,
編輯: 它不是直接使用Java連接,但您可以使用它作爲一個外部工具,然後分析生成的XML。
我已經成功使用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)
順便說一句,我們可以用Eclipse CDT的類似的東西: Parsing/reading C-Header files using Java
塞繆爾Audet是正確的!但他缺少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。
您可以使用Eclipse分析器,它在純Java中實現,只有2個罐子。 我已經給出瞭如何使用,請參閱鏈接的詳細信息:
https://stackoverflow.com/a/27496664/955857
上面還鏈接了一個項目,使Eclipse分析器帶來了更簡單的結構的抽象(但並不適合所有的情況下)
- 1. Java源代碼解析器
- 2. Ruby中的Java源代碼解析器
- 3. C#解析網頁的源代碼
- 4. 在java 1.4環境中解析XML
- 5. 如何解析Java源代碼?
- 6. Java:解析C源代碼,提取變量和方法
- 7. 用Java解析Java代碼
- 8. Oracle/ASP.NET環境的最佳源代碼控制解決方案?
- 9. 多環境源代碼控制的任何解決方案?
- 10. 如何調試我從MATLAB環境調用的Java源代碼?
- 11. 使用環境變量解析雲代碼CLI語法?
- 12. Intellij解析java代碼
- 13. C源代碼AST中的AST解析器
- 14. C++解析器源代碼中的不明原因錯誤
- 15. Java代碼中的解析器入門
- 16. C++&XML:在C++中解析XML在Ubuntu環境中工作
- 17. Java:解析java源代碼,提取方法
- 18. 如何從Eclipse JDT Parser中解析Java源代碼行?
- 19. C++解析代碼(手寫)
- 20. 解析Python代碼從C++
- 21. 解析C#中的SQL代碼#
- 22. 解析HTML代碼中的URL C++
- 23. 解析HTML源代碼,JavaScript的問題
- 24. 解析JavaScript代碼的HTML源
- 25. 解析網頁的源代碼
- 26. 解釋的java IDE環境
- 27. 如何在解析Java源代碼時解析標識符的類型?
- 28. 分析Java源代碼的工具
- 29. 在java中解析JSON代碼Android
- 30. 如何在運行時解析java中的環境變量
最糟糕的情況是,你可以使用C++工具:http://stackoverflow.com/a/2318476/839436 –
eclipse和netbeans都有C++的開源插件。你可以從這些開始。 –
這是實現C++解析器的「簡單問題」。 (不幸的是,C++是需要解析的最醜陋的體系結構之一。) –