--- /dev/null
+module AST where
+
+import Text.Read
+import Text.ParserCombinators.ReadP hiding ((+++))
+
+data Expr = Num Float
+ | Add Expr Expr
+ deriving Show
+
+instance Read Expr where
+ readPrec = parseNum +++ parseAdd
+ where parseNum = Num <$> readPrec
+ -- use 'prec 1' and 'step' so that parsing 'a'
+ -- can only go one step deep, to prevent ininfite
+ -- recursion
+ parseAdd = prec 1 $ do
+ a <- step readPrec
+ lift $ do
+ skipSpaces
+ char '+'
+ skipSpaces
+ b <- readPrec
+ return (Add a b)