Clang AST Matcher和AST Visitor之间有什么区别?

时间:2019-10-03 14:40:39

标签: c++ clang abstract-syntax-tree matcher visitor

打开Clang框的两种强大方法。在决定使用一个而不是另一个时应该考虑什么?

Clang网站提供了一些有关如何使用RecursiveASTVisitor来查找Decl AST节点的旧tutorial,以及有关如何使用{{1 }}找到一些ASTMatcher stmt。在这种情况下,他们可以实现的目标有很多重叠。

对于如上所述的简单任务,我发现for更方便,因为所使用的谓词简短且易于阅读。但是,对于更复杂的任务(例如源到源的转换),需要对整个翻译单元进行分析。实现访客功能似乎是一种更好的方法。因为我的ASTMatcher中的谓词往往变得冗长且难以理解。也许有一种将ASTMatcher与lang和复杂谓词一起使用的有效方法。我对此表示感谢。由于ASTMatcher是在以后引入的,它打算取代旧的ASTMatcher方法吗?

1 个答案:

答案 0 :(得分:1)

好问题。有时,匹配器对于某种类型的模式是不可行的,这种模式涉及可变数量的AST节点以及您要查找的两种模式之间的复杂性。这是一个示例:

例如,匹配名称为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'

用于单个功能。据我所知,在定义中找到变量y之前,没有简单的方法来匹配所有methoddecls和一个通配符数目的stmts。为此,最好使用AST访问者模式。