2016-07-13 50 views
0

我需要遍历匹配的AST节点的所有祖先或后代,以便稍后使用该信息使输入源代码的某些部分变得轻松。 我试图寻找方法来做到这一点。我查看了ASTContext类的getParents成员函数。我可以使用它来升级AST层次结构来访问我当前匹配节点的所有祖先节点。但问题是,当我得到父节点时,我不再有该节点的上下文来尝试获取它的父节点。我可以尝试为新节点重建ASTContext,但如果可能的话,这似乎是另一项重大任务。 我正在寻找的最低NodeKind(C层中最低)是callExpr,我要找的最高的是functionDecl。 如何在匹配返回控制runMatchCallback后获得匹配AST节点的所有祖先或后代?获取匹配节点的所有祖先或后代

回答

0

可能会继续以递归方式访问父声明,直到达到TranslationUnitDecl,但是,我会建议实际迭代TranslateUnitDecl中的声明并改为使用FunctionDecl。

您可以创建一个递归函数,它可以找到翻译单元中的所有TagDecl,在您指定的FunctionDecl中搜索该类中的所有方法,并且还递归使用该TagDecl中的TagDecls,直到您没有剩下任何东西消耗。

这样可以让您更轻松地保存所需的特定AST节点的完整记录,并且可能不会令人困惑地编写。

但是,如果你选择工作方式落后,你可以尝试这样的事情(未经测试)

FunctionDecl *FD; 
DeclContext *PC = FD->getParent(); 
while (!isa<TranslationUnitDecl>(Decl::castFromDeclContext(PC))) { 
    //consume 

    PC = PC->getParent(); 
} 

的后代(儿童),你只需要转型为儿童和迭代类型。

相关问题