7

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

我想使用 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
4

4 回答 4

16

您可以为 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.jarorg.eclipse.core.resources.jarorg.eclipse.equinox.common.jarorg.eclipse.osgi.jar.

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

于 2012-04-24T15:04:55.413 回答
6

仅使用 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

于 2014-12-16T02:41:26.713 回答
4

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

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

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

ppc = ias.getAllPreprocessorStatements();

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

于 2015-10-15T15:13:03.090 回答
2

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

于 2012-04-24T15:04:33.710 回答