------------------------------------------------------------------------ -- Beispiel eines Moduls, der das Modul Stack importiert: -- Auswertung von Ausdrücken, die als lineare Listen in Postfix-Notation -- dargestellt sind. -- Zur Vorlesung 26.11.98 ------------------------------------------------------------------------ module PInterpr where import Stack type Var = String type FName = String type BinOp = BinFun type BinFun = Int -> Int -> Int -- binäre Basis-Operationen type UnFun = Int -> Int -- unäre Funktionen; wird nur für programm- -- definierte Funktionen benutzt -- Assoziationslisten für: type AListe = [(Var,Int)] -- Variablen type FListe = [(FName,UnFun)] -- Programm-definierte Funktionen -- generische Such-Funktion finde :: [(String,b)] -> String -> b finde [] nn = error "leer" -- dieser Fall sollte für eine richtig -- konstruierte Liste nicht vorkommen. finde ((name,v):al) nn = if name==nn then v else finde al nn funval :: FListe -> FName -> UnFun funval fl nn = finde fl nn -- Der Datentyp "Item" erlaubt es, zwischen den verschiedenen Arten von -- Listen-Elementen zu unterscheiden. data Item = AConst Int | BOp BinOp | UOp FName | AVar Var deriving (Show) type PostAusdr = [Item] wert :: PostAusdr -> Int -- die eigentliche Auswrtungsfunktion wert au = wert1 empty au -- der Werte-Keller wird als leer initialisiert. where wert1 st [] = top st wert1 st (item:lst) = wert1 (newst st item) lst newst st (AConst n) = push n st newst st (AVar nn) = push (finde val nn) st newst st (BOp op) = let (item1,st1) = pop2 st in let (item2,st2) = pop2 st1 in push (op item2 item1) st2 newst st (UOp op) = let (item1,st1) = pop2 st in push ((funval env op) item1) st1 -- Diese Definition der Funktion wert stützt sich auf 2 konstante Listen, -- val :: AListe -- und -- env :: FListe -- ab. Mögliche Werte sind für die Beispiele: val = [("z",-4),("x",3),("y",5),("a",7),("b",3)] env = [("f1", \x -> x + 1)] -- Beispeil-Argumente für wert: -- [AVar "x", AVar "y", UOp "f1", BOp (+), AVar "x", AVar "z", BOp (-), BOp (*)] -- [AConst 3, AConst 4, BOp (+)] -- [AVar "a", AVar "b", UOp "f1", BOp (*)] -- ------------------------------------------------------------------------