diff options
Diffstat (limited to 'paper/While/WhileCommon.icl')
-rw-r--r-- | paper/While/WhileCommon.icl | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/paper/While/WhileCommon.icl b/paper/While/WhileCommon.icl index 353f997..a76458f 100644 --- a/paper/While/WhileCommon.icl +++ b/paper/While/WhileCommon.icl @@ -40,21 +40,22 @@ instance eval AExpr Int where eval (Var v) st = st v eval (Lit i) st = pure i - eval (Op a1 op a2) st = eval a1 st >>= \r1 -> eval a2 st >>= \r2 -> toOp op r1 r2 + eval (Op a1 op a2) st = eval a1 st >>= \r1 -> eval a2 st >>= toOp op r1 where toOp :: Operator -> Int Int -> Either Error Int toOp Add = \i j -> pure (i + j) toOp Sub = \i j -> pure (i - j) toOp Mul = \i j -> pure (i * j) - toOp Div = \i j -> if (j == 0) (Left (Runtime "Division by 0")) (pure (i / j)) + toOp Div = \i j -> + if (j == 0) (Left (Runtime "Division by 0")) (pure (i / j)) instance eval BExpr Bool where eval (Bool b) st = pure b eval (Not b) st = eval b st >>= pure o not - eval (And b1 b2) st = eval b1 st >>= \r -> eval b2 st >>= pure o ((&&) r) - eval (Or b1 b2) st = eval b1 st >>= \r -> eval b2 st >>= pure o ((||) r) - eval (Comp a1 cmp a2) st = eval a1 st >>= \r -> eval a2 st >>= pure o (toCmp cmp r) + eval (And b1 b2) st = liftM2 (&&) (eval b1 st) (eval b2 st) + eval (Or b1 b2) st = liftM2 (||) (eval b1 st) (eval b2 st) + eval (Comp a1 cmp a2) st = liftM2 (toCmp cmp) (eval a1 st) (eval a2 st) where toCmp :: Comparator -> Int Int -> Bool toCmp Eq = \i j -> i == j @@ -81,9 +82,10 @@ paref = Var o toVar <$> satisfy isVarToken <|> (\(LiteralToken i) -> Lit i) <$> satisfy isLiteralToken <|> item ParenOpen *> paexpr <* item ParenClose -toComp EqToken = Eq; toComp NeToken = Ne; toComp LeToken = Le -toComp LtToken = Lt; toComp GeToken = Ge; toComp GtToken = Lt -isCompToken t = isMember t [EqToken, NeToken, LeToken, LtToken, GeToken, GtToken] +toComp EqToken = Eq; toComp NeToken = Ne +toComp LeToken = Le; toComp LtToken = Lt +toComp GeToken = Ge; toComp GtToken = Gt +isCompToken t = isMember t [EqToken,NeToken,LeToken,LtToken,GeToken,GtToken] toBool (BoolToken b) = Bool b isBoolToken (BoolToken _) = True; isBoolToken _ = False toVar (VarToken v) = v |