【问题标题】:What's the easiest way to parse C++ for code generation?解析 C++ 以生成代码的最简单方法是什么?
【发布时间】:2014-03-28 10:06:27
【问题描述】:

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

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

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

【问题讨论】:

  • 解析 C++ 绝非简单... SWIG 或 CLANG 可能是一个开始。
  • 类型是迄今为止 C++ 语法中最复杂的部分,因此您不会在这里得到简单的解决方案。你必须使用真正的解析器。
  • Peter 说得对——你可以用几行正则表达式来做一些简单的事情——但请注意,随着时间的推移,维护你正在包装的标题的人很可能会出现并进行各种更改,例如决定一切都属于命名空间,或者模板应该从 typedef 切换到 using 语句,或者应该使用元编程等选择参数 - 当黑客中断时,他们会不为所动。
  • @Mark:template<typename T1,typename T2> auto f(T1 a, T2 b)->decltype(a+b) {return a+b}; auto x = f(3,2.0);。这是一个简单的 C++11 代码示例,需要完整解析才能获取变量类型。
  • 一个“简单的标题”很可能包含<string>,此时它真的不再简单了。

标签: c++ parsing clang code-generation


【解决方案1】:

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

编辑:上面的链接好像失效了,所以这里是google cache of it的链接。

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

【讨论】:

【解决方案2】:

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

【讨论】:

  • gcc-xml (因为基于 gcc 4.2 无论如何都有些限制)不支持模板,只支持它们以有限的方式实例化。同样两者都不支持foo<sizeof(X)>之类的东西,我不会将其视为“高级模板内容”。
【解决方案3】:

如果您的生成工具使用 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++ 结构定义生成代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 2010-09-23
    • 2013-07-30
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多