使用 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 以编译器查看源代码的方式向您显示源代码。所以它可能不会对应您似乎想要查看的模型。
我的代码中有很多已定义的宏,我希望能够获取其中的 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 以编译器查看源代码的方式向您显示源代码。所以它可能不会对应您似乎想要查看的模型。