*)
open Syntax
+open Format
+
+type var =
+{
+ stem: string;
+ mark: int
+}
+
+type cg_state
+
+let ident_of_var v =
+ match v.mark with
+ | 0 -> Printf.sprintf "%s" v.stem
+ | d -> Printf.sprintf "%s_%d" v.stem d
+
+module type VAR_ENV = sig
+ type t
+ val new_env: t
+ val new_ident_from_string: string -> var * t
+ val new_ident_from_type: complex_type -> var * t
+end
+
+module type TYPE_ENV = sig
+ type 'a t
+ val new_env: 'a t
+ val record: 'a t -> var -> 'a -> 'a t
+ val lookup: 'a t -> var -> 'a
+end
+
+module type TO = sig
+ val disp_array: formatter -> var list -> formatter
+ val disp_object: formatter -> (string * var) list -> formatter
+ val let_binding: cg_state -> formatter
+ -> (* out *) var -> (* in *) var -> complex_type
+ -> formatter
+end
+
+let generate_to_def ff (tname, trep) =
+ let fn = tname ^ "_to_json" in
+ match trep with
+ | C_base _ ->
+ (* already present in lib; assumed generated for B_ident *)
+ ()
+ | _ -> Printf.printf "Generating %s\n" fn
+
+let generate_from_def ff (tname, trep) =
+ let fn = tname ^ "_from_json" in
+ Printf.printf "Generating %s\n" fn
let generate defn_list f =
- Printf.printf "Generating conversions for %d definitions in %s.\n" (List.length defn_list) f
+ let generate_one ff td =
+ generate_to_def ff td;
+ generate_from_def ff td in
+ let generate_one_defn ff td =
+ List.iter (generate_one ff) td in
+ let ff = formatter_of_out_channel (open_out f) in
+ List.iter (generate_one_defn ff) defn_list