2012-04-24 94 views
5

我有一個C頭文件定義了幾個包含多個char數組的stucts。使用Java解析/讀取C頭文件

我想用Java解析這些文件。是否有用於將C-Header文件讀入結構中的庫或者是否存在理解C-Header文件的流解析器?

只是爲了更多的背景(我只是想找一個C-Header解析器,而不是解決這個特定問題的解決方案): 我有一個文本文件包含數據和一個解釋結構的C頭文件。兩者都有點動態,所以我不想生成Java類文件。

例如:

#define TYPE1 
typedef struct type1 
{ 
char name1[10]; 
char name2[5]; 
} 
#endif 

類型2,類型3等等是類似的。

數據結構:

type1ffffffffffaaaaa 
+0

lex和yacc(flex和bison)的手冊頁可能會有所幫助 – 2012-04-24 14:49:40

+0

哦,這很好,我忘記了yacc。我希望已經有一個現有的解決方案。但我想我可以使用yacc創建我自己的流解析器。 – PhilW 2012-04-24 14:59:52

+0

@PhilW,你創建了你的解析器嗎?我需要解析包含預處理器定義的C頭(只是整數常量)。我需要從C頭文件到Java應用程序中獲取這些常量。當然,我正在尋找一種現成的解決方案,然後實施我自己的解決方案=) – 2013-08-12 13:17:27

回答

12

您可以使用Java的現有C語言分析器。當然,它不僅僅是解析頭文件,但它不會傷害你。

我們使用Eclipse CDT項目的解析器。這是一個Eclipse插件,但我們在Eclipse之外成功使用它,只需將Eclipse的3個JAR文件與解析器JAR捆綁在一起即可。

要使用CDT解析器,首先執行org.eclipse.cdt.core.model.ILanguage,例如org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage。你可以打電話給getTranslationUnit,傳遞代碼和一些幫手的東西。代碼文件由org.eclipse.cdt.core.parser.FileContent實例表示(至少在CDT7中,這似乎改變很多)。創建此類對象的最簡單方法是FileContent.createForExternalFileLocation(filename)FileContent.create(filename, content)。這樣你就不需要關心Eclipse IFile的東西,這似乎只適用於項目和工作區。你回來的IASTTranslationUnit代表文件的整個AST。其中的所有節點都是IASTSomething類型的實例,例如IASTDeclaration等。您可以實現自己的子類org.eclipse.cdt.core.dom.ast.ASTVisitor,以使用訪問者模式遍歷AST。如果您需要進一步的幫助,請詢問。

我們使用的JAR文件是org.eclipse.cdt.core.jar,org.eclipse.core.resources.jar,org.eclipse.equinox.common.jarorg.eclipse.osgi.jar

編輯:我發現了一個文件,其中包含源代碼片段如下: 「使用Eclipse C/C++開發工具作爲一個強大的,功能齊全的,積極的維護,開源C++分析器」,但它是不再在線提供(僅作爲縮短版本)。

+0

聽起來像一個很好的契合!你介意投擲幾個關鍵詞或指導如何做到這一點? (這個場景中的主要類是什麼?) – PhilW 2012-04-24 15:18:31

+0

其實我有一個問題:在上面的示例中,我有一個宏「#define type1」 - 如何讓我的ASTVisitor訪問? – PhilW 2012-04-25 12:29:05

+0

我不確定它如何支持預處理器語句,因爲我們的代碼沒有它們。但是'IASTTranslationUnit'中有一些方法可以讓你訪問像'#define'這樣的預處理器語句。 – 2012-04-25 14:51:12

4

使用示例Eclipse CDT只有2個罐子。
- https://github.com/ricardojlrufino/eclipse-cdt-standalone-astparser
在該示例中有一個類將源文件的結構顯示爲樹,另一個示例將在api上進行交互...

一個細節是,與此api(Eclipse CDT解析器),你可以做從內存中的字符串解析

用法的另一個實例是:
https://github.com/ricardojlrufino/cplus-libparser
在C/C的源代碼庫元數據提取(約類,方法,變量信息)++。

見文件: https://github.com/ricardojlrufino/cplus-libparser/blob/master/src/main/java/br/com/criativasoft/cpluslibparser/SourceParser.java

3

如前所述,CDT是完美的完成這個任務。但是與上面描述的不同,我從插件中使用它並能夠使用IFiles。那麼一切都變得簡單多了。要獲得「ITranslationUnit」只是做:

ITranslationUnit tu = (ITranslationUnit) CoreModel.getDefault().create(myIFile); 
IASTTranslationUnit ias = tu.getAST(); 

我即尋找一種特殊的#define,所以我可以只:在陣列

ppc = ias.getAllPreprocessorStatements(); 

要獲取所有預處理代碼語句,每個語句-元件。非常容易。