我可以在不使用编译器的情况下使用clang获得C / C ++代码的XML AST转储吗?

时间:2011-03-15 08:54:47

标签: xml clang code-generation abstract-syntax-tree

我设法使用cmake和visual studio 10成功编译了用于Windows的窗口。我想获得一个XML文件作为源代码的AST表示。有一个选项可以在linux(ubuntu)下使用gcc提供结果,但在windows框中不起作用:

clang -cc1 -ast-print-xml source.c

但是,这是调用编译阶段(我想避免)。挖掘源代码并没有帮助我,因为我很吵。我可以通过使用:

设法生成AST的二进制版本
clang -emit-ast source.c

不幸的是,这种格式无法直接用于解析。是否有一些现有方法直接生成XML树而不是clang中的二进制文件?

目标是在.NET环境中的其他工具中使用XML表示,因此我需要围绕本机clang lib进行一些包装以访问二进制AST。如果有人已经为.NET编写了一些二进制clang AST解析器,可能还有第三种选择吗?

我是否有可能错过像clang前端生成的AST与编译阶段生成的AST不同的东西。

3 个答案:

答案 0 :(得分:20)

有关您的信息,Douglas Gregor(负责CLang FrontEnd)已从2.9版本中删除了XML打印机。

问题在于缺乏XML打印机。从未在打印机中实现过许多AST节点,以及某些节点的许多属性,这导致源代码的表示不准确。

Douglas提出的另一个观点是,输出应该不适合调试CLang本身(这是-emit-ast所关注的),而是适用于外部工具的消耗。这要求输出在一个版本之间保持稳定。值得注意的是,它不应该是CLang内部的一对一映射,而是将源代码翻译成 standardese 语言。

除非打印机上有大量工作(需要志愿者),否则它不会被集成回来......

答案 1 :(得分:3)

我一直致力于从Clang的AST中提取XML。我的代码使用libclang的Python绑定来遍历AST。

我的代码位于https://github.com/BentleyJOakes/PCX

编辑:我应该补充一点,就为每个AST节点生成正确的源代码令牌而言,它是完全不完整的。遗憾的是,需要为每个AST节点类型编码。但是,代码应该为想要进一步追求这一目标的人提供基础。

答案 2 :(得分:1)

使用自定义ASTDumper可以完成这项工作,而无需编译任何源文件。 (在前端部分停止铿锵声)。但是你必须处理llvm的所有C和C ++代码源来实现它。