diff options
| author | aarne <aarne@cs.chalmers.se> | 2007-03-27 16:32:44 +0000 |
|---|---|---|
| committer | aarne <aarne@cs.chalmers.se> | 2007-03-27 16:32:44 +0000 |
| commit | 1c1acf1b971d13a496a92b9d8d6b14fde85e28f3 (patch) | |
| tree | 7fc40594193cbf6435feb5425ee2e4feb2652d32 /devel/compiler/Env.hs | |
| parent | 273dc7120f9ce0b469dc081d6a3382f096a4f97b (diff) | |
top-level toy compiler - far from complete
Diffstat (limited to 'devel/compiler/Env.hs')
| -rw-r--r-- | devel/compiler/Env.hs | 52 |
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)})) |
