您可以使用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