打开Clang框的两种强大方法。在决定使用一个而不是另一个时应该考虑什么?
Clang网站提供了一些有关如何使用RecursiveASTVisitor
来查找Decl
AST节点的旧tutorial,以及一些有关如何使用ASTMatcher
来查找一些for
stmt的新tutorial。在这种情况下,他们可以实现的目标有很多重叠。
对于上面提到的简单任务,我发现ASTMatcher
更方便,因为所用谓词简短且易于阅读。但是,对于诸如源到源转换之类的更复杂的任务,需要对整个翻译单元进行分析。实现Visitor功能似乎是一种更好的方法。因为我的ASTMatcher
中的谓词往往会变得冗长且难以理解。也许有一种将ASTMatcher
与lang和复杂谓词一起使用的有效方法。我对此表示感谢。由于ASTMatcher
是在以后引入的,是否打算替换旧的AST Visitor
方法?
最佳答案
好问题。有时,匹配器对于某种类型的模式是不可行的,这种模式涉及可变数量的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访问者模式将是您的最大利益。关于c++ - Clang AST Matcher和AST Visitor之间有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58221502/