(语法树)递归遍历树底向上与当前自上而下的路径
-
21-09-2019 - |
题
我有一个抽象语法树,我需要迭代。 AST是由柠檬口到PHP 产生。
现在“正常”,我会用品牌做新的,有光泽(PHP 5.3.1)SPL类,它是这样的:
$it = new \RecursiveIteratorIterator(
new \RecursiveArrayIterator($ast['rule']),
\RecursiveIteratorIterator::SELF_FIRST);
其实,这就是我已经在做,其中因素研究粗糙型整个树的代码的另一部分(即它可以是一个分配,条件等)。现在抛开细节,唯一重要的事情就是迭代完成RecursiveIteratorIterator :: SELF_FIRST,就是自上而下的。
让我们回到我的问题,我需要遍历的AST自下而上的,就是像RecursiveIteratorIterator :: CHILD_FIRST,为了做一些替换和优化树。
的问题是,这些操作需上下文感知,即我需要的路径下降到当前节点。因为我想重复自下而上,我不能与RecursiveIteratorIterator。
好考虑它的第二个。我想要遍历自下而上和有当前节点的自顶向下的上下文(堆叠),在每一次迭代。技术上讲,它应该是可能的,因为RecursiveIteratorIterator必须先去树的尾巴,以迭代向后。在其道路至尾部,它可以缓存的当前位置,并且简单地弹出元件,因为它从递归返回。
现在这是一个关键字:的缓存即可。这就是为什么我怀疑它应该有可能与另一SPL类:RecursiveCachingIterator
现在的问题是:是不是真的可能吗?如果是的话,怎么样?
我一直在试图解周围一些代码,但没有成功,该文档是稀少。真的,真的稀少。
<强>谁找到最优雅解决这个使用SPL,戴的帽子!你是PHP大师!
PS:如果现在还不清楚,我正在寻找的尽可能多的SPL(的再次的),使用尽可能。我知道我可以写我自己的递归函数与自定义堆栈,没有必要提醒我一下。
解决方案
我已成功地得到它的工作通过继承RecursiveIteratorIterator和:: endChildren(管理堆栈)和:: callGetChildren分别。也许这将帮助别人。脱帽向自己: - )