5 import Text.ParserCombinators.ReadP hiding ((+++), choice)
7 newtype Program = Program [AST]
10 instance Read Program where
11 readPrec = fmap Program $ lift $ sepBy1 (readPrec_to_P readPrec 0) $ do
16 data AST = Function String [String] Expr
20 | BinOp BinOpType Expr Expr
24 data BinOpType = Add | Sub | Mul
27 instance Read AST where
28 readPrec = parseFunction +++ (Eval <$> readPrec)
29 where parseFunction = lift $ do
33 name <- munch1 isAlpha
34 params <- between (char '(') (char ')') $
35 sepBy (munch1 isAlpha) skipSpaces
37 body <- readS_to_P reads
38 return (Function name params body)
40 instance Read Expr where
41 readPrec = choice [ parseNum
48 where parseNum = Num <$> readPrec
49 parseVar = Var <$> lift (munch1 isAlpha)
51 func <- lift (munch1 isAlpha)
52 params <- lift $ between (char '(') (char ')') $
53 sepBy (readS_to_P reads)
54 (skipSpaces >> char ',' >> skipSpaces)
55 return (Call func params)
56 parseBinOp c typ = step $ do
63 return (BinOp typ a b)