(Arbres de syntaxe) récursive itérer bottom-up sur les arbres avec le chemin de haut en bas en cours

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

Question

Je que je dois itérer. L'AST est générée par le de PHP .

« normalement », je le ferais avec la toute nouvelle et brillante (PHP 5.3.1) les classes SPL, et il ressemblerait à ceci:

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

En fait, c'est ce que je fais déjà dans une autre partie du code qui Déterminants un type rugueux de l'arbre entier (i.e. il peut être une affectation, une condition, etc.). Maintenant détails mis à part, la seule chose importante est l'itération est fait RecursiveIteratorIterator :: SELF_FIRST, qui est, de haut en bas.

Pour en revenir à mon problème, je dois itérer l'AST bottom-up, qui est quelque chose comme RecursiveIteratorIterator :: CHILD_FIRST, afin de faire des substitutions et des optimisations dans l'arborescence.

Le problème est, ces opérations doivent être sensible au contexte, à savoir que j'ai besoin le chemin vers le bas au noeud courant. Et comme je veux itérer bas vers le haut, je ne peux pas avoir cela avec RecursiveIteratorIterator.

Pensez-y bien à ce sujet pour une seconde. Je veux parcourir de bas en haut et d'avoir le contexte de haut en bas (une pile) du noeud courant, à chaque itération. Techniquement, il devrait être possible, puisque RecursiveIteratorIterator doit d'abord aller à la queue de l'arbre, pour itérer en arrière. Dans son chemin à la queue, il pourrait mettre en cache la position actuelle, et tout simplement sortir des éléments qu'il retourne de récursivité.

Maintenant, c'est un mot-clé: cache . Voilà pourquoi je pense qu'il devrait être possible avec une autre classe SPL:. RecursiveCachingIterator

La question est: est-il vraiment possible? Si oui, comment?

J'ai essayé de puzzle autour d'un code, sans succès, et la documentation est rare. Vraiment, vraiment rare.

Celui qui trouve la solution la plus élégante à ce en utilisant SPL, chapeau! Vous êtes un gourou de PHP!

PS: dans le cas où il n'est pas clair, je suis à la recherche de autant SPL ( re ) l'utilisation possible . Je sais que je pourrais écrire mes propres fonctions récursives avec une pile personnalisée, pas besoin de me rappeler que.

Était-ce utile?

La solution

J'ai réussi à le faire fonctionner en héritant RecursiveIteratorIterator et la gestion de la pile dans :: endChildren () et :: callGetChildren respectivement. Peut-être que cela aidera quelqu'un. Chapeau à moi-même: -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top