Start parsing expressions
[kaleidoscope-hs.git] / AST.hs
1 module AST where
2
3 import Text.Read 
4 import Text.ParserCombinators.ReadP hiding ((+++))
5
6 data Expr = Num Float
7           | Add Expr Expr
8   deriving Show
9
10 instance Read Expr where
11   readPrec = parseNum +++ parseAdd
12     where parseNum = Num <$> readPrec
13           -- use 'prec 1' and 'step' so that parsing 'a'
14           -- can only go one step deep, to prevent ininfite
15           -- recursion
16           parseAdd = prec 1 $ do
17             a <- step readPrec
18             lift $ do
19               skipSpaces
20               char '+'
21               skipSpaces
22             b <- readPrec
23             return (Add a b)