5 import Text.ParserCombinators.ReadP hiding ((+++), choice)
7 data AST = Function String [String] Expr
11 | BinOp BinOpType Expr Expr
15 data BinOpType = Add | Sub | Mul
18 instance Read AST where
19 readPrec = parseFunction +++ (Eval <$> readPrec)
20 where parseFunction = lift $ do
24 name <- munch1 isAlpha
25 params <- between (char '(') (char ')') $
26 sepBy (munch1 isAlpha) skipSpaces
28 body <- between (char '{') (char '}') $
31 return (Function name params body)
33 instance Read Expr where
34 readPrec = choice [ parseNum
41 where parseNum = Num <$> readPrec
42 parseVar = Var <$> lift (munch1 isAlpha)
44 func <- lift (munch1 isAlpha)
45 params <- lift $ between (char '(') (char ')') $
46 sepBy (readS_to_P reads)
47 (skipSpaces >> char ',' >> skipSpaces)
48 return (Call func params)
49 parseBinOp c typ = step $ do
56 return (BinOp typ a b)