使用 libclang 获取 MACRO 语句的 AST

Get AST of MACRO statements usinc libclang

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

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

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

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

是否可以在 python 中使用 libclang

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

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

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