打开Clang框的两种强大方法。在决定使用一个而不是另一个时应该考虑什么?
Clang网站提供了一些有关如何使用RecursiveASTVisitor
来查找Decl
AST节点的旧tutorial,以及有关如何使用{{1 }}找到一些ASTMatcher
stmt。在这种情况下,他们可以实现的目标有很多重叠。
对于如上所述的简单任务,我发现for
更方便,因为所使用的谓词简短且易于阅读。但是,对于更复杂的任务(例如源到源的转换),需要对整个翻译单元进行分析。实现访客功能似乎是一种更好的方法。因为我的ASTMatcher
中的谓词往往变得冗长且难以理解。也许有一种将ASTMatcher
与lang和复杂谓词一起使用的有效方法。我对此表示感谢。由于ASTMatcher
是在以后引入的,它打算取代旧的ASTMatcher
方法吗?
答案 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访问者模式。