projects
/
kaleidoscope-hs-old.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Handle ending ;
[kaleidoscope-hs-old.git]
/
AST.hs
diff --git
a/AST.hs
b/AST.hs
index 720413652e4343740ad6268e0a866b0576e4c4aa..6b9928d5b13fa0d67c848b8c3c0e446c2babb4f4 100644
(file)
--- a/
AST.hs
+++ b/
AST.hs
@@
-8,10
+8,14
@@
newtype Program = Program [AST]
deriving Show
instance Read Program where
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
skipSpaces
char ';'
skipSpaces
+ optional $ char ';'
+ skipSpaces
+ return asts
data AST = Function String [String] Expr
| Eval Expr
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
return (Function name params body)
instance Read Expr where
- readPrec = choice [ parseNum
+ readPrec = choice [ parseParens
+ , parseNum
, parseVar
, parseCall
, parseIf
, parseVar
, parseCall
, parseIf
@@
-50,7
+55,9
@@
instance Read Expr where
, parseBinOp "<" (Cmp LT)
, parseBinOp "==" (Cmp EQ)
]
, 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)
parseVar = Var <$> lift (munch1 isAlpha)
parseCall = do
func <- lift (munch1 isAlpha)