5 import Text.ParserCombinators.ReadP hiding ((+++), choice)
9 | BinOp BinOp Expr Expr
13 data BinOp = Add | Sub | Mul | Cmp Ordering
16 instance Read Expr where
17 readPrec = parens $ choice [ parseNum
20 , parseBinOp "<" 10 (Cmp LT)
21 , parseBinOp ">" 10 (Cmp GT)
22 , parseBinOp "==" 10 (Cmp EQ)
23 , parseBinOp "+" 20 Add
24 , parseBinOp "-" 20 Sub
25 , parseBinOp "*" 40 Mul
27 where parseNum = Num <$> readPrec
28 parseVar = Var <$> lift (munch1 isAlpha)
29 parseBinOp s prc op = prec prc $ do
38 func <- lift (munch1 isAlpha)
39 params <- lift $ between (char '(') (char ')') $
40 sepBy (readS_to_P reads)
41 (skipSpaces >> char ',' >> skipSpaces)
42 return (Call func params)
44 data Prototype = Prototype String [String]
47 instance Read Prototype where
49 name <- munch1 isAlpha
50 params <- between (char '(') (char ')') $
51 sepBy (munch1 isAlpha) skipSpaces
52 return (Prototype name params)
54 data AST = Function Prototype Expr
59 instance Read AST where
60 readPrec = parseFunction +++ parseExtern +++ parseTopLevel
61 where parseFunction = do
62 lift $ string "def" >> skipSpaces
63 Function <$> readPrec <*> readPrec
65 lift $ string "extern" >> skipSpaces
67 parseTopLevel = TopLevelExpr <$> readPrec