import Data.Char
import Text.Read
-import Text.ParserCombinators.ReadP hiding ((+++), choice)
+import Text.ParserCombinators.ReadP hiding ((+++), (<++), choice)
newtype Program = Program [AST]
deriving Show
| Var String
| Call String [Expr]
| If Expr Expr Expr
+ | For String Expr Expr (Maybe Expr) Expr
deriving Show
data BinOpType = Add | Sub | Mul | Cmp Ordering
deriving Show
, parseVar
, parseCall
, parseIf
+ , parseFor
, parseBinOp "+" Add
, parseBinOp "-" Sub
, parseBinOp "*" Mul
skipSpaces
elseE <- step readPrec
return (If cond thenE elseE)
+ parseFor = do
+ lift $ do
+ string "for"
+ skipSpaces
+ identifier <- lift (munch1 isAlpha)
+ lift $ skipSpaces >> char '=' >> skipSpaces
+ start <- step readPrec
+ lift $ skipSpaces >> char ',' >> skipSpaces
+ cond <- step readPrec
+ step' <- (do
+ lift $ skipSpaces >> char ',' >> skipSpaces
+ Just <$> step readPrec) <++ pure Nothing
+ lift $ skipSpaces >> string "in" >> skipSpaces
+ body <- step readPrec
+ return (For identifier start cond step' body)