projects
/
kaleidoscope-hs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Parse for loops
[kaleidoscope-hs.git]
/
AST.hs
diff --git
a/AST.hs
b/AST.hs
index ae18a52347ce91c37336a06f891bae690ba691ec..b019a2a2078f91c18a5046f63e10676f2c40d5aa 100644
(file)
--- a/
AST.hs
+++ b/
AST.hs
@@
-2,13
+2,14
@@
module AST where
import Data.Char
import Text.Read
import Data.Char
import Text.Read
-import Text.ParserCombinators.ReadP hiding ((+++), choice)
+import Text.ParserCombinators.ReadP hiding ((+++),
(<++),
choice)
data Expr = Num Double
| Var String
| BinOp BinOp Expr Expr
| Call String [Expr]
| If Expr Expr Expr
data Expr = Num Double
| Var String
| BinOp BinOp Expr Expr
| Call String [Expr]
| If Expr Expr Expr
+ | For String Expr Expr (Maybe Expr) Expr
deriving Show
data BinOp = Add | Sub | Mul | Cmp Ordering
deriving Show
data BinOp = Add | Sub | Mul | Cmp Ordering
@@
-19,6
+20,7
@@
instance Read Expr where
, parseVar
, parseCall
, parseIf
, parseVar
, parseCall
, parseIf
+ , parseFor
, parseBinOp "<" 10 (Cmp LT)
, parseBinOp ">" 10 (Cmp GT)
, parseBinOp "==" 10 (Cmp EQ)
, parseBinOp "<" 10 (Cmp LT)
, parseBinOp ">" 10 (Cmp GT)
, parseBinOp "==" 10 (Cmp EQ)
@@
-47,6
+49,18
@@
instance Read Expr where
spaced $ string "else"
elseE <- readPrec
return (If cond thenE elseE)
spaced $ string "else"
elseE <- readPrec
return (If cond thenE elseE)
+ parseFor = do
+ spaced $ string "for"
+ identifier <- lift (munch1 isAlpha)
+ spaced $ char '='
+ start <- readPrec
+ spaced $ char ','
+ cond <- readPrec
+ stp <- (spaced (char ',') >> Just <$> step readPrec)
+ <++ pure Nothing
+ spaced $ string "in"
+ body <- readPrec
+ return (For identifier start cond stp body)
spaced f = lift $ skipSpaces >> f >> skipSpaces
data Prototype = Prototype String [String]
spaced f = lift $ skipSpaces >> f >> skipSpaces
data Prototype = Prototype String [String]