diff --git a/generator/print_tast.ml b/generator/print_tast.ml index 7051c1cf7d3edcb9cc9c3c4c8d0620e23fbf0685..496149d373e14259433d5658dfb4d661dc75f313 100644 --- a/generator/print_tast.ml +++ b/generator/print_tast.ml @@ -20,45 +20,57 @@ let string_of_lident idt = let names = Longident.flatten idt in String.concat "." names -let string_of_lident_loc li = - string_of_lident li.txt - - let string_of_constant = function | Const_int n -> string_of_int n - | Const_char c -> String.make 1 c - | Const_string (s, _) -> s + (*| Const_char c -> String.make 1 c + | Const_string (s, _) -> "\"" ^ s ^ "\"" *) | Const_float f -> f - | Const_int32 _ -> unsupported "int32 type" + (*| Const_int32 _ -> unsupported "int32 type" | Const_int64 _ -> unsupported "int64 type" - | Const_nativeint _ -> unsupported "native int type" + | Const_nativeint _ -> unsupported "native int type"*) + | _ -> unsupported "constant" +(* let string_of_recflag = function | Nonrecursive -> "" | Recursive -> " rec" - +*) (*#########################################################################*) (* ** Printing of items *) +(* let string_of_typed_var s t = sprintf "(%s : %s)" s (string_of_type_exp t) +*) +(* let string_of_path p = Path.name p +*) let show_string s = s +(*#########################################################################*) +(* ** Some Contexts *) + +let create_context l = l + + (*#########################################################################*) (* ** Printing of patterns *) -let string_of_pattern par p = +let string_of_pattern matchedexpr par p = + (* It also returns a context of expressions to be substituted. *) let rec aux par p = match p.pat_desc with - | Tpat_any -> "_" - | Tpat_var (id,_) -> string_of_typed_var (string_of_ident id) p.pat_type + | Tpat_any -> "default", + create_context [] + | Tpat_var (id,_) -> "default", + create_context [id, matchedexpr] + (* | Tpat_alias (p, ak, _) -> unsupported "alias patterns" (* let sp = aux false p in begin match ak with @@ -66,31 +78,42 @@ let string_of_pattern par p = | TPat_constraint _ -> sp | TPat_type pp -> sp (* ignore type *) end *) + *) | Tpat_constant c -> - sprintf "%s" (string_of_constant c) + sprintf "case %s" (string_of_constant c), + create_context [] | Tpat_tuple l -> - show_par true (sprintf "%s" (show_list (aux false) "," l)) - | Tpat_construct (p,cd,ps) -> - let c = string_of_lident_loc p in + "default", + let li = List.length l in + create_context + (List.flatten (List.mapi (fun i -> function + | Tpat_any -> [] + | Tpat_var (id, _) -> + [id, "proj_" ^ string_of_int i ^ "_" ^ string_of_int li ^ "(" ^ matchedexpr ^ ")"]) l)) + | Tpat_construct (p,cd,ps) -> unsupported "construct patterns" + (* + let c = string_of_path p in if ps = [] then c else if List.length ps = 1 then show_par par (c ^ " " ^ aux true (List.hd ps)) else - show_par par (sprintf "%s (%s)" c (show_list (aux false) "," ps)) - | Tpat_or (p1,p2,_) -> + show_par par (sprintf "%s (%s)" c (show_list (aux false) "," ps)) *) + (*| Tpat_or (p1,p2,_) -> show_par par (sprintf "%s | %s" (aux false p1) (aux false p2)) | Tpat_lazy p1 -> show_par par (sprintf "lazy %s" (aux true p1)) | Tpat_variant (_,_,_) -> unsupported "variant patterns" | Tpat_record _ -> unsupported "record patterns" - | Tpat_array pats -> unsupported "array patterns" + | Tpat_array pats -> unsupported "array patterns"*) + | _ -> unsupported "pattern" in aux false p -let string_of_let_pattern par p = - let _typ = p.pat_type in - sprintf "%s" (string_of_pattern par p) +let string_of_let_pattern par fvs p = + let typ = p.pat_type in + let styp = string_of_type_sch fvs typ in + sprintf "%s : %s" (string_of_pattern par p) styp (* match p.pat_desc with | Tpat_var id -> @@ -107,32 +130,26 @@ let rec string_of_expression par e = string_of_expression (bool_of_option par) e in let aux_pat ?par e = string_of_pattern (bool_of_option par) e in - let string_of_branch b = - let p = b.c_lhs in - let e = b.c_rhs in - (* TODO: check b.c_guard is not used *) + let string_of_branch (p,e) = Format.sprintf "@[@[%s@] ->@ @[%s@]@]" (aux_pat p) (aux e) in (*let typ = e.exp_type in*) match e.exp_desc with | Texp_ident (p,loc,vd) -> string_of_path p (* string_of_typed_var (string_of_path p) vd.val_type*) | Texp_constant c -> string_of_constant c | Texp_let (rf, l, e) -> - let l = List.map (fun b -> (b.vb_pat, b.vb_expr)) l in let show_pe (p,e) = - let sp = (string_of_let_pattern false p) in + let sp = (string_of_let_pattern false fvs p) in let se = aux e in Format.sprintf "%s =@ @[%s@]" sp se in let sl = show_list show_pe " and " l in let se = aux e in Format.sprintf "@[let%s %s in@ @[%s@]@]" (string_of_recflag rf) sl se | Texp_function (_,c1::[], pa) -> - let _p = c1.c_lhs in - let e = c1.c_rhs in + let p1 = c1.c_lhs in + let e1 = c1.c_rhs in let rec explore pats e = match e.exp_desc with - | Texp_function (_,c1::[], pa) -> - let p1 = c1.c_lhs in - let e1 = c1.c_rhs in + | Texp_function (_,(p1,e1)::[], pa) -> explore (p1::pats) e1 | _ -> List.rev pats, e in @@ -153,8 +170,7 @@ let rec string_of_expression par e = let sl = show_list show_arg " " l in let s = sprintf "%s %s" se sl in show_par par s - | Texp_match (e, l, le, pa) -> - if le <> [] then unsupported "match with exception branches"; + | Texp_match (e, l, pa) -> let se = aux e in let s = Format.sprintf "@[match@ @[%s@] with@ @[%s@]@]" se (show_list string_of_branch " | " l) in @@ -163,7 +179,7 @@ let rec string_of_expression par e = | Texp_tuple l -> show_par true (show_list aux ", " l) | Texp_construct (p, cd, es) -> - let c = string_of_lident_loc p in + let c = string_of_path p in if es = [] then c else if List.length es = 1 @@ -174,14 +190,14 @@ let rec string_of_expression par e = | Texp_record (l,Some eo) -> unsupported "record-with" | Texp_record (l,None) -> let print_item (p,li,ei) = - Format.sprintf "%s = %s" (string_of_lident_loc p) (aux ei) in + Format.sprintf "%s = %s" (string_of_path p) (aux ei) in let s = Format.sprintf "@[{%s}@]" (show_list print_item "; " l) in show_par par s | Texp_field (e,p,i) -> - let s = Format.sprintf "@[%s.%s@]" (aux e) (string_of_lident_loc p) in + let s = Format.sprintf "@[%s.%s@]" (aux e) (string_of_path p) in show_par par s | Texp_setfield (e,p,i,e2) -> - let s = Format.sprintf "@[%s.%s <- %s@]" (aux e) (string_of_lident_loc p) (aux e2) in + let s = Format.sprintf "@[%s.%s <- %s@]" (aux e) (string_of_path p) (aux e2) in show_par par s | Texp_array l -> unsupported "array expression" (* Texp_array (List.map aux l)*) | Texp_ifthenelse (e1, e2, None) -> @@ -190,30 +206,37 @@ let rec string_of_expression par e = | Texp_ifthenelse (e1, e2, Some e3) -> let s = Format.sprintf "@[if %s@ then %s@ else %s@]" (aux e1) (aux e2) (aux e3) in show_par par s + | Texp_when (e1,e2) -> (*todo:better printing so that compiles *) + Format.sprintf "<< when %s >> %s" (aux e1) (aux e2) | Texp_sequence (e1,e2) -> let s = Format.sprintf "@[%s@ ; %s@]" (aux e1) (aux e2) in show_par par s | Texp_while (e1,e2) -> let s = Format.sprintf "@[while %s@ do %s@ done@]" (aux e1) (aux e2) in show_par par s - | Texp_for (i,pat,e1,e2,d,e3) -> - (* TODO: what is pat? *) + | Texp_for (i,e1,e2,d,e3) -> let s = Format.sprintf "@[for %s = %s to %s do@ %s@ done@]" (Ident.name i) (aux e1) (aux e2) (aux e3) in show_par par s | Texp_send (_,_,_) -> unsupported "send expression" | Texp_new _ -> unsupported "new expression" - | Texp_instvar (_,_,_) -> unsupported "inst-var expression" - | Texp_setinstvar (_,_,_,_) -> unsupported "set-inst-var expression" + | Texp_instvar (_,_) -> unsupported "inst-var expression" + | Texp_setinstvar (_,_,_) -> unsupported "set-inst-var expression" | Texp_override _ -> unsupported "Pexp_override expression" - | Texp_letmodule (_,_,_,_) -> unsupported "let-module expression" + | Texp_letmodule (_,_,_) -> unsupported "let-module expression" | Texp_assert e -> let s = Format.sprintf "@[assert %s@]" (aux e) in show_par par s + | Texp_assertfalse -> + show_par par "assert false" | Texp_lazy e -> let s = Format.sprintf "@[lazy %s@]" (aux e) in show_par par s | Texp_object _ -> unsupported "objects" + | Texp_poly (_,_) -> unsupported "poly" + | Texp_newtype (_,_) -> unsupported "newtype" | Texp_pack _ -> unsupported "pack" + | Texp_open (_,_) -> unsupported "open" + | Texp_constraint (e,_,_) -> aux e (*#########################################################################*) @@ -285,9 +308,9 @@ let is_simple_type_decl (name,decl) = let rec string_of_module m = match m.mod_desc with - | Tmod_ident (p, li) -> string_of_path p + | Tmod_ident p -> string_of_path p | Tmod_structure s -> sprintf "struct\n%s\nend\n" (string_of_structure s) - | Tmod_functor (id,_,mt,me) -> sprintf "%s : _ ==>%s\n" (string_of_ident id) (string_of_module me) + | Tmod_functor (id,mt,me) -> sprintf "%s : _ ==>%s\n" (string_of_ident id) (string_of_module me) | Tmod_apply (me1,me2,mc) -> sprintf "%s %s" (string_of_module me1) (string_of_module me2) | Tmod_constraint (me,_,mt,mc) -> sprintf "(%s : _)" (string_of_module me) | Tmod_unpack (_,_) -> unsupported "unpack" @@ -298,33 +321,23 @@ and string_of_structure (s:structure) = and string_of_structure_item (si:structure_item) = Printtyp.reset(); match si.str_desc with - | Tstr_eval (e,_) -> sprintf "let _ = %s" (string_of_expression false e) - | Tstr_value (r,l) -> - let show_pe b = - let p = b.vb_pat in - let e = b.vb_expr in - let sp = string_of_let_pattern false p in + | Tstr_eval e -> sprintf "let _ = %s" (string_of_expression false e) + | Tstr_value (r,fvs,l) -> + let show_pe (p,e) = + let sp = string_of_let_pattern false fvs p in let se = string_of_expression false e in Format.sprintf "%s =@ @[%s@]" sp se in let sl = show_list show_pe " and " l in Format.sprintf "@[let%s %s@]" (string_of_recflag r) sl (* Format.sprintf "@[let%s %s =@ @[<2>%s@]@]" *) - | Tstr_primitive _ -> unsupported "primitive" - (* sprintf "val %s : _" (string_of_ident id) *) + | Tstr_primitive (id,v) -> sprintf "val %s : _" (string_of_ident id) | Tstr_type l -> sprintf "type _ = _" - | Tstr_exception _ -> unsupported "exception" - (* sprintf "exception %s = _" (string_of_ident id) *) - | Tstr_module mb -> Format.sprintf "@[module %s =@ @[<2>%s] @]" (string_of_ident mb.mb_id) (string_of_module_binding mb) + | Tstr_exception (id,e) -> sprintf "exception %s = _" (string_of_ident id) + | Tstr_exn_rebind (id,p) -> unsupported "exception-rebind" + | Tstr_module (id,m) -> Format.sprintf "@[module %s =@ @[<2>%s] @]" (string_of_ident id) (string_of_module m) | Tstr_recmodule _ -> unsupported "recursive modules" - | Tstr_modtype _ -> unsupported "module type declaration" - (* sprintf "module type %s = _" (string_of_ident id) *) - | Tstr_open p -> unsupported "open" (* sprintf "open %s = _" (string_of_path p) *) + | Tstr_modtype (id,mt) -> sprintf "module type %s = _" (string_of_ident id) + | Tstr_open p -> sprintf "open %s = _" (string_of_path p) | Tstr_class _ -> unsupported "objects" | Tstr_class_type _ -> unsupported "objects" - | Tstr_include _ -> unsupported "includ" - (* sprintf "include %s" (string_of_module m) *) - | Tstr_typext _ -> unsupported "extension" - | Tstr_attribute _ -> unsupported "attribute" - -and string_of_module_binding mb = - string_of_module mb.mb_expr \ No newline at end of file + | Tstr_include (m,ids) -> sprintf "include %s" (string_of_module m) diff --git a/generator/transformations.org b/generator/transformations.org new file mode 100644 index 0000000000000000000000000000000000000000..c4ef84bab4624b2cfdecc899f0f0c995212c3604 --- /dev/null +++ b/generator/transformations.org @@ -0,0 +1,204 @@ + +* build_error + +** Coq + +Definition build_error S vproto vmsg : result := + let O := object_new vproto "Error" in + let '(l, S') := object_alloc S O in + ifb vmsg = undef then out_ter S' l + else result_not_yet_implemented. + +** ML + +let build_error S vproto vmsg = + let O = object_new vproto "Error" in + let (l, S') := object_alloc S O in + if value_compare vmsg undef then out_ter S' l + else result_not_yet_implemented + +** JS + +function build_error(S, vproto, vmsg) { + var O = object_new(vproto, "Error"); + var l = object_alloc(S, O).first; + var S2 = object_alloc(S, O).second; + if (value_compare(vmsg, undef) { + return out_ter(S2, l); + } else { + return result_not_yet_implemented; + } +} + +** JS, with log + +function build_error(S, vproto, vmsg) { + log_custom({line: line, type: "enter"}); + var res = build_error__body(S, vproto, vmsg); + var ctx = ctx_empty(); + ctx = ctx_push(ctx, "res", res, "result"); + log_custom({line: line, type: "exit", ctx: ctx}); + return res; +} + +function build_error__body(S, vproto, vmsg) { + var ctx = ctx_empty(); + ctx = ctx_push(ctx, "S", S, "state"); + ctx = ctx_push(ctx, "vproto", vproto, "value"); + ctx = ctx_push(ctx, "vmsg", vmsg, "value"); + log(1, ctx, "build_error"); + var O = object_new(vproto, "Error"); + ctx = ctx_push(ctx, "O", O, "object"); + log(2, ctx, "var"); + var l = object_alloc(S, O).first; + var S2 = object_alloc(S, O).second; + ctx = ctx_push(ctx, "l", l, "location"); + ctx = ctx_push(ctx, "S2", S2, "state"); + log(3, ctx, "var"); + if (value_compare(vmsg, undef) { + log(4, ctx, "case"); + return out_ter(S2, l); + } else { + log(5, ctx, "case"); + return result_not_yet_implemented; + } +} + + +* run_error + +** Coq + +Definition run_error T S ne : specres T := + if_object (build_error S (prealloc_native_error_proto ne) undef) (fun S' l => + result_some (specret_out (out_ter S' (res_throw l)))). + +** ML + +let run_error (*T*) S ne = + if_object (build_error S (prealloc_native_error_proto ne) undef) (fun S' l -> + result_some (specret_out (out_ter S' (res_throw l)))) + +** JS + +function run_error(S, ne) { + return if_object(build_error(S, prealloc_native_error_proto(ne), undef), function (S2, l) { + return result_some(specret_out(out_ter(S2, (res_throw(l)))))}); +} + + +** JS, with log + +function run_error(S, ne) { + log_custom({line: line, type: "enter"}); + var res = run_error__body(S, ne); + var ctx = ctx_empty(); + ctx = ctx_push(ctx, "res", res, "result"); + log_custom({line: line, type: "exit", ctx: ctx}); + return res; +} + +function run_error__body(S, ne) { + var ctx = ctx_empty(); + ctx = ctx_push(ctx, "S", S, "state"); + ctx = ctx_push(ctx, "ne", ne, "error"); + log(1, ctx, "run_error"); + return if_object(build_error(S, prealloc_native_error_proto(ne), undef), function (S2, l) { + ctx = ctx_push(ctx, "S2", S2, "state"); + ctx = ctx_push(ctx, "l", l, "location"); + log(2, ctx, "fun"); + return result_some(specret_out(out_ter(S2, (res_throw(l)))))}); +} + +* object_proto_is_prototype_of + +** Coq + +Definition object_proto_is_prototype_of runs S l0 l : result := + if_some (run_object_method object_proto_ S l) (fun B => + match B return result with + | null => out_ter S false + | value_object l' => + ifb l' = l0 + then out_ter S true + else runs_type_object_proto_is_prototype_of runs S l0 l' + | value_prim _ => + impossible_with_heap_because S "[run_object_method] returned a primitive in [object_proto_is_prototype_of_body]." + end). + +** ML + +let object_proto_is_prototype_of S l0 l = + if_some (run_object_method object_proto_ S l) (fun B -> + match B with + | null -> out_ter S false + | value_object l' -> + if loc_compare l' l0 + then out_ter S true + else runs_type_object_proto_is_prototype_of S l0 l' + | value_prim _ -> + impossible_with_heap_because S "[run_object_method] returned a primitive in [object_proto_is_prototype_of_body]." + end) + +** JS + +function object_proto_is_prototype_of(S, l0, l) { + return if_some (run_object_method(object_proto_, S, l), function (B) { + switch (B.tag) { + case "null": // "prim"? + return out_ter(S, false); + case "value_object": + var l2 = B.l; + if (loc_compare (l2, l0)) { + return out_ter(S, true); + } else { + return runs_type_object_proto_is_prototype_of(S, l0, l2); + } + case "value_prim": + return impossible_with_heap_because(S, "[run_object_method] returned a primitive in [object_proto_is_prototype_of_body]."); + } + }); +} + +** JS, with log + +function object_proto_is_prototype_of(S, l0, l) { + log_custom({line: line, type: "enter"}); + var res = object_proto_is_prototype_of__body(S, l0, l); + var ctx = ctx_empty(); + ctx = ctx_push(ctx, "res", res, "result"); + log_custom({line: line, type: "exit", ctx: ctx}); + return res; +} + +function object_proto_is_prototype_of__body(S, l0, l) { + var ctx = ctx_empty(); + ctx = ctx_push(ctx, "S", S, "state"); + ctx = ctx_push(ctx, "l0", l0, "location"); + ctx = ctx_push(ctx, "l", l, "location"); + log(1, ctx, "object_proto_is_prototype_of"); + return if_some (run_object_method(object_proto_, S, l), function (B) { + ctx = ctx_push(ctx, "B", B); + log(2, ctx, "fun"); + switch (B.tag) { + case "null": // "prim"? + log(3, ctx, "case"); + return out_ter(S, false); + case "value_object": + var l2 = B.l; + ctx = ctx_push(ctx, "l2", l2); + log(3, ctx, "case"); + if (loc_compare (l2, l0)) { + log(4, ctx, "case"); + return out_ter(S, true); + } else { + log(5, ctx, "case"); + return runs_type_object_proto_is_prototype_of(S, l0, l2); + } + case "value_prim": + log(6, ctx, "case"); + return impossible_with_heap_because(S, "[run_object_method] returned a primitive in [object_proto_is_prototype_of_body]."); + } + }); +} +