From: Luke Lau Date: Sun, 10 Mar 2019 15:52:06 +0000 (+0000) Subject: Parse if statements X-Git-Url: https://git.lukelau.me/?p=kaleidoscope-hs-old.git;a=commitdiff_plain;h=fff481b022d2d5ed24ce3faf686ca783e7860741 Parse if statements --- diff --git a/AST.hs b/AST.hs index 1965ae6..7204136 100644 --- a/AST.hs +++ b/AST.hs @@ -8,7 +8,7 @@ newtype Program = Program [AST] deriving Show instance Read Program where - readPrec = fmap Program $ lift $ sepBy1 (readPrec_to_P readPrec 0) $ do + readPrec = fmap Program $ lift $ sepBy1 (readS_to_P reads) $ do skipSpaces char ';' skipSpaces @@ -20,8 +20,9 @@ data Expr = Num Float | BinOp BinOpType Expr Expr | Var String | Call String [Expr] + | If Expr Expr Expr deriving Show -data BinOpType = Add | Sub | Mul +data BinOpType = Add | Sub | Mul | Cmp Ordering deriving Show instance Read AST where @@ -41,9 +42,13 @@ instance Read Expr where readPrec = choice [ parseNum , parseVar , parseCall - , parseBinOp '+' Add - , parseBinOp '-' Sub - , parseBinOp '*' Mul + , parseIf + , parseBinOp "+" Add + , parseBinOp "-" Sub + , parseBinOp "*" Mul + , parseBinOp ">" (Cmp GT) + , parseBinOp "<" (Cmp LT) + , parseBinOp "==" (Cmp EQ) ] where parseNum = Num <$> readPrec parseVar = Var <$> lift (munch1 isAlpha) @@ -53,11 +58,27 @@ instance Read Expr where sepBy (readS_to_P reads) (skipSpaces >> char ',' >> skipSpaces) return (Call func params) - parseBinOp c typ = step $ do + parseBinOp s typ = step $ do a <- prec 11 readPrec lift $ do skipSpaces - char c + string s skipSpaces b <- readPrec return (BinOp typ a b) + parseIf = do + lift $ do + string "if" + skipSpaces + cond <- step readPrec + lift $ do + skipSpaces + string "then" + skipSpaces + thenE <- step readPrec + lift $ do + skipSpaces + string "else" + skipSpaces + elseE <- step readPrec + return (If cond thenE elseE)