#include "head.html"
Lokale Deklaration von Variablen
Wir wollen den arithmetischen Interpreter erweitern.
Wir gestatten lokale Deklarationen der Form
let { x = 3 * 4 ; y = 7 } in ( x - y ).
Abstrakte Syntax festlegen
Wir müssen dafür den passenden Syntaxtyp definieren
#include "../src/Let_Type.hs"
Abstrakte Syntax anzeigen
Wir wollen uns die Syntaxbäume auch anschauen,
dazu erzeugen wir einen Rose-Tree und zeichnen diesen wie gehabt
#include "../src/Let_Form.hs"
Konkrete Syntax festlegen
Wir erweitern auch den Parser durch Hinzufügen eines Teil-Parsers
für Bindungen:
atom :: Parser Term
atom = do n <- natural
return $ Constant n
`plus` paren term
`plus` bindung
`plus` do n <- name
return $ Var n
bindung :: Parser Term
bindung = do
keyword "let"
nts <- brace $ sepBy (operator ";")
$ do n <- name
operator "="
t <- term
return (n, t)
keyword "in"
body <- term
return $ Let nts body
(kompletter Quelltext hier)
Semantik
Wir erweitern auch die Semantik-Funktion.
Jetzt kann ja der Fall eintreten, daß wir den Wert einer Variablen benötigen.
Diese Werte bewahren wir in einer Umgebung auf.
#include "../src/Env.hs"
Tatsächlich benutzen wir Listen von Umgebungen,
und verwenden jeweils die erste sichtbare Bindung.
Das Auswerten eines Ausdrucks geht dann so:
#include "../src/Let_Eval.hs"
Das packen wir noch in ein Hauptprogramm
#include "../src/Let_Main.hs"
Wie weiter?
Als nächstes wünschen wir uns lokale Definitionen von Funktionen.
#include "foot.html"