c++ - Clang AST Matcher 和 AST Visitor 有什么区别?
问题描述
两种打开 Clang 盒子的强大方法。在决定使用其中一种时我应该考虑什么?
Clang 网站提供了一些关于如何使用查找 AST 节点的旧教程,以及一些关于如何使用查找某些stmt的新教程。在这种情况下,他们可以实现的目标有很多重叠之处。RecursiveASTVisitor
Decl
ASTMatcher
for
对于上面提到的简单任务,我觉得ASTMatcher
更方便,因为使用的谓词简短易读。但是,对于更复杂的任务,例如源到源的转换,需要对整个翻译单元进行分析。实现访问者功能似乎是一种更好的方法。因为我的谓词ASTMatcher
往往会变得冗长且难以理解。也许有一种有效的方法来使用ASTMatcher
lang 和复杂的谓词。我很感激对此的任何建议。既然ASTMatcher
是后来介绍的,是不是打算替换旧AST Visitor
方法呢?
解决方案
好问题。有时,匹配器对于涉及可变数量的 AST 节点和您正在寻找的两个模式之间的复杂性的模式类型是不可行的。这是一个例子:
例如,匹配任何具有 name 的类Foo
,并且它的所有方法中都有一个变量y
。AST 看起来像:
|-CXXRecordDecl 0x563295d82010 <sandbox/class.cpp:1:1, line:6:1> line:1:7 class Foo definition
...
| |-CXXRecordDecl 0x563295d82128 <col:1, col:7> col:7 implicit class Foo
| |-FieldDecl 0x563295d821d0 <line:2:5, col:9> col:9 x 'int'
| `-CXXMethodDecl 0x563295d82298 <line:3:5, line:5:5> line:3:10 bar 'void ()'
| `-CompoundStmt 0x563295d823e8 <col:16, line:5:5>
| `-DeclStmt 0x563295d823d0 <line:4:9, col:14>
| `-VarDecl 0x563295d82368 <col:9, col:13> col:13 y 'int'
对于单个函数。据我所知,没有简单的方法可以匹配所有 methoddecls 并匹配通配符数量的 stmts,直到您到达y
定义中的变量。为此使用 AST 访问者模式符合您的最大利益。
推荐阅读
- javascript - 在其他计算功能发生之前,您如何等待一个功能运行其所有代码(包括动画)?JavaScript 和 JQuery
- karate - 将空手道版本升级到 1.0.0 后不生成黄瓜报告
- postgresql - 无法在 PostgreSQL 11.0 表中插入数据
- python - python3 msg.attach(MIMEImage(file(attachment).read())) 中的问题
- c# - 幻影错误 Xamarin Forms Android
- sql-server - 将查询从 SQL Server 转换为 SQLite
- ffmpeg - 使用 ffmpeg 在 MKV 的开头覆盖/淡化图像
- python-3.x - 如何从 python 中的 sqllite 数据库中选择特定列
- matlab - 为什么我的串口仪器读取返回相同查询命令的查询响应?
- ajax - 谷歌扩展 - 拦截 ajax 调用突然停止工作