/[svn]/compile/compile.ml
ViewVC logotype

Contents of /compile/compile.ml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 713 - (show annotations)
Tue Jul 10 17:58:04 2007 UTC (5 years, 10 months ago) by abate
File size: 6747 byte(s)
[r2003-10-08 21:24:38 by cvscast] Separate compilation

Original author: cvscast
Date: 2003-10-08 21:25:22+00:00
1 open Ident
2 open Lambda
3
4 type env = {
5 vars: var_loc Env.t;
6 stack_size: int
7 }
8
9 let empty = { vars = Env.empty; stack_size = 0 }
10
11 let serialize s env =
12 Serialize.Put.env Id.serialize Lambda.Put.var_loc Env.iter s env.vars;
13 Serialize.Put.int s env.stack_size
14
15 let deserialize s =
16 let vars =
17 Serialize.Get.env Id.deserialize Lambda.Get.var_loc Env.add Env.empty s in
18 let size = Serialize.Get.int s in
19 { vars = vars; stack_size = size }
20
21
22
23
24 let find x env =
25 try Env.find x env.vars
26 with Not_found ->
27 failwith ("Compile: cannot find " ^ (Ident.to_string x))
28
29 let from_comp_unit = ref (fun cu -> assert false)
30
31 let find_ext cu x =
32 let env = !from_comp_unit cu in
33 match find x env with
34 | Global i -> ExtVar (cu,i)
35 | _ -> assert false
36
37 let rec compile env tail e = compile_aux env tail e.Typed.exp_descr
38 and compile_aux env tail = function
39 | Typed.Forget (e,_) -> compile env tail e
40 | Typed.Var x -> Var (find x env)
41 | Typed.ExtVar (cu,x) -> find_ext cu x
42 | Typed.Apply (e1,e2) -> Apply (tail, compile env false e1, compile env tail e2)
43 | Typed.Abstraction a -> compile_abstr env a
44 | Typed.Cst c -> Const c
45 | Typed.Pair (e1,e2) -> Pair(compile env false e1, compile env tail e2)
46 | Typed.Xml (e1, { Typed.exp_descr = Typed.Pair (e2,e3) }) ->
47 Xml (compile env false e1, compile env false e2, compile env tail e3)
48 | Typed.Xml (_,_) -> assert false
49 | Typed.RecordLitt r -> Record (LabelMap.map (compile env false) r)
50 | Typed.String (i,j,s,q) -> String (i,j,s,compile env tail q)
51 | Typed.Match (e,brs) -> Match (compile env false e, compile_branches env tail brs)
52 | Typed.Map (e,brs) -> Map (compile env false e, compile_branches env false brs)
53 | Typed.Transform (e,brs) -> Transform
54 (compile env false e, compile_branches env false brs)
55 | Typed.Xtrans (e,brs) -> Xtrans (compile env false e, compile_branches env false brs)
56 | Typed.Validate (e,sch,t) -> Validate (compile env tail e, sch, t)
57 | Typed.RemoveField (e,l) -> RemoveField (compile env tail e,l)
58 | Typed.Dot (e,l) -> Dot (compile env tail e, l)
59 | Typed.Try (e,brs) -> Try (compile env false e, compile_branches env tail brs)
60 | Typed.UnaryOp (op,e) -> UnaryOp (op, compile env tail e)
61 | Typed.BinaryOp (op,e1,e2) -> BinaryOp (op, compile env false e1, compile env tail e2)
62 | Typed.Ref (e,t) -> Ref (compile env tail e, t)
63
64 and compile_abstr env a =
65 let fun_env =
66 match a.Typed.fun_name with
67 | Some x -> Env.add x (Env 0) Env.empty
68 | None -> Env.empty in
69
70 let (slots,nb_slots,fun_env) =
71 List.fold_left
72 (fun (slots,nb_slots,fun_env) x ->
73 match find x env with
74 | (Stack _ | Env _) as p ->
75 p::slots,
76 succ nb_slots,
77 Env.add x (Env nb_slots) fun_env;
78 | Global _ as p ->
79 slots,
80 nb_slots,
81 Env.add x p fun_env
82 | Dummy -> assert false
83 )
84 ([Dummy],1,fun_env) (IdSet.get a.Typed.fun_fv) in
85
86
87 let slots = Array.of_list (List.rev slots) in
88 let env = { vars = fun_env; stack_size = 0 } in
89 let body = compile_branches env true a.Typed.fun_body in
90 Abstraction (slots, a.Typed.fun_iface, body)
91
92 and compile_branches env tail (brs : Typed.branches) =
93 {
94 brs = List.map (compile_branch env tail) brs.Typed.br_branches;
95 brs_tail = tail;
96 brs_accept_chars = not (Types.Char.is_empty brs.Typed.br_accept);
97 brs_input = brs.Typed.br_typ;
98 brs_compiled = None
99 }
100
101 and compile_branch env tail br =
102 let env =
103 List.fold_left
104 (fun env x ->
105 { vars = Env.add x (Stack env.stack_size) env.vars;
106 stack_size = env.stack_size + 1 }
107
108 ) env (Patterns.fv_list br.Typed.br_pat) in
109 (br.Typed.br_pat, compile env tail br.Typed.br_body)
110
111
112 let enter_global env x =
113 { vars = Env.add x (Global env.stack_size) env.vars;
114 stack_size = env.stack_size + 1 }
115
116 let enter_globals = List.fold_left enter_global
117
118 let compile_eval env e = Eval (compile env false e)
119
120 let compile_let_decl env decl =
121 let pat = decl.Typed.let_pat in
122 let code = Let_decl (pat, compile env false (decl.Typed.let_body)) in
123 let env = enter_globals env (Patterns.fv_list pat) in
124 (env, code)
125
126
127 let compile_rec_funs env funs =
128 let fun_name = function
129 | { Typed.exp_descr=Typed.Abstraction{Typed.fun_name = Some x}} -> x
130 | _ -> assert false in
131 let fun_a = function
132 | { Typed.exp_descr=Typed.Abstraction a } -> a
133 | _ -> assert false in
134 let names = List.map fun_name funs in
135 let env = enter_globals env names in
136 let exprs = List.map (compile_abstr env) (List.map fun_a funs) in
137 (env, Let_funs exprs)
138
139
140 (****************************************)
141
142 open Location
143
144 let eval (tenv,cenv,codes) e =
145 let (e,_) = Typer.type_expr tenv e in
146 let code = compile_eval cenv e in
147 (tenv,cenv,code :: codes)
148
149 let let_decl (tenv,cenv,codes) p e =
150 let (tenv,decl,_) = Typer.type_let_decl tenv p e in
151 let (cenv,code) = compile_let_decl cenv decl in
152 (tenv,cenv,code :: codes)
153
154 let let_funs (tenv,cenv,codes) funs =
155 let (tenv,funs,_) = Typer.type_let_funs tenv funs in
156 let (cenv,code) = compile_rec_funs cenv funs in
157 (tenv,cenv,code :: codes)
158
159 let type_defs (tenv,cenv,codes) typs =
160 let tenv = Typer.enter_types (Typer.type_defs tenv typs) tenv in
161 (tenv,cenv,codes)
162
163 let namespace (tenv,cenv,codes) pr ns =
164 let tenv = Typer.enter_ns pr ns tenv in
165 (tenv,cenv,codes)
166
167 let using (tenv,cenv,codes) x cu =
168 let tenv = Typer.enter_cu x cu tenv in
169 (tenv,cenv,codes)
170
171 let rec collect_funs accu = function
172 | { descr = Ast.FunDecl e } :: rest -> collect_funs (e::accu) rest
173 | rest -> (accu,rest)
174
175 let rec collect_types accu = function
176 | { descr = Ast.TypeDecl (x,t) } :: rest ->
177 collect_types ((x,t) :: accu) rest
178 | rest -> (accu,rest)
179
180 let rec phrases accu phs = match phs with
181 | { descr = Ast.FunDecl _ } :: _ ->
182 let (funs,rest) = collect_funs [] phs in
183 phrases (let_funs accu funs) rest
184 | { descr = Ast.TypeDecl (_,_) } :: _ ->
185 let (typs,rest) = collect_types [] phs in
186 phrases (type_defs accu typs) rest
187 | { descr = Ast.SchemaDecl (name, schema) } :: rest ->
188 Typer.register_schema name schema;
189 phrases accu rest
190 | { descr = Ast.Namespace (pr,ns) } :: rest ->
191 phrases (namespace accu pr ns) rest
192 | { descr = Ast.Using (x,cu) } :: rest ->
193 phrases (using accu x cu) rest
194 | { descr = Ast.EvalStatement e } :: rest ->
195 phrases (eval accu e) rest
196 | { descr = Ast.LetDecl (p,e) } :: rest ->
197 phrases (let_decl accu p e) rest
198 | { descr = Ast.Debug l } :: rest ->
199 phrases accu rest
200 | { descr = Ast.Directive _ } :: rest ->
201 phrases accu rest
202 | [] -> accu
203
204 let comp_unit tenv cenv phs =
205 let (tenv,cenv,codes) = phrases (tenv,cenv,[]) phs in
206 (tenv,cenv,List.rev codes)

CVS Admin">CVS Admin
ViewVC Help
Powered by ViewVC 1.1.5