使用 Java 解析/读取 C 头文件

IT小君   2021-12-05T02:49:42

我有一个 C 头文件定义了几个结构,包含多个字符数组。

我想使用 Java 解析这些文件。是否有用于将 C 头文件读入结构的库,或者是否有理解 C 头文件的流解析器?

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

例子:

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

Type2、Type3 等类似。

数据结构:

type1ffffffffffaaaaa
评论(4)
IT小君

您可以将现有的 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.jar,和org.eclipse.osgi.jar

编辑:我找到了一篇包含源代码片段的论文:“使用 Eclipse C/C++ 开发工具作为一个健壮的、功能齐全的、积极维护的、开源的 C++ 解析器”,但它不再在线提供(仅作为缩短版)。

2021-12-05T02:49:42   回复
IT小君

使用只有 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

2021-12-05T02:49:42   回复
IT小君

如前所述,CDT 非常适合此任务。但与上述不同,我从插件中使用它并且能够使用 IFiles。那么一切都变得容易多了。要获得“ITranslationUnit”,只需执行以下操作:

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

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

ppc = ias.getAllPreprocessorStatements();

获取所有预处理代码语句,数组元素中的每个语句。非常容易。

2021-12-05T02:49:43   回复
IT小君

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

2021-12-05T02:49:43   回复