module Absy( Expr(..) , Range(..) , RangeOp(..) , BinOp(..) , BoolOp(..) , CompOp(..) , BoolExpr(..) ) where data Expr = Apply BinOp Expr Expr | Number Double | Variable String Int | UMinus Expr | Conditional BoolExpr Expr Expr | ApplyRange RangeOp Range deriving Eq data Range = Range String Int String Int deriving Eq data RangeOp = Sum | Mult | Count deriving Eq data BinOp = Plus | Minus | Times | Div deriving Eq data BoolOp = And | Or deriving Eq data CompOp = Eq | Less deriving Eq data BoolExpr = Compare CompOp Expr Expr | BApply BoolOp BoolExpr BoolExpr | Negate BoolExpr deriving Eq -- -- The Show instances -- -- NB. Nicht in der Aufgabenstellung gefordert! instance Show Expr where showsPrec d (Apply op e1 e2) = let p = precBinOp op in showParen (d> p) $ showsPrec p e1 . shows op . showsPrec p e2 showsPrec d (Number i) = shows i showsPrec d (UMinus e) = showParen (d> 7) $ showString "-" . showsPrec 7 e showsPrec d (Variable r i) = showString r . shows i showsPrec d (Conditional be e1 e2) = showParen (d> 5) $ showString "if " . showsPrec 0 be . showString " then " . showsPrec 5 e1 . showString " else " . showsPrec 5 e2 showsPrec d (ApplyRange rop r) = showsPrec 0 rop . showString "(" . showsPrec 0 r . showString ")" instance Show BoolExpr where showsPrec d (BApply bop be1 be2) = let p = precBoolOp bop in showParen (d> p) $ showsPrec p be1 . shows bop . showsPrec p be2 showsPrec d (Compare cop e1 e2) = showParen (d> 5) $ showsPrec 5 e1 . shows cop . showsPrec 5 e2 showsPrec d (Negate be) = showParen (d> 5) $ showString "!" . showsPrec 5 be instance Show Range where showsPrec d (Range fv fi tv ti) = showString fv . shows fi . showString ":" . showString tv . shows ti instance Show BinOp where show Plus = " + " show Minus = " - " show Times = " * " show Div = " / " instance Show CompOp where show Eq = " = " show Less = " < " instance Show RangeOp where show Sum = "sum" show Mult = "mult" show Count = "count" instance Show BoolOp where show And = " & " show Or = " | " precBoolOp :: BoolOp-> Int precBoolOp And = 4 precBoolOp Or = 3 -- compops are 5 precBinOp :: BinOp -> Int precBinOp Plus = 6 precBinOp Minus = 6 precBinOp Times = 7 precBinOp Div = 7