diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-03-16 12:09:27 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-03-16 12:09:27 +0100 |
| commit | d17423cba7c15a26f835a6fa578ecb48b80d8aab (patch) | |
| tree | 55b6ee4447ac61dcbc949acc5aa2436e014d2392 /src/expr.hs | |
| parent | d8751f2cced8f14366533ff0dbbc62fa73ec8665 (diff) | |
| download | computorv2-d17423cba7c15a26f835a6fa578ecb48b80d8aab.tar.gz computorv2-d17423cba7c15a26f835a6fa578ecb48b80d8aab.tar.bz2 computorv2-d17423cba7c15a26f835a6fa578ecb48b80d8aab.zip | |
split parser in multiple modules, parsing of assignment and statement
Diffstat (limited to 'src/expr.hs')
| -rw-r--r-- | src/expr.hs | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/src/expr.hs b/src/expr.hs index 87a700b..e6f1f25 100644 --- a/src/expr.hs +++ b/src/expr.hs @@ -11,22 +11,25 @@ data Expr | Div Expr Expr | Mod Expr Expr | Exp Expr Expr - -- | Dot Expr Expr + | Variable String + | Function String Expr + eval :: Expr -> Maybe Atom eval (EAtom a) = Just a -eval (Add e1 e2) = evalBin e1 e2 (+?) -eval (Sub e1 e2) = evalBin e1 e2 (-?) -eval (Mul e1 e2) = evalBin e1 e2 (*?) -eval (Div e1 e2) = evalBin e1 e2 (/?) -eval (Mod e1 e2) = evalBin e1 e2 (%?) -eval (Exp e1 e2) = evalBin e1 e2 (^?) - -evalBin :: Expr -> Expr -> (Atom -> Atom -> Maybe Atom) -> Maybe Atom -evalBin e1 e2 f = do a <- eval e1 - b <- eval e2 - f a b +eval (Add e1 e2) = evalInfix e1 e2 (+?) +eval (Sub e1 e2) = evalInfix e1 e2 (-?) +eval (Mul e1 e2) = evalInfix e1 e2 (*?) +eval (Div e1 e2) = evalInfix e1 e2 (/?) +eval (Mod e1 e2) = evalInfix e1 e2 (%?) +eval (Exp e1 e2) = evalInfix e1 e2 (^?) +eval _ = Nothing + +evalInfix :: Expr -> Expr -> (Atom -> Atom -> Maybe Atom) -> Maybe Atom +evalInfix e1 e2 f = do a <- eval e1 + b <- eval e2 + f a b instance Show Expr where show (EAtom a) = show a @@ -36,3 +39,5 @@ instance Show Expr where show (Div e1 e2) = show e1 ++ " / " ++ show e2 show (Mod e1 e2) = show e1 ++ " % " ++ show e2 show (Exp e1 e2) = show e1 ++ " ^ " ++ show e2 + show (Variable name) = name + show (Function name e) = name ++ "(" ++ show e ++ ")" |
