diff options
author | Camil Staps | 2016-05-10 21:26:34 +0200 |
---|---|---|
committer | Camil Staps | 2016-05-10 21:26:34 +0200 |
commit | 200d22269bdaaba0666962f5f0099faae26d7bf4 (patch) | |
tree | 73b7ea4bdc8820cc8fa92fa8eddf8656fd679b73 /paper | |
parent | Straightforward While lexer, parser and interpreter (diff) |
lint; cleanup While
Diffstat (limited to 'paper')
-rw-r--r-- | paper/While/Simple.icl | 17 | ||||
-rw-r--r-- | paper/While/SimpleParse.icl | 13 | ||||
-rwxr-xr-x | paper/While/SimpleTest | bin | 146304 -> 151472 bytes | |||
-rw-r--r-- | paper/While/SimpleTest.icl | 8 | ||||
-rw-r--r-- | paper/While/WhileCommon.icl | 18 |
5 files changed, 34 insertions, 22 deletions
diff --git a/paper/While/Simple.icl b/paper/While/Simple.icl index 9138f1f..84ffce7 100644 --- a/paper/While/Simple.icl +++ b/paper/While/Simple.icl @@ -15,8 +15,15 @@ where instance run Stm where - run (Ass v e) st = eval e st >>= \r -> pure (\w -> if (w==v) (pure r) (st w)) - run (If b s1 s2) st = eval b st >>= \r -> run (if r s1 s2) st - run w=:(While b s) st = eval b st >>= \r -> if r (run s st >>= \st` -> run w st`) (pure st) - run Skip st = pure st - run (Compose s1 s2) st = run s1 st >>= \st` -> run s2 st` + run (Ass v e) st + = eval e st >>= \r -> pure (\w -> if (w==v) (pure r) (st w)) + run (If b s1 s2) st + = eval b st >>= \r -> run (if r s1 s2) st + run w=:(While b s) st + = eval b st >>= \r -> if r + (run s st >>= \st` -> run w st`) + (pure st) + run Skip st + = pure st + run (Compose s1 s2) st + = run s1 st >>= run s2 diff --git a/paper/While/SimpleParse.icl b/paper/While/SimpleParse.icl index eca001a..316fcc3 100644 --- a/paper/While/SimpleParse.icl +++ b/paper/While/SimpleParse.icl @@ -18,9 +18,16 @@ where parser` :: Parser Token Stm parser` = item ParenOpen *> parser <* item ParenClose <|> item SkipToken *> pure Skip - <|> item IfToken *> liftM3 If pbexpr (item ThenToken *> parser) (item ElseToken *> parser`) - <|> item WhileToken *> liftM2 While pbexpr (item DoToken *> parser`) - <|> liftM2 Ass (toVar <$> satisfy isVarToken) (item AssToken *> paexpr) + <|> item IfToken *> liftM3 If + pbexpr + (item ThenToken *> parser) + (item ElseToken *> parser`) + <|> item WhileToken *> liftM2 While + pbexpr + (item DoToken *> parser`) + <|> liftM2 Ass + (toVar <$> satisfy isVarToken) + (item AssToken *> paexpr) toVar (VarToken v) = v isVarToken (VarToken _) = True; isVarToken _ = False diff --git a/paper/While/SimpleTest b/paper/While/SimpleTest Binary files differindex 8460f87..84f0fd0 100755 --- a/paper/While/SimpleTest +++ b/paper/While/SimpleTest diff --git a/paper/While/SimpleTest.icl b/paper/While/SimpleTest.icl index 045eb9e..3086012 100644 --- a/paper/While/SimpleTest.icl +++ b/paper/While/SimpleTest.icl @@ -6,8 +6,7 @@ import WhileLexer import Simple import SimpleParse -Start = toString <$> parsed -//Start = val "z" +Start = val "z" where lexed :: Either Error [Token] lexed = lex ['x := 30; z := 0; o := 1; s := 1; while s <= x do (z := z+1; o := o+2; s := s+o)'] @@ -15,8 +14,5 @@ where parsed :: Either Error Stm parsed = lexed >>= parse - ran :: Either Error State - ran = parsed >>= \pgm -> run pgm zero - val :: Var -> Either Error Int - val v = ran >>= eval (Var v) + val v = parsed >>= \pgm -> run pgm zero >>= eval (Var v) 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 |