Clang 如何使用RecursiveASTVisitor在一个组合过程中执行预顺序和后顺序遍历

Clang 如何使用RecursiveASTVisitor在一个组合过程中执行预顺序和后顺序遍历,clang,clang++,clang-format,clang-static-analyzer,Clang,Clang++,Clang Format,Clang Static Analyzer,我成功地使用了Clang的RecursiveASTVisitor对Clang的AST进行了顺序前遍历和顺序后遍历。对于post-order遍历访问者,我定义了一个shouldtranversepostorder(),它返回true,并返回pre-order遍历的相反结果 我发现我真的很想做一个组合遍历,既有前序遍历,也有后序遍历。也就是说,如果存在Stmt节点,我希望遍历(1)调用preVisitStmt(Stmt*节点),然后(2)访问Stmt子节点的节点,然后(3)调用postVisitSt

我成功地使用了Clang的RecursiveASTVisitor对Clang的AST进行了顺序前遍历和顺序后遍历。对于post-order遍历访问者,我定义了一个shouldtranversepostorder(),它返回true,并返回pre-order遍历的相反结果

我发现我真的很想做一个组合遍历,既有前序遍历,也有后序遍历。也就是说,如果存在Stmt节点,我希望遍历(1)调用preVisitStmt(Stmt*节点),然后(2)访问Stmt子节点的节点,然后(3)调用postVisitStmt(Stmt*节点)

这样的组合遍历非常方便,因为在我的访问者中,我可以维护一个上下文堆栈,在preVisitStmt()上推送,在postVisitStmt()上弹出。如果没有这个组合访问者,我目前正在进行后序遍历,然后是预序遍历,我正在维护许多全局映射以记录状态,以便这些遍历可以相互通信;我觉得这很尴尬

此外,如果preVisitStmt(Stmt*)函数可以返回false来修剪子树的遍历,这将非常方便

这种组合遍历存在于中,对于我的预期目的,它非常有效。我不是唯一一个想要这种组合遍历的人,所以我想知道它是否真的不存在于Clang中,或者我只是不知道如何让Clang来完成它