什么';这是解析C++;用于代码生成? 我想生成一些基于C++类型的包装代码。基本上我想解析一些C++头,获取头文件中定义的类型、类及其字段,并基于它们生成一些代码。 什么是解析C++和获取类型信息的最简单方法?我考虑使用CLAN C++解析器,但是我在几个小时内无法建立一个工作的Hello World,所以我暂时放弃了。 你能建议其他的解析C++的方法吗?或者如果Clang是最简单的解决方案,你能给我指出一个简单的入门指南,用它来解析C++类型吗? (基本上任何技术都可以,C++,爪哇,C等),这是命令行工具的一部分) < P> Clang绝对是最简单的选择。考虑使用CQUED,这是非常简单的。或者,您可以得到一个更旧版本的clang,它仍然具有xml后端

什么';这是解析C++;用于代码生成? 我想生成一些基于C++类型的包装代码。基本上我想解析一些C++头,获取头文件中定义的类型、类及其字段,并基于它们生成一些代码。 什么是解析C++和获取类型信息的最简单方法?我考虑使用CLAN C++解析器,但是我在几个小时内无法建立一个工作的Hello World,所以我暂时放弃了。 你能建议其他的解析C++的方法吗?或者如果Clang是最简单的解决方案,你能给我指出一个简单的入门指南,用它来解析C++类型吗? (基本上任何技术都可以,C++,爪哇,C等),这是命令行工具的一部分) < P> Clang绝对是最简单的选择。考虑使用CQUED,这是非常简单的。或者,您可以得到一个更旧版本的clang,它仍然具有xml后端,c++,parsing,clang,code-generation,C++,Parsing,Clang,Code Generation,编辑:上面的链接似乎已关闭,因此这里有一个指向的链接 注释中建议的另一个链接:< P>除非您的对象是验证正确性,否则代码涉及高级模板素材,请考虑使用 或 < /强>的XML输出。另一方面,考虑CLAN,即使这是你发现太复杂。注意,对于CLAN,最好在*nix Land中工作。 < P>如果您的生成工具是java,请考虑使用Eclipse CDT中的解析器。 我的依赖项集是: com.ibm.icu_4.4.2.v20110823.jar org.eclipse.cdt.core_5.3.2.2

编辑:上面的链接似乎已关闭,因此这里有一个指向的链接


注释中建议的另一个链接:

< P>除非您的对象是验证正确性,否则代码涉及高级模板素材,请考虑使用<强> <强>或<强> < /强>的XML输出。另一方面,考虑CLAN,即使这是你发现太复杂。注意,对于CLAN,最好在*nix Land中工作。

< P>如果您的生成工具是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++ C++结构定义生成代码。SWIG或CLAN可能是一个开始。类型是C++语法中最复杂的部分,所以在这里你将无法得到一个简单的解决方案。你必须使用真正的解析器。Peter说得对——你可以用几行正则表达式做一些简单的事情——但要注意,随着时间的推移,维护你包装的头的人可能会出现并做出各种更改,比如决定所有内容都属于一个名称空间,或者模板应该使用语句从typedef切换到
,或者应该使用元编程等选择一个参数-当黑客攻击中断时,它们将不会受到影响。@标记:
template auto f(T1 a,t2b)->decltype(a+b){返回a+b};自动x=f(3,2.0)。这是一个简单的C++11代码示例,它需要完全解析才能获得变量类型。“简单头”很可能包含
,此时它就不再简单了。gcc-xml(因为基于gcc 4.2的xml在某种程度上是有限的)不支持模板,只以有限的方式支持它们的实例化。也不支持像<代码> Foo< /Cord>之类的东西,我不认为这是“高级模板的东西”。感谢这些提示,我试着让这个示例工作,现在我在用Python使用LBCLANK时,下面的问题是: