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
| 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
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)
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)