有两种强大的方法可以打开“棒棒糖”。在决定使用一个而不是另一个时,我应该考虑什么?
Clang网站提供了一些关于如何使用RecursiveASTVisitor查找Decl AST节点的旧tutorial,以及一些关于如何使用ASTMatcher查找for stmt的新tutorial。在这种情况下,它们可以实现的内容有很多重叠之处。
对于上面提到的简单任务,我发现ASTMatcher更方便,因为used谓词简短且易于阅读。然而,对于更复杂的任务,如源到源转换,需要对整个翻译单元进行分析。实现访问者函数似乎是一种更好的方法。因为我的ASTMatcher中的谓词往往会变得冗长且难以理解。也许有一种有效的方法可以将ASTMatcher与语言和复杂谓词一起使用。我很感谢你在这方面的建议。既然ASTMatcher是较晚引入的,是否打算取代旧的AST Visitor方法?
发布于 2020-06-12 09:19:01
问得好。有时,匹配器对于一种类型的模式是不可行的,该类型的模式涉及不同数量的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并匹配通配符数量的stmt,直到您在定义中找到一个变量stmt。对此使用AST访问者模式将是您最感兴趣的。
https://stackoverflow.com/questions/58221502
复制相似问题