Frage

Ich habe einen abstrakten Syntaxbaum die ich Iterierte müssen. Der AST wird erzeugt durch die Zitrone Port PHP .

„normal“, würde ich es tun mit dem brandneuen und glänzend (PHP 5.3.1) SPL Klassen, und es würde so aussehen:

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

Eigentlich ist das, was ich bereits in einem anderen Teil des Codes zu tun, die eine grobe Art des ganzen Baumes Determinanten (das heißt es kann eine Zuordnung, eine Bedingung, etc). Jetzt beiseite Details, die einzige wichtige Sache, die Iteration ist, ist geschehen RecursiveIteratorIterator :: SELF_FIRST, das heißt, von oben nach unten.

Gehen wir zurück zu meinem Problem, ich muss Iterierte die AST von unten nach oben, das heißt, so etwas wie RecursiveIteratorIterator :: CHILD_FIRST, um einige Ersetzungen und Optimierungen im Baum zu tun.

Das Problem ist, müssen diese Operationen kontext bewusst sein, das heißt ich brauche den Weg nach unten auf den aktuellen Knoten. Und da ich von unten nach oben zu durchlaufen will, kann ich nicht habe, dass mit RecursiveIteratorIterator.

denken Nun darüber für eine Sekunde. Ich möchte von unten nach oben zu durchlaufen und den Top-Down-Kontext haben (a stack) des aktuellen Knotens, bei jeder Iteration. Technisch sollte es möglich sein, da RecursiveIteratorIterator zuerst an den Schwanz des Baumes gehen muss, um zu Iterierte rückwärts. In seinem Weg zum Schwanz, könnte es die aktuelle Position Cache und einfach Elemente aus Pop, wie es wieder von Rekursion zurück.

Nun ist dies ein Stichwort: Cache . Aus diesem Grund vermute ich, sollte es mit einem anderen SPL-Klasse möglich sein. RecursiveCachingIterator

Die Frage ist: ist es wirklich möglich? Wenn ja, wie?

Ich habe versucht, mit einigem Code rätseln herum, ohne Erfolg, und die Dokumentation ist knapp. Wirklich, wirklich knapp.

Wer findet die eleganteste Lösung für diesen mit SPL, Hut ab! Du bist ein PHP-Guru!

PS: falls es nicht klar ist, ich bin auf der Suche nach so viel SPL ( re ) Verwendung wie möglich . Ich weiß, ich könnte meine eigenen rekursiven Funktionen mit einem benutzerdefinierten Stack schreiben, keine Notwendigkeit erinnern mich darüber.

War es hilfreich?

Lösung

Ich habe es geschafft jeweils durch Vererbungs RecursiveIteratorIterator und Verwaltung der Stapel in :: endChildren () und :: callGetChildren zum Laufen zu bringen. Vielleicht wird dies jemand helfen. Hut ab vor mir: -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top