Ich schreibe gerade einen Spielzeug Compiler in Scala. Die Zielsprache selbst sieht wie eine Skala aus, ist aber ein offenes Feld für Experimente.Elegantes AST Modell
Nach mehreren großen Refactorings kann ich keinen guten Weg finden, meinen abstrakten Syntaxbaum zu modellieren. Ich würde gerne die Möglichkeiten von scalas Musterabgleich nutzen, das Problem ist, dass der Baum während des Kompilierungsprozesses bewegte Informationen (wie Typen, Symbole) mit sich führt.
ich ein paar Lösungen sehen, von denen keines Mir mag:
Fallklassen mit veränderbaren Feldern (ich glaube, der scala Compiler dies der Fall ist): Das Problem ist, dass diese Felder keine präsentieren Jede Stufe der Kompilierung und muss daher nulled (oder Option) und es wird wirklich schwer zu debuggen/schreiben Code. Wenn ich zum Beispiel nach der Typisierungsphase einen Knoten mit Null-Typ finde, fällt es mir sehr schwer, die Ursache des Fehlers zu finden.
große Zug/Fallklassenhierarchie: so etwas wie Knoten, NodeWithSymbol, NodeWithType, ... Scheint wie ein Schmerz mit
etwas komplett von Hand mit Extraktoren gefertigt zu schreiben und arbeiten
Ich bin mir auch nicht sicher, ob es eine gute Übung ist, mit einem vollständig unveränderlichen AST zu gehen, besonders in Scala, wo es keine implizite Freigabe gibt (weil der Compiler sich der Unveränderlichkeit nicht bewusst ist) und es Performances könnte den Baum die ganze Zeit zu kopieren .
Können Sie sich ein elegantes Muster vorstellen, um meinen Baum mit dem leistungsfähigen Typensystem von scala zu modellieren?
Vielleicht können Sie JetBrains MPS für einige Inspirationen betrachten? – Jan