aboutsummaryrefslogtreecommitdiff
path: root/src/expr.hs
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-03-16 10:50:03 +0100
committerCharles <sircharlesaze@gmail.com>2020-03-16 10:50:03 +0100
commitd8751f2cced8f14366533ff0dbbc62fa73ec8665 (patch)
treee216acbfb3d91cfe25870af93626240dbc7afcb3 /src/expr.hs
parentcc2593028c5f380e177adbf8905a43d665ac64cf (diff)
downloadcomputorv2-d8751f2cced8f14366533ff0dbbc62fa73ec8665.tar.gz
computorv2-d8751f2cced8f14366533ff0dbbc62fa73ec8665.tar.bz2
computorv2-d8751f2cced8f14366533ff0dbbc62fa73ec8665.zip
Clean parser for expression containing rational and imaginary
Diffstat (limited to 'src/expr.hs')
-rw-r--r--src/expr.hs38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/expr.hs b/src/expr.hs
new file mode 100644
index 0000000..87a700b
--- /dev/null
+++ b/src/expr.hs
@@ -0,0 +1,38 @@
+module Expr where
+
+import Atom
+
+
+data Expr
+ = EAtom Atom
+ | Add Expr Expr
+ | Sub Expr Expr
+ | Mul Expr Expr
+ | Div Expr Expr
+ | Mod Expr Expr
+ | Exp Expr Expr
+ -- | Dot Expr 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
+
+instance Show Expr where
+ show (EAtom a) = show a
+ show (Add e1 e2) = show e1 ++ " + " ++ show e2
+ show (Sub e1 e2) = show e1 ++ " - " ++ show e2
+ show (Mul e1 e2) = show e1 ++ " * " ++ show e2
+ show (Div e1 e2) = show e1 ++ " / " ++ show e2
+ show (Mod e1 e2) = show e1 ++ " % " ++ show e2
+ show (Exp e1 e2) = show e1 ++ " ^ " ++ show e2