summaryrefslogtreecommitdiff
path: root/paper
diff options
context:
space:
mode:
authorCamil Staps2016-05-10 21:26:34 +0200
committerCamil Staps2016-05-10 21:26:34 +0200
commit200d22269bdaaba0666962f5f0099faae26d7bf4 (patch)
tree73b7ea4bdc8820cc8fa92fa8eddf8656fd679b73 /paper
parentStraightforward While lexer, parser and interpreter (diff)
lint; cleanup While
Diffstat (limited to 'paper')
-rw-r--r--paper/While/Simple.icl17
-rw-r--r--paper/While/SimpleParse.icl13
-rwxr-xr-xpaper/While/SimpleTestbin146304 -> 151472 bytes
-rw-r--r--paper/While/SimpleTest.icl8
-rw-r--r--paper/While/WhileCommon.icl18
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
index 8460f87..84f0fd0 100755
--- a/paper/While/SimpleTest
+++ b/paper/While/SimpleTest
Binary files differ
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