| 83 |
{ vars = Env.add x (Stack env.stack_size) env.vars; |
{ vars = Env.add x (Stack env.stack_size) env.vars; |
| 84 |
stack_size = env.stack_size + 1 } |
stack_size = env.stack_size + 1 } |
| 85 |
|
|
| 86 |
) env (IdSet.get (Patterns.fv br.Typed.br_pat)) in |
) env (Patterns.fv_list br.Typed.br_pat) in |
| 87 |
(br.Typed.br_pat, compile env tail br.Typed.br_body) |
(br.Typed.br_pat, compile env tail br.Typed.br_body) |
| 88 |
|
|
| 89 |
|
|
| 93 |
|
|
| 94 |
let enter_globals = List.fold_left enter_global |
let enter_globals = List.fold_left enter_global |
| 95 |
|
|
| 96 |
|
let compile_eval env e = Eval (compile env false e) |
| 97 |
|
|
| 98 |
let compile_let_decl env decl = |
let compile_let_decl env decl = |
| 99 |
let pat = decl.Typed.let_pat in |
let pat = decl.Typed.let_pat in |
| 100 |
let decl = { let_pat = pat; let_expr = compile env false (decl.Typed.let_body) } in |
let code = Let_decl (pat, compile env false (decl.Typed.let_body)) in |
| 101 |
let names = IdSet.get (Patterns.fv pat) in |
let env = enter_globals env (Patterns.fv_list pat) in |
| 102 |
let env = enter_globals env names in |
(env, code) |
|
(env, decl) |
|
| 103 |
|
|
| 104 |
|
|
| 105 |
let compile_rec_funs env funs = |
let compile_rec_funs env funs = |
| 112 |
let names = List.map fun_name funs in |
let names = List.map fun_name funs in |
| 113 |
let env = enter_globals env names in |
let env = enter_globals env names in |
| 114 |
let exprs = List.map (compile_abstr env) (List.map fun_a funs) in |
let exprs = List.map (compile_abstr env) (List.map fun_a funs) in |
| 115 |
(env, exprs) |
(env, Let_funs exprs) |
| 116 |
|
|
| 117 |
|
|
| 118 |
|
(****************************************) |
| 119 |
|
|
| 120 |
|
open Location |
| 121 |
|
|
| 122 |
|
let eval (tenv,cenv,codes) e = |
| 123 |
|
let (e,_) = Typer.type_expr tenv e in |
| 124 |
|
let code = compile_eval cenv e in |
| 125 |
|
(tenv,cenv,code :: codes) |
| 126 |
|
|
| 127 |
|
let let_decl (tenv,cenv,codes) p e = |
| 128 |
|
let (tenv,decl,_) = Typer.type_let_decl tenv p e in |
| 129 |
|
let (cenv,code) = compile_let_decl cenv decl in |
| 130 |
|
(tenv,cenv,code :: codes) |
| 131 |
|
|
| 132 |
|
let let_funs (tenv,cenv,codes) funs = |
| 133 |
|
let (tenv,funs,_) = Typer.type_let_funs tenv funs in |
| 134 |
|
let (cenv,code) = compile_rec_funs cenv funs in |
| 135 |
|
(tenv,cenv,code :: codes) |
| 136 |
|
|
| 137 |
|
let type_defs (tenv,cenv,codes) typs = |
| 138 |
|
let tenv = Typer.enter_types (Typer.type_defs tenv typs) tenv in |
| 139 |
|
(tenv,cenv,codes) |
| 140 |
|
|
| 141 |
|
let namespace (tenv,cenv,codes) pr ns = |
| 142 |
|
let tenv = Typer.enter_ns pr ns tenv in |
| 143 |
|
(tenv,cenv,codes) |
| 144 |
|
|
| 145 |
|
let rec collect_funs accu = function |
| 146 |
|
| { descr = Ast.FunDecl e } :: rest -> collect_funs (e::accu) rest |
| 147 |
|
| rest -> (accu,rest) |
| 148 |
|
|
| 149 |
|
let rec collect_types accu = function |
| 150 |
|
| { descr = Ast.TypeDecl (x,t) } :: rest -> |
| 151 |
|
collect_types ((x,t) :: accu) rest |
| 152 |
|
| rest -> (accu,rest) |
| 153 |
|
|
| 154 |
|
let rec phrases accu phs = match phs with |
| 155 |
|
| { descr = Ast.FunDecl _ } :: _ -> |
| 156 |
|
let (funs,rest) = collect_funs [] phs in |
| 157 |
|
phrases (let_funs accu funs) rest |
| 158 |
|
| { descr = Ast.TypeDecl (_,_) } :: _ -> |
| 159 |
|
let (typs,rest) = collect_types [] phs in |
| 160 |
|
phrases (type_defs accu typs) rest |
| 161 |
|
| { descr = Ast.SchemaDecl (name, schema) } :: rest -> |
| 162 |
|
Typer.register_schema name schema; |
| 163 |
|
phrases accu rest |
| 164 |
|
| { descr = Ast.Namespace (pr,ns) } :: rest -> |
| 165 |
|
phrases (namespace accu pr ns) rest |
| 166 |
|
| { descr = Ast.EvalStatement e } :: rest -> |
| 167 |
|
phrases (eval accu e) rest |
| 168 |
|
| { descr = Ast.LetDecl (p,e) } :: rest -> |
| 169 |
|
phrases (let_decl accu p e) rest |
| 170 |
|
| { descr = Ast.Debug l } :: rest -> |
| 171 |
|
phrases accu rest |
| 172 |
|
| { descr = Ast.Directive _ } :: rest -> |
| 173 |
|
phrases accu rest |
| 174 |
|
| [] -> accu |
| 175 |
|
|
| 176 |
|
let comp_unit tenv cenv phs = |
| 177 |
|
let (tenv,cenv,codes) = phrases (tenv,cenv,[]) phs in |
| 178 |
|
(tenv,cenv,List.rev codes) |