50 lines
928 B
Haskell
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)) ""
|