C++ 如何遍历clang AST的所有节点?
我可以使用recursivevisitor类遍历clang AST的特定子树,但我要做的是逐节点遍历clang AST 如果有人能帮我,我会非常感激的C++ 如何遍历clang AST的所有节点?,c++,clang,abstract-syntax-tree,traversal,C++,Clang,Abstract Syntax Tree,Traversal,我可以使用recursivevisitor类遍历clang AST的特定子树,但我要做的是逐节点遍历clang AST 如果有人能帮我,我会非常感激的 提前感谢。递归访客可以做您需要的事情 为递归AstVisitor派生类(例如MyClass)实现TraverseDecl(Decl*x)、TraverseStmt(Stmt*x)和TraverseType(QualType x)就可以了。这三种方法结合在一起,将把您带到AST中的每个节点 例如: class MyClass : public Re
提前感谢。递归访客可以做您需要的事情 为递归AstVisitor派生类(例如MyClass)实现
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;
}
};
class MyClass:public RecursiveASTVisitor{
公众:
布尔遍历数据中心(Decl*D){
//你的逻辑在这里
RecursiveASTVisitor::TraverseDecl(D);//转发到基类
return true;//返回false停止AST分析
}
布尔遍历测试(Stmt*x){
//你的逻辑在这里
RecursiveASTVisitor::TraverseStmt(x);
返回true;
}
布尔遍历类型(QualType x){
//你的逻辑在这里
RecursiveASTVisitor::TraverseType(x);
返回true;
}
};
RecursiveASTVisitor有什么问题?@m.s.RecursiveASTVisitor没有什么问题,只是它只遍历特定的子树,例如像AST中的所有方法调用集一样,但我想要的是逐个遍历AST的所有节点,提取关于每个节点的一些信息集。这就是为什么我需要一个方法逐节点遍历AST。您可以使用根节点的dump():Context.getTranslationUnitDecl()->dump()。如果这不能满足您的需要,您可以阅读和编辑dump()源代码。这些不也应该实施吗?或者会重复遍历吗?您可以使用任何方法,但通常您可能希望遍历最抽象的类型(Expr、Stmt),例如在IfStmt中,如果您希望有条件地遍历Then/Else部分(而不考虑它们的实际类型)。