微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用 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 举报,一经查实,本站将立刻删除。