3 import Text.ParserCombinators.ReadP
4 import Text.Read (readPrec, lift)
8 {-------------------------------------------------------------------}
9 {- The pure expression language -}
10 {-------------------------------------------------------------------}
12 data Val = I Int | B Bool
15 instance Show Val where
20 | Add Expr Expr | Sub Expr Expr | Mul Expr Expr | Div Expr Expr
21 | And Expr Expr | Or Expr Expr | Not Expr
22 | Eq Expr Expr | Gt Expr Expr | Lt Expr Expr
26 instance Show Expr where
27 show (Const v) = show v
28 show (Add e1 e2) = show e1 ++ " + " ++ show e2
29 show (Sub e1 e2) = show e1 ++ " - " ++ show e2
30 show (Mul e1 e2) = show e1 ++ " * " ++ show e2
31 show (Div e1 e2) = show e1 ++ " / " ++ show e2
32 show (And e1 e2) = show e1 ++ " & " ++ show e2
33 show (Or e1 e2) = show e1 ++ " | " ++ show e2
34 show (Not e) = "!" ++ show e
35 show (Eq e1 e2) = show e1 ++ " == " ++ show e2
36 show (Gt e1 e2) = show e1 ++ " > " ++ show e2
37 show (Lt e1 e2) = show e1 ++ " < " ++ show e2
40 instance Read Expr where
43 pExpr = (pLit <++ pVar) +++ pBinOp
44 pBrackets = between (char '(') (char ')')
46 pVar = Var <$> munch1 isLetter
47 pLit = pLit' B +++ pLit' I
48 pLit' x = Const . x <$> readS_to_P (readsPrec 10000)
51 -- TODO: figure out how to just use pExpr without getting
53 e1 <- (pLit <++ pVar) +++ pBrackets pBinOp
57 e2 <- (pLit <++ pVar) +++ pBrackets pBinOp
72 {-------------------------------------------------------------------}
73 {- The statement language -}
76 data Statement = Assign String Expr
77 | If Expr Statement Statement
78 | While Expr Statement
80 | Seq Statement Statement
81 | Try Statement Statement
83 deriving (Eq, Show, Read)