5 import Text.ParserCombinators.ReadP hiding ((+++), choice)
9 | BinOp BinOp Expr Expr
12 data BinOp = Add | Sub | Mul | Cmp Ordering
15 instance Read Expr where
16 readPrec = choice [ parseNum
18 , parseBinOp "<" 10 (Cmp LT)
19 , parseBinOp "+" 20 Add
20 , parseBinOp "-" 20 Sub
21 , parseBinOp "*" 40 Mul
23 where parseNum = Num <$> readPrec
24 parseVar = Var <$> lift (munch1 isAlpha)
25 parseBinOp s prc op = prec prc $ do
34 data Prototype = Prototype String [String]
37 instance Read Prototype where
39 name <- munch1 isAlpha
40 params <- between (char '(') (char ')') $
41 sepBy (munch1 isAlpha) skipSpaces
42 return (Prototype name params)
44 data AST = Function Prototype Expr
49 instance Read AST where
50 readPrec = parseFunction +++ parseExtern +++ parseTopLevel
51 where parseFunction = do
52 lift $ string "def" >> skipSpaces
53 Function <$> readPrec <*> readPrec
55 lift $ string "extern" >> skipSpaces
57 parseTopLevel = TopLevelExpr <$> readPrec