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
37 func <- lift (munch1 isAlpha)
38 params <- lift $ between (char '(') (char ')') $
39 sepBy (readS_to_P reads)
40 (skipSpaces >> char ',' >> skipSpaces)
41 return (Call func params)
45 spaced $ string "then"
47 spaced $ string "else"
49 return (If cond thenE elseE)
50 spaced f = lift $ skipSpaces >> f >> skipSpaces
52 data Prototype = Prototype String [String]
55 instance Read Prototype where
57 name <- munch1 isAlpha
58 params <- between (char '(') (char ')') $
59 sepBy (munch1 isAlpha) skipSpaces
60 return (Prototype name params)
62 data AST = Function Prototype Expr
67 instance Read AST where
68 readPrec = parseFunction +++ parseExtern +++ parseTopLevel
69 where parseFunction = do
70 lift $ string "def" >> skipSpaces
71 Function <$> readPrec <*> readPrec
73 lift $ string "extern" >> skipSpaces
75 parseTopLevel = TopLevelExpr <$> readPrec