summaryrefslogtreecommitdiff
path: root/devel/compiler/Env.hs
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2007-03-27 16:32:44 +0000
committeraarne <aarne@cs.chalmers.se>2007-03-27 16:32:44 +0000
commit1c1acf1b971d13a496a92b9d8d6b14fde85e28f3 (patch)
tree7fc40594193cbf6435feb5425ee2e4feb2652d32 /devel/compiler/Env.hs
parent273dc7120f9ce0b469dc081d6a3382f096a4f97b (diff)
top-level toy compiler - far from complete
Diffstat (limited to 'devel/compiler/Env.hs')
-rw-r--r--devel/compiler/Env.hs52
1 files changed, 52 insertions, 0 deletions
diff --git a/devel/compiler/Env.hs b/devel/compiler/Env.hs
new file mode 100644
index 000000000..d29b9a3a5
--- /dev/null
+++ b/devel/compiler/Env.hs
@@ -0,0 +1,52 @@
+module Env where
+
+import AbsSrc
+import AbsTgt
+
+import STM
+import qualified Data.Map as M
+
+data Env = Env {
+ values :: M.Map Ident Val,
+ types :: M.Map Ident Type,
+ opers :: M.Map Ident Exp,
+ typedefs :: M.Map Ident Type,
+ partypes :: M.Map Type [Exp],
+ parvals :: M.Map Exp Val,
+ vars :: M.Map Ident Val
+--- constrs :: M.Map Ident ([Int] -> Int)
+ }
+
+emptyEnv = Env M.empty M.empty M.empty M.empty M.empty M.empty M.empty
+
+lookEnv :: (Show i, Ord i) => (Env -> M.Map i a) -> i -> STM Env a
+lookEnv field c = do
+ s <- readSTM
+ maybe (raise $ "unknown " ++ show c) return $ M.lookup c $ field s
+
+addVal :: Ident -> Val -> STM Env ()
+addVal c v = updateSTM (\env -> (env{values = M.insert c v (values env)}))
+
+addType :: Ident -> Type -> STM Env ()
+addType c v = updateSTM (\env -> (env{types = M.insert c v (types env)}))
+
+addOper :: Ident -> Exp -> STM Env ()
+addOper c v = updateSTM (\env -> (env{opers = M.insert c v (opers env)}))
+
+addTypedef :: Ident -> Type -> STM Env ()
+addTypedef c v = updateSTM (\env -> (env{typedefs = M.insert c v (typedefs env)}))
+
+addPartype :: Type -> [Exp] -> STM Env ()
+addPartype c v = updateSTM (\env -> (env{partypes = M.insert c v (partypes env)}))
+
+addParVal :: Exp -> Val -> STM Env ()
+addParVal c v = updateSTM (\env -> (env{parvals = M.insert c v (parvals env)}))
+
+---addEnv :: (Env -> M.Map Ident a) -> Ident -> a -> STM Env ()
+---addEnv field c v = updateSTM (\env -> (env{field = M.insert c v (field env)},()))
+
+addVar :: Ident -> STM Env ()
+addVar x = do
+ s <- readSTM
+ let i = M.size $ vars s
+ updateSTM (\env -> (env{vars = M.insert x (VArg $ toInteger i) (vars env)}))