2012-10-12 48 views
5

我有一個C++應用程序,我也有它的源代碼,它已經建立在.Net框架上。我現在要找的是一個工具(理想情況下是免費的),它將我的源代碼作爲輸入,經過一些預處理或某些所需的編程後,我可以得到源代碼元素的結構依賴關係的一種中間表示,如AST或一個調用圖。我正在與java一起檢查這個C++源代碼,所以如果解決方案在Java環境中就像eclipse的插件或其他東西一樣,那麼它會好得多。有沒有適合我需要的工具? 謝謝大家。解析java環境中的C++源代碼

+0

最糟糕的情況是,你可以使用C++工具:http://stackoverflow.com/a/2318476/839436 –

+0

eclipse和netbeans都有C++的開源插件。你可以從這些開始。 –

+0

這是實現C++解析器的「簡單問題」。 (不幸的是,C++是需要解析的最醜陋的體系結構之一。) –

回答

4

您可能感興趣的doxygen,它是一款基於源代碼生成文檔的免費工具。如果沒有任何額外的工作,您可以生成調用圖,繼承圖,協作圖和許多其他有用的工具。

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

0

根據您的要求,大綱可以爲你很有趣:http://synopsis.fresco.org/

這是一個模塊化的工具,它解析源代碼(C/C++/Python的/ IDL),並生成一個抽象語法圖。該圖可以通過API遍歷(或者可以將其傳遞給其他大綱模塊以生成源文檔)。 Synopsis提供了C++和Python API,不幸的是沒有Java API--但我認爲它可以從Java通過Jython(或JNI當然;-))使用

0

我認爲你應該檢查Xogastan。它爲C++生成AST作爲XML文檔。 Xogastan有很多選擇。

Xogastan home

問候,

編輯: 它不是直接使用Java連接,但您可以使用它作爲一個外部工具,然後分析生成的XML。

3

我已經成功使用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

0

塞繆爾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。

1

您可以使用Eclipse分析器,它在純Java中實現,只有2個罐子。 我已經給出瞭如何使用,請參閱鏈接的詳細信息:
https://stackoverflow.com/a/27496664/955857

上面還鏈接了一個項目,使Eclipse分析器帶來了更簡單的結構的抽象(但並不適合所有的情況下)