我有一个抽象语法树,我需要迭代。 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分别。也许这将帮助别人。脱帽向自己: - )

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top