(Árboles de sintaxis) la iteración recursiva sobre los árboles de abajo hacia arriba con el camino de arriba hacia abajo actual

StackOverflow https://stackoverflow.com/questions/2095680

Pregunta

Tengo una árbol de sintaxis abstracta que necesito para iterar. El AST es generado por el href="http://pear.php.net/package/PHP_ParserGenerator" rel="nofollow noreferrer"> puerto .

Ahora "normalmente", me gustaría hacerlo con la marca nuevos y brillantes (PHP 5.3.1) clases de SPL, y se vería así:

$it = new \RecursiveIteratorIterator(
  new \RecursiveArrayIterator($ast['rule']),
  \RecursiveIteratorIterator::SELF_FIRST);

En realidad, eso es lo que yo ya estoy haciendo en la otra parte del código que Determinantes un tipo bruto de todo el árbol (es decir, que puede ser una tarea, una condición, etc). Ahora detalles de lado, lo único importante es la iteración es RecursiveIteratorIterator hecho :: SELF_FIRST, es decir, de arriba hacia abajo.

Volviendo a mi problema, necesito iterar el AST de abajo hacia arriba, es decir, algo así como RecursiveIteratorIterator :: CHILD_FIRST, con el fin de hacer algunas sustituciones y optimizaciones en el árbol.

El problema es, estas operaciones tiene que ser sensible al contexto, es decir, que necesito el camino hasta el nodo actual. Y ya que quiero recorrer abajo hacia arriba, no puedo tener eso con RecursiveIteratorIterator.

Bueno pensar en ello por un segundo. Quiero recorrer abajo hacia arriba y tener el contexto de arriba hacia abajo (una pila) del nodo actual, en cada iteración. Técnicamente, debería ser posible, ya que RecursiveIteratorIterator primero debe ir a la cola del árbol, con el fin de iterar hacia atrás. En su camino hacia la cola, se podría almacenar en caché la posición actual, y bastará con extraer elementos a medida que regresa de vuelta de la recursividad.

Ahora bien, esta es una palabra clave: almacenamiento en caché . Esto es por lo que sospecho que debería ser posible con otra clase SPL:. RecursiveCachingIterator

La pregunta es: ¿es realmente posible? En caso afirmativo, ¿cómo?

he estado tratando de descifrar un poco con algo de código, sin éxito, y la documentación es escasa. Muy, muy escasos.

El que encuentre la solución más elegante a este uso de SPL, me quito el sombrero! Usted es un gurú de PHP!

PD: en caso de que no está claro, estoy buscando tanto SPL ( re ) el uso como sea posible . Sé que podría escribir mis propias funciones recursivas con una pila de encargo, no hay necesidad de que me recuerde por eso.

¿Fue útil?

Solución

he logrado conseguir que funcione heredando RecursiveIteratorIterator y la gestión de la pila en :: endChildren () y :: callGetChildren respectivamente. Tal vez esto ayude a alguien. Felicitaciones a mí mismo: -)

scroll top