使用Java解析/读取C-Header文件

我有一个C-Header文件定义了几个stuct,包含多个char数组。

我想用Java解析这些文件。 是否有一个用于将C-Header文件读入结构的库,或者是否有一个了解C-Header文件的流解析器?

只是为了更多背景(我只是在寻找一个C-Header解析器,而不是解决这个特定问题的解决方案):我有一个包含数据的文本文件和一个解释结构的C-Header文件。 两者都有点动态,所以我不想生成Java类文件。

例:

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

Type2,Type3等类似。

数据结构:

 type1ffffffffffaaaaa 

您可以将现有的C解析器用于Java。 当然,它比解析头文件要多得多,但这不应该伤害你。

我们使用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.jarorg.eclipse.core.resources.jarorg.eclipse.equinox.common.jarorg.eclipse.osgi.jar

编辑 :我发现了一篇包含源代码片段的论文:“使用Eclipse C / C ++开发工具作为一个强大的,function齐全,主动维护的开源C ++解析器”,但它已不再在线提供(仅限于缩短版)。

使用只有2个jar的Eclipse CDT的示例。
https://github.com/ricardojlrufino/eclipse-cdt-standalone-astparser
在示例中有一个类,它将源文件的结构显示为树,另一个示例在api上进行交互…

一个细节就是使用这个api(Eclipse CDT Parser),您可以从内存中的字符串进行解析。

另一个用法示例是:
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

如前所述,CDT非常适合这项任务。 但与上述不同,我在插件中使用它并且能够使用IFiles。 然后一切都如此轻松。 要获得“ITranslationUnit”,请执行以下操作:

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

我正在寻找一个特殊的#define,所以我可以:

 ppc = ias.getAllPreprocessorStatements(); 

要获取所有预处理的代码语句,请使用array-element中的每个语句。 非常容易。

您可以尝试使用ANTLR 。 应该已经有一些现有的C语法可用了。