diff options
Diffstat (limited to 'paper/While/SimpleParse.icl')
-rw-r--r-- | paper/While/SimpleParse.icl | 26 |
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 |