您可以使用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.jar
和org.eclipse.osgi.jar
。
編輯:我發現了一個文件,其中包含源代碼片段如下: 「使用Eclipse C/C++開發工具作爲一個強大的,功能齊全的,積極的維護,開源C++分析器」,但它是不再在線提供(僅作爲縮短版本)。
lex和yacc(flex和bison)的手冊頁可能會有所幫助 – 2012-04-24 14:49:40
哦,這很好,我忘記了yacc。我希望已經有一個現有的解決方案。但我想我可以使用yacc創建我自己的流解析器。 – PhilW 2012-04-24 14:59:52
@PhilW,你創建了你的解析器嗎?我需要解析包含預處理器定義的C頭(只是整數常量)。我需要從C頭文件到Java應用程序中獲取這些常量。當然,我正在尋找一種現成的解決方案,然後實施我自己的解決方案=) – 2013-08-12 13:17:27