playground/haskell/Imp/AExpr.hs

50 lines
928 B
Haskell

module AExpr where
import qualified Parser as P
data E
= Cnst Int
| Add E E
| Sub E E
| Mul E E
deriving Show
eval :: E -> Int
eval e = case e of
Cnst n -> n
Add e1 e2 -> (eval e1) + (eval e2)
Sub e1 e2 -> (eval e1) - (eval e2)
Mul e1 e2 -> (eval e1) * (eval e2)
parser :: P.Parser E
parser = aconst
where
aconst = (Cnst . read) <$> (P.spaces *> P.nat)
-- parser :: P.Parser E
-- parser = P.chainl cnst op
-- where
-- --cnst :: P.Parser E
-- cnst = do {
-- P.spaces
-- ; n <- P.nat
-- ; return $ (Cnst . read) n
-- }
-- --op :: P.Parser (E -> E -> E)
-- op = do {
-- P.spaces
-- ; sym <- P.choice $ map P.char "+-*"
-- ; return $
-- case sym of
-- '*' -> Mul
-- '+' -> Add
-- '-' -> Sub
-- }
-- λ> P.parse AE.parser "2 * 3"
-- Ok (Mul (Cnst 2) (Cnst 3)) ""
-- λ> P.parse AE.parser "2 * 3 + 4"
-- Ok (Add (Mul (Cnst 2) (Cnst 3)) (Cnst 4)) ""