summaryrefslogtreecommitdiff
path: root/paper/While/SimpleParse.icl
diff options
context:
space:
mode:
Diffstat (limited to 'paper/While/SimpleParse.icl')
-rw-r--r--paper/While/SimpleParse.icl26
1 files changed, 26 insertions, 0 deletions
diff --git a/paper/While/SimpleParse.icl b/paper/While/SimpleParse.icl
new file mode 100644
index 0000000..eca001a
--- /dev/null
+++ b/paper/While/SimpleParse.icl
@@ -0,0 +1,26 @@
+implementation module SimpleParse
+
+import StdList, StdTuple
+from StdFunc import o
+
+import Yard
+import WhileCommon
+import WhileLexer
+import Simple
+
+instance parse Stm
+where
+ parse cs = fst (runParser parser cs)
+ where
+ parser :: Parser Token Stm
+ parser = liftM2 Compose parser` (item CompToken *> parser) <|> parser`
+
+ 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)
+
+ toVar (VarToken v) = v
+ isVarToken (VarToken _) = True; isVarToken _ = False