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

问题描述 投票:2回答:1

打开Clang框的两种有效方法。在决定使用另一种时应该考虑什么?

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

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

c++ clang abstract-syntax-tree matcher visitor
1个回答
0
投票

好问题。有时,匹配器对于某种类型的模式是不可行的,这种模式涉及可变数量的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访问者模式将是您的最大利益。

© www.soinside.com 2019 - 2024. All rights reserved.