python - 使用 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
每次我找到代码中使用的宏时检索这些子游标的能力。
这可以使用libclang
inpython
吗?
解决方案
宏替换不对应于 AST 节点。宏调用被标记流替换,每次调用不一定是相同的流,并且不要求替换是表达式或任何其他格式良好的句法实体。
如果您想maskout_different_softening_flag(x)
成为具有有意义根节点的单个语法实体,则应将其定义为内联函数,而不是宏。宏是编译过程中更粗暴的居民。他们不会坐下来让您从语法上分析他们的替换文本。当编译器开始分析这些标记时,宏本身已经消失得无影无踪。(好吧,有一个痕迹,因为令牌的源位置可能会告诉你#define
它们来自哪里。但就是这样。)
据我所知,libclang 会以编译器看到的方式向您显示源代码。因此,它可能与您似乎想要查看的模型不对应。
推荐阅读
- r - R - 将循环类的对象转换回数字
- c# - 将接口实现分配给其他模块中的类
- apache-spark - 当 Kafka 队列中的消息分布不均时,在 spark DStream 批次中获取最大消息
- laravel - 在 Laravel 应用程序中登录时停止更新用户表的 update_by 字段
- gitlab - 你如何检查我的自托管实例上是否配置了 GitLab `incoming_email`?
- maven - Gradle 7.1没有将maven工件发布到archiva
- latex - 如何在乳胶中获得符号`(英式键盘上#1左侧的那个)?
- jinja2 - dbt 使用 list 参数调用 post-hook 宏
- css - 创建六个宽度为 1fr 的网格列
- angular - TS2322:类型'IEvent | undefined' 不可分配给类型 'IEvent'