Home-Produkte-Testarea-Kontakt-Datenschutz-Aktualisiert: 30-Jun-2009
< Voriger Tag   Nächster Tag >

Dienstag, 30. Juni 2009

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.

[Direktlink]

< Voriger Tag   Nächster Tag >

  RSS V0.91

<Juni 2009 >
01020304050607
08091011121314
15161718192021
22232425262728
2930     

Home-Produkte-Testarea-Kontakt-Datenschutz-Aktualisiert: 30-Jun-2009
(C) 2000-2018 by Sven Drieling