5

在网上找到的 clang 工具示例总是在玩具示例上运行,这些示例通常都是非常琐碎的 C 程序。

我正在构建一个对 C++ 代码执行源到源转换的工具,这显然是一项非常非常具有挑战性的任务,但 clang 可以胜任这项任务。

我现在面临的问题是,clang 为任何使用 STL 的 C++ 代码生成的 AST 是巨大的。例如,我有一些 C++ 代码,其中clang++ -ast-dump ... | wc -l有 67,018 行可怕的 AST gobbledygook!

其中 99% 是标准库的东西,我的目标是在我的源到源元编程任务中忽略它们。所以,为了实现这一点,我想简单地过滤掉文件。假设我只想查看我正在分析的项目头文件中的类定义(并忽略所有标准库头文件的内容),我只需要弄清楚我的每个CXXRecordDecl's 来自哪个头文件!

这可以做到吗?

编辑:希望是一种解决方法。现在试试这个......重要的是它必须告诉我decls出来的标题,而不是对应于翻译单元的cpp文件。

4

2 回答 2

1

到目前为止,根据我的经验,某些给定 AST 节点的“源”最好使用 Locations 来检索。例如,每个节点至少有一个起始位置,当您打印出来时,它将包含头文件路径。

然后可以使用此路径来确定它是系统库还是您仍然有兴趣检查的应用程序代码的一部分。

于 2015-05-29T15:53:40.247 回答
0

我正在寻找的一种方法是缩小匹配范围,例如hasName()(如在此处找到。例如:

recordDecl(hasName("MyBaseClass")) // etc.

但是,您在上面使用的评论-ast-dump也是我尝试在我自己的 CLang 工具上获得一席之地的东西。我发现这篇文章非常有帮助。根据他们的建议,我过去常常clang-check过滤到特定的类名并将其提供给我的顶级 CPP 文件。输出是更易于管理的几百行代表感兴趣的类声明和定义。

于 2015-05-29T13:52:18.103 回答