首页 > 解决方案 > 使用 libclang 获取 MACRO 语句的 AST

问题描述

我的代码中有很多已定义的宏,我希望能够获得 AST。语句可能如下所示:

#define maskout_different_softening_flag(x) (x & (1 << BITFLAG_MIXED_SOFTENINGS_IN_NODE))

因此,如果maskout_different_softening_flag使用它,那么它的光标将是 kind BINARY_OPERATOR。我希望能够获得cursor该宏的所有 s,以便可以在实际代码中替换它。通过使用该PARSE_DETAILED_PROCESSING_RECORD选项,我可以获得这种形式的宏

在此处输入图像描述

我唯一能看到的是extend,但更有用的是类似于get_children每次我找到代码中使用的宏时检索这些子游标的能力。

这可以使用libclanginpython吗?

标签: pythoncclanglibclang

解决方案


宏替换不对应于 AST 节点。宏调用被标记流替换,每次调用不一定是相同的流,并且不要求替换是表达式或任何其他格式良好的句法实体。

如果您想maskout_different_softening_flag(x)成为具有有意义根节点的单个语法实体,则应将其定义为内联函数,而不是宏。宏是编译过程中更粗暴的居民。他们不会坐下来让您从语法上分析他们的替换文本。当编译器开始分析这些标记时,宏本身已经消失得无影无踪。(好吧,有一个痕迹,因为令牌的源位置可能会告诉你#define它们来自哪里。但就是这样。)

据我所知,libclang 会以编译器看到的方式向您显示源代码。因此,它可能与您似乎想要查看的模型不对应。


推荐阅读