因此,您想要处理使用 MS 标头的 C++ 代码,并且想要访问 AST 以便生成代码。并且 Clang 不会处理 MS 标头。
因此,除非得到彻底的升级,否则 Clang 无法成为答案。
您要求“任何可以完成这项工作的解决方案”。
我们的DMS Software Reengineering Tookit 及其C++14 Front End 可以做到这一点。
DMS 提供通用解析、AST 构造/检查/转换/生成和反向解析(将 AST 转换回可编译代码),由语言定义参数化。
C++ 前端提供完整的 C++14 解析器、预处理器处理、AST 构造以及全名和类型解析。已经用 GCC 和 MS VS 2013 头文件测试过;我们现在正在使用 2015 头文件进行测试。
(它也处理 MS VS 2013 语法)。
它完全处理困难的解析情况,包括 C++ 著名的“最令人头疼的解析”。您可以在get human readable AST from c++ code 看到解析树。
DMS 不提供 Python 绑定,也不提供直接的 C++ 接口。相反,它是一个独立的工具,旨在支持自定义工具的构建(例如,您的“小代码生成器”)。它有自己非常广泛的内部 API 集,用类似于 LISP 的元编程语言 PARLANSE 编码。 DMS 的其他方面通过使用用于词法分析器、语法和转换的 DSL 来管理。见下文。
请注意:任何可以处理 C++ 的工具都保证是复杂的。 DMS 也相应地复杂,学习使用它需要一段时间,所以你不会立即得到答案。好消息在这里
是有些事情更容易做。您的代码生成问题
很可能是“读取骨架文件,然后用特定于问题的代码替换其中的关键条目”。如果是这种情况,具有以下代码的 DMS 工具(此处为简化演示)可能会解决问题:
...
(= myAST (Registry:ParseFile (. filename) (. `CppVisualStudio2013') ...)
(Registry:ApplyTransforms myAST (. `MyTransforms.rsl'))
(Registry:PrettyPrint myAST (concat filename `.modified'))
...
使用 transforms 文件 MyTransforms.rsl 包含概念形式的源到源表面语法(例如 C++ 语法)转换规则
rule rulename if_you_see THIS then replace_by ("-->") THAT
实际的 C++ 规则可能看起来像(编造这个,因为我没有
了解您的实际代码生成目标)
rule replace_abstraction(s: STRING_LITERAL):
" abstraction_place_holder(\s) "
-> " my_DSL_library(\s,17); "
上面的 ApplyTransforms 调用将应用所有此文件中的规则,直到不再应用任何规则。
编写表面语法转换(您可以在其中进行)比调用可破解树的程序库(如 Clang,DMS 提供的程序库)要容易得多。
您可以使用 PARLANSE 编写更复杂的元程序,在一个地方应用一些规则,在其他地方应用其他规则,如果您愿意,您可以将源到源转换与直接在树上破解的过程转换混合。
如果您想了解有关转换的更多详细信息,请询问,我会提供链接。