5 import Text.ParserCombinators.ReadP hiding ((+++), choice)
9 | BinOp BinOp Expr Expr
14 data BinOp = Add | Sub | Mul | Cmp Ordering
17 instance Read Expr where
18 readPrec = parens $ choice [ parseNum
22 , parseBinOp "<" 10 (Cmp LT)
23 , parseBinOp ">" 10 (Cmp GT)
24 , parseBinOp "==" 10 (Cmp EQ)
25 , parseBinOp "+" 20 Add
26 , parseBinOp "-" 20 Sub
27 , parseBinOp "*" 40 Mul
29 where parseNum = Num <$> readPrec
30 parseVar = Var <$> lift (munch1 isAlpha)
31 parseBinOp s prc op = prec prc $ do
40 func <- lift (munch1 isAlpha)
41 params <- lift $ between (char '(') (char ')') $
42 sepBy (readS_to_P reads)
43 (skipSpaces >> char ',' >> skipSpaces)
44 return (Call func params)
46 lift $ skipSpaces >> string "if" >> skipSpaces
48 lift $ skipSpaces >> string "then" >> skipSpaces
50 lift $ skipSpaces >> string "else" >> skipSpaces
52 return (If cond thenE elseE)
54 data Prototype = Prototype String [String]
57 instance Read Prototype where
59 name <- munch1 isAlpha
60 params <- between (char '(') (char ')') $
61 sepBy (munch1 isAlpha) skipSpaces
62 return (Prototype name params)
64 data AST = Function Prototype Expr
69 instance Read AST where
70 readPrec = parseFunction +++ parseExtern +++ parseTopLevel
71 where parseFunction = do
72 lift $ string "def" >> skipSpaces
73 Function <$> readPrec <*> readPrec
75 lift $ string "extern" >> skipSpaces
77 parseTopLevel = TopLevelExpr <$> readPrec