Lx0: Prototyp -- AST und Treewalker
Im Lx0-Prototyp sind Ausdrücke mit + und *, print expr, if 1 = 1 und Variablen dazugekommen. Ging aber nur zäh voran.
Problem war, dass nach Hinzufügen der fehlerhaften Version von:
ifStmt
: 'if' condExpr 'then' block 'endif' -> ^('if' condExpr block)
;
zur Generierung des abstrakten Syntaxbaums erst einmal gar nichts mehr funktioniert hat -- eigentlich dachte ich ja, ich hätte die Baumgenerierung mit ANTLR 3 bereits verstanden, weils bisher funktioniert hatte.
Ich habe also ein zweites Mal die beiden Kapitel zu Trees im
The Definitive ANTLR Reference-Buch gelesen. Fehler war, dass ich die beiden Varianten
zur Erzeugung der Bäume mit Operatoren oder Rewrite Rules zu sehr
durcheinander gemischt hatte. Bei den Operatoren steht der ^
zur Kennzeichnung einer Wurzel hinter der Bezeichnung und bei den
Rewrite Rules davor. Das ging bei mit durcheinander. Nun setze
ich auf Rewrite Rules und benutze nur in ein paar Fällen
wie bei expr die Operatorenschreibweise, weil sie in den
Fällen kompakter und besser lesbar ist.
AST und Treewalker
Im Gegensatz zu den bisherigen ANTLR 3-Beispielen benutze ich für den Lx0-Prototyp zusätzlich einen abstrakten Syntaxbaum, der dann von einen oder mehreren Treewalkern durchlaufen wird -- damit wird der Compileraufbau flexibler.
In ANTLR 3 können die Treewalker mit einer Grammatik definiert werden, die sieht der des AST sehr ähnlich, beide haben aber eine vollkommen andere Aufgabe.
Grammar.g dient zum Aufbau des AST
und TreeWalker.g zum Durchlaufen des
AST. In Grammar.g steht options {output=AST; und
TreeWalker.g beginnt mit tree grammar TreeWalker;.
Der komplette Quelltext steht in Subversion.
