{ -- Parser mit Präzedenzen module Main where import ExpAlex -- von alex erzeugt, enthält Definition für Token-Typ } %name gaeParse %tokentype {Token} %token num { NumVal $$ _ } id { Id $$ _ } '+' { Plus _ } '*' { Times _ } '(' { OpenB _ } ')' { CloseB _ } '!' { LexErr _ } -- Präzedenzen (aufsteigend) und ihre "Richtung": %left '+' %right '*' %% Exp :: { ExpTree } Exp : id { Var $1 } | num { Const $1 } | Exp '+' Exp { AddNode $1 $3 } | Exp '*' Exp { MulNode $1 $3 } | '(' Exp ')' { $2 } { happyError [] = error "Parse-Fehler: unerwartetes Dateiende." happyError (x:xs) = error ("Parse-Fehler in Zeile " ++ show (tokenLine x) ++ ": Token " ++ show x) data ExpTree = Const Int | Var String | MulNode ExpTree ExpTree | AddNode ExpTree ExpTree deriving Show }