首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clang AST Matcher和AST Visitor有什么不同?

Clang AST Matcher和AST Visitor有什么不同?
EN

Stack Overflow用户
提问于 2019-10-03 22:40:40
回答 1查看 430关注 0票数 2

有两种强大的方法可以打开“棒棒糖”。在决定使用一个而不是另一个时,我应该考虑什么?

Clang网站提供了一些关于如何使用RecursiveASTVisitor查找Decl AST节点的旧tutorial,以及一些关于如何使用ASTMatcher查找for stmt的新tutorial。在这种情况下,它们可以实现的内容有很多重叠之处。

对于上面提到的简单任务,我发现ASTMatcher更方便,因为used谓词简短且易于阅读。然而,对于更复杂的任务,如源到源转换,需要对整个翻译单元进行分析。实现访问者函数似乎是一种更好的方法。因为我的ASTMatcher中的谓词往往会变得冗长且难以理解。也许有一种有效的方法可以将ASTMatcher与语言和复杂谓词一起使用。我很感谢你在这方面的建议。既然ASTMatcher是较晚引入的,是否打算取代旧的AST Visitor方法?

EN

回答 1

Stack Overflow用户

发布于 2020-06-12 09:19:01

问得好。有时,匹配器对于一种类型的模式是不可行的,该类型的模式涉及不同数量的AST节点,并且在您正在寻找的两个模式之间具有复杂性。下面是一个例子:

例如,匹配任何名为Foo的类,如果它的所有方法都有一个变量y。AST看起来像这样:

代码语言:javascript
复制
|-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'

对于单个函数。据我所知,没有一种简单的方法可以匹配所有的y并匹配通配符数量的stmt,直到您在定义中找到一个变量stmt。对此使用AST访问者模式将是您最感兴趣的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58221502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档