2011-03-15 86 views
21

我设法用cmake和visual studio 10成功编译了windows的clang。我想获得一个XML文件作为源代码的AST表示。有一个选项,它提供的结果铿锵linux下(Ubuntu的),GCC,但在Windows中不起作用:可以在不使用编译器的情况下使用clang获取C/C++代码的XML AST转储吗?

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

然而,这是调用编译阶段(我想避免) 。对于叮当而言,挖掘源代码并不能帮助我。我可以设法通过使用生成AST的二进制版本:

clang -emit-ast source.c 

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

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

是否有可能丢失类似于铛前端生成的AST与编译阶段生成的AST不相同的东西。

+2

我的公司构建C++前端,我们*可以发布AST的完整XML转储。我们把它作为一个复选框项目,因为人们要求它。没有人真正使用它,因为真正的C++程序(包括所有头文件)的输出量很简单*巨大*,这使得它处理速度缓慢而笨拙。真正的问题是,你为什么要这样做?Clang可能已经提供了大量机器来直接处理C++ AST(就像我们相应的工具一样);你为什么要尝试复制所有这些工作?为什么不使用Clang来达到你的目的? – 2011-03-19 17:42:33

+0

...请参阅http://stackoverflow.com/a/17393852/120163上的C++树转储这不是XML,但该工具也可以使用完全相同的内容生成XML。 – 2016-04-12 10:02:00

回答

20

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

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

Douglas提出的另一点是,输出不应该用于调试CLang本身(这是-emit-ast的意思),而是用于外部工具的消耗。这要求输出从一个版本到另一个版本是稳定的。值得注意的是,它不应该是CLang内部的1对1映射,而是将源代码翻译成标准语言。

除非有打印机显著工作(这需要志愿者),它不会被整合回来...

+3

有趣的部分是'-emit-ast'漂亮的打印类型,而不是代表它们的结构,因此这是绝对无用的。它只能用xml打印机进行调试,并自动验证声明中的类型。 – 2011-03-18 13:27:54

+0

@ SK-逻辑:由于xml不再是一个选项,我们可能会看到'-emit-ast'行为的改进。 – 2011-03-18 13:29:37

+0

感谢所有这些有趣的信息。我将看看旧的xml打印机,并尝试查看我是否可以为自己的用途制作一些有用的东西。有一些通用/标准化的表示源代码的方式确实是一件好事,但一个常见的分母意味着抛弃功能并为各种语言保留特定的东西使其变得非常复杂......一些可扩展的方法会很好...现在非常感谢这个答案。 – jdehaan 2011-03-18 20:39:28

3

我一直工作在我自己的版本从锵的AST提取XML的。我的代码使用libclang的Python绑定来遍历AST。

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

编辑发现:我要补充,这是生产的每个节点AST正确的源代码标记的意义​​上却是不完整的。不幸的是需要为每个AST节点类型编码。但是,代码应该为任何想要进一步追求这一目标的人提供基础。

1

使用自定义ASTDumper可以完成这项工作,而不需要编译任何源文件。 (在前端部分停下来)。但是你必须处理所有的llvm的C和C++代码来完成这个任务。

相关问题