2012-04-24 57 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(); 

要获取所有预处理代码语句,每个语句-元件。非常容易。