如何使用 RecursiveASTVisitor 在一个组合通道中同时进行前序和后序遍历

问题描述

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

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

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

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

这种组合遍历存在于 the Elsa project 中,它非常适合我的预期目的。我不可能是唯一想要这种组合遍历的人,所以我想知道 Clang 是否真的没有它,或者我只是不知道如何让 Clang 去做。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)