解析C ++代码生成的最简单方法是什么?

时间:2014-03-28 10:06:27

标签: c++ parsing clang code-generation

我想生成一些基于C ++类型的包装器代码。我基本上想要解析一些C ++头文件,获取头文件中定义的类型,类及其字段,并根据它们生成一些代码。

解析C ++并获取类型信息的最简单方法是什么?我想过使用Clang C ++解析器,但是我在几个小时内无法创建一个工作中的hello世界,所以我暂时放弃了。
您能否建议任何其他解析C ++的方法,或者如果Clang是最简单的解决方案,您能指点一个简单的入门指南,以便能够用它解析C ++类型吗?

(基本上任何技术都可以,C ++,Java,C#等,这将是命令行工具的一部分)

3 个答案:

答案 0 :(得分:4)

Clang绝对是最简单的选择。考虑使用cindex python bindings,它非常简单。或者,您可以获得旧版本的clang,它仍然具有xml后端。

编辑:上面的链接似乎已关闭,因此这里是指向google cache of it的链接。

评论中建议的另一个链接:http://www.altdevblogaday.com/2014/03/05/implementing-a-code-generator-with-libclang/

答案 1 :(得分:1)

除非您的目标是验证正确性,或者代码涉及高级模板内容,否则请考虑使用 DOxygen GCC_XML 的XML输出。或者,考虑铿锵,即使你发现太复杂了。请注意,对于clang,最好在* nix-land中工作。

答案 2 :(得分:0)

如果您的生成工具是Java,请考虑使用Eclipse CDT中的解析器。 我的依赖集是:

  • com.ibm.icu_4.4.2.v20110823.jar
  • org.eclipse.cdt.core_5.3.2.201202111925.jar
  • org.eclipse.equinox.common_3.6.0.v20110523.jar

(这些来自一个旧的Eclipse版本,因为我依赖于旧的java类版本),但是从最新的CDT开始就可以了。

解析涉及:

FileContent reader;
reader = FileContent.createForExternalFileLocation(fullPath);
IScannerInfo info = new ScannerInfo(definedSymbols, includePaths);
return GPPLanguage.getDefault().getASTTranslationUnit(reader, info, FilesProvider.getInstance(), null, 0,log);

返回可通过访问者模式(ASTVisitor)访问的IASTTranslationUnit。

我无法评论角落场景中解析的准确性,因为到目前为止,我一直在基于简单的C ++结构定义生成代码。