X-Git-Url: https://git.lukelau.me/?p=kaleidoscope-hs-old.git;a=blobdiff_plain;f=AST.hs;h=6b9928d5b13fa0d67c848b8c3c0e446c2babb4f4;hp=720413652e4343740ad6268e0a866b0576e4c4aa;hb=4b03cb96fd234ca3e85581e218668f68afc16375;hpb=fff481b022d2d5ed24ce3faf686ca783e7860741 diff --git a/AST.hs b/AST.hs index 7204136..6b9928d 100644 --- a/AST.hs +++ b/AST.hs @@ -8,10 +8,14 @@ newtype Program = Program [AST] deriving Show instance Read Program where - readPrec = fmap Program $ lift $ sepBy1 (readS_to_P reads) $ do + readPrec = fmap Program $ lift $ do + asts <- sepBy1 (readS_to_P reads) $ do skipSpaces char ';' skipSpaces + optional $ char ';' + skipSpaces + return asts data AST = Function String [String] Expr | Eval Expr @@ -39,7 +43,8 @@ instance Read AST where return (Function name params body) instance Read Expr where - readPrec = choice [ parseNum + readPrec = choice [ parseParens + , parseNum , parseVar , parseCall , parseIf @@ -50,7 +55,9 @@ instance Read Expr where , parseBinOp "<" (Cmp LT) , parseBinOp "==" (Cmp EQ) ] - where parseNum = Num <$> readPrec + where parseParens = step $ lift $ + between (char '(') (char ')') (readS_to_P reads) + parseNum = Num <$> readPrec parseVar = Var <$> lift (munch1 isAlpha) parseCall = do func <- lift (munch1 isAlpha)