2017-10-09 2 views
0

Nach dem Parsen des Quellcodes mit megaparsec habe ich einen abstrakten Syntaxbaum. In einer zweiten Stufe berechne ich Aggregate auf jedem Teilbaum, z. die Liste der Variablen, die es enthält, indem Blattwerte zusammengefasst werden, und ich möchte sie irgendwo speichern, so dass ich sie später nicht neu berechnen muss. Wie soll ich das machen?Wie man Baumaggregate speichert

Ich habe diese Optionen berücksichtigt.

  • Fügen Sie jedem Knoten einen Aggregatwert hinzu. Ich müsste jeden Knotendatentyp ändern.
  • Umschließen Sie jeden Knotendatentyp in einem allgemeinen Aggregatdatentyp.
  • Verwenden Generics-Knoten-Datentyp, mit Aggregaten, aber ich fürchte, Kompilierung Fehlermeldungen werden nicht so klar sein.
  • Erstellen Sie einen "Schattenbaum" mit der gleichen Topologie wie der AST, aber mit den Aggregaten.

Was soll ich wählen?

+0

Sie können auch einfach eine Funktion erstellen, die den Aggregatwert für einen Teilbaum berechnet und diese Funktion memoisiert. Dies wäre für den vorhandenen Code weniger störend und vermeidet auch eine Neuberechnung. – mschmidt

+0

Zwei weitere Alternativen: 1) modifiziere deine AST, um "Fix" https://hackage.haskell.org/package/recursion-schemes-5.0.2/docs/Data-Functor-Foldable.html#t:Fix und dann zu verwenden Ändern Sie die Anmerkungsfunktion, um 'Cofree' zu ​​verwenden. https://stackoverflow.com/questions/38462563/how-to-work-with-ast-with-cofree-annotation 2) die Bäume, die wachsen https://www.microsoft.com/en-us/research/ wp-content/uploads/2016/11/trees-that-grow.pdf, das Felder zu Ihrem AST hinzufügt, die sich mit jeder Phase ändern können. – danidiaz

+0

@danidiaz Ich habe nie verstanden, warum Leute scheinen wollen, 'Cofree' für die Annotation eines Baumes, wenn' Produkt' viel bessere Arbeit leistet ... –

Antwort