Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /trunk/src/compiler/env/env.sml
ViewVC logotype

Annotation of /trunk/src/compiler/env/env.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3349 - (view) (download)

1 : jhr 71 (* env.sml
2 :     *
3 : jhr 3349 * This code is part of the Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     *
5 :     * COPYRIGHT (c) 2015 The University of Chicago
6 : jhr 71 * All rights reserved.
7 :     *)
8 :    
9 :     structure Env : sig
10 :    
11 :     type env
12 :    
13 : jhr 78 val new : unit -> env
14 :    
15 : jhr 2356 (* functions are either user-defined or pre-defined *)
16 :     datatype fun_def
17 :     = PrimFun of AST.var list (* possibly overloaded builtin function *)
18 :     | UserFun of AST.var (* user-defined function *)
19 : jhr 169
20 : jhr 2356 val findStrand : env * Atom.atom -> AST.strand option
21 :     val findFunc : env * Atom.atom -> fun_def
22 : jhr 71 val findVar : env * Atom.atom -> AST.var option
23 :    
24 : jhr 2356 val insertStrand : env * AST.strand -> env
25 :    
26 : jhr 169 (* insert a function binding *)
27 : jhr 2356 val insertFunc : env * Atom.atom * fun_def -> env
28 : jhr 169
29 :     (* insert variable bindings *)
30 : jhr 78 val insertGlobal : env * Atom.atom * AST.var -> env
31 :     val insertLocal : env * Atom.atom * AST.var -> env
32 :    
33 : jhr 2636 (* tracking program features *)
34 :     val recordProp : env * StrandUtil.program_prop -> unit
35 :     val properties : env -> StrandUtil.program_prop list
36 :    
37 : jhr 71 end = struct
38 :    
39 :     structure ATbl = AtomTable
40 :     structure AMap = AtomMap
41 :    
42 : jhr 2356 (* functions are either user-defined or pre-defined *)
43 :     datatype fun_def
44 : jhr 2636 = PrimFun of AST.var list (* possibly overloaded builtin function *)
45 :     | UserFun of AST.var (* user-defined function *)
46 : jhr 2356
47 : jhr 511 (* global environment holds global variables and strands *)
48 : jhr 71 datatype global_env = GE of {
49 : jhr 2356 sEnv : AST.strand ATbl.hash_table, (* strands *)
50 : jhr 2636 fEnv : fun_def ATbl.hash_table, (* functions, which may be overloaded *)
51 :     vEnv : AST.var ATbl.hash_table, (* global variable bindings *)
52 :     props : StrandUtil.program_prop list ref (* record program properties *)
53 : jhr 71 }
54 :    
55 :     datatype env = E of {
56 : jhr 2636 g : global_env,
57 :     vEnv : AST.var AMap.map
58 : jhr 71 }
59 :    
60 : jhr 78 fun new () = E{
61 : jhr 2636 g = GE{
62 :     sEnv = ATbl.mkTable(8, Fail "strand env"),
63 :     fEnv = ATbl.mkTable(128, Fail "global function env"),
64 :     vEnv = ATbl.mkTable(128, Fail "global variable env"),
65 :     props = ref[]
66 :     },
67 :     vEnv = AMap.empty
68 :     }
69 : jhr 78
70 : jhr 2356 fun findStrand (E{g=GE{sEnv, ...}, ...}, s) = ATbl.find sEnv s
71 :    
72 : jhr 1116 fun findFunc (E{g=GE{fEnv, ...}, ...}, x) = (case ATbl.find fEnv x
73 : jhr 2636 of NONE => PrimFun[]
74 :     | SOME fdef => fdef
75 :     (* end case *))
76 : jhr 169
77 : jhr 71 fun findVar (E{g=GE{vEnv=gvEnv, ...}, vEnv}, x) = (case AMap.find(vEnv, x)
78 : jhr 2636 of NONE => ATbl.find gvEnv x
79 :     | someVar => someVar
80 :     (* end case *))
81 : jhr 71
82 : jhr 2356 fun insertStrand (env as E{g=GE{sEnv, ...}, ...}, s as AST.Strand{name, ...}) = (
83 : jhr 2636 ATbl.insert sEnv (name, s);
84 :     env)
85 : jhr 2356
86 : jhr 169 fun insertFunc (env as E{g=GE{fEnv, ...}, ...}, f, f') = (
87 : jhr 2636 ATbl.insert fEnv (f, f');
88 :     env)
89 : jhr 169
90 : jhr 78 fun insertGlobal (env as E{g=GE{vEnv, ...}, ...}, x, x') = (
91 : jhr 2636 ATbl.insert vEnv (x, x');
92 :     env)
93 : jhr 71
94 : jhr 72 fun insertLocal (env as E{vEnv, g}, x, x') =
95 : jhr 2636 E{vEnv = AMap.insert(vEnv, x, x'), g = g}
96 : jhr 72
97 : jhr 2636 (* tracking program features *)
98 :     fun recordProp (E{g=GE{props, ...}, ...}, p) = if (StrandUtil.hasProp p (!props))
99 :     then ()
100 :     else props := p :: !props
101 :    
102 :     fun properties (E{g=GE{props, ...}, ...}) = !props
103 :    
104 : jhr 71 end

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0