我可以使用recursivevisitor类遍历clang AST的特定子树,但我想要做的是按节点遍历clang AST节点。
如果有人能帮助我,我真的很感激。
提前致谢。
答案 0 :(得分:16)
RecursiveASTVisitor可以满足您的需求。
为您的RecursiveASTVisitor`派生类(例如MyClass)实现member methods TraverseDecl(Decl *x)
,TraverseStmt(Stmt *x)
和TraverseType(QualType x)
将会起到作用。合并后,这三种方法将带您进入AST中的每个节点。
示例:
class MyClass : public RecursiveASTVisitor<MyClass> {
public:
bool TraverseDecl(Decl *D) {
// your logic here
RecursiveASTVisitor<MyClass>::TraverseDecl(D); // Forward to base class
return true; // Return false to stop the AST analyzing
}
bool TraverseStmt(Stmt *x) {
// your logic here
RecursiveASTVisitor<MyClass>::TraverseStmt(x);
return true;
}
bool TraverseType(QualType x) {
// your logic here
RecursiveASTVisitor<MyClass>::TraverseType(x);
return true;
}
};