Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Page
Library
Module
Module type
Parameter
Class
Class type
Source
lang_codegen.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
open Batteries open Ast open Lang open Ast_helper (** convert [np_type] into [core_type] **) let rec gen_core_type ~loc = function | NP_term ct -> ct | NP_nonterm x -> let term_id : lid = {txt = Longident.Lident x; loc} in {ptyp_desc = Ptyp_constr (term_id, []); ptyp_loc = loc; ptyp_attributes = []} | NP_tuple npts -> let cts = Ptyp_tuple (List.map (gen_core_type ~loc) npts) in {ptyp_desc = cts; ptyp_loc = loc; ptyp_attributes = []} | NP_list npt -> let elem_ct = gen_core_type ~loc npt in let list_ct = Ptyp_constr ({txt = Longident.Lident "list"; loc}, [ elem_ct ]) in {ptyp_desc = list_ct; ptyp_loc = loc; ptyp_attributes = []} (** convert [np_nonterm] into [type_declaration] **) let gen_type_decl {npnt_loc = loc; npnt_name = nt_name; npnt_productions = prds} = let row_of_prod {nppr_name = name; nppr_arg = arg} = Rtag (name, [], Option.is_none arg, match arg with | Some npt -> [ gen_core_type ~loc npt ] | None -> []) in let polyvar_desc = Ptyp_variant (List.map row_of_prod prds, Closed, None) in {ptype_name = {txt = nt_name; loc}; ptype_loc = loc; ptype_attributes = []; ptype_params = []; ptype_kind = Ptype_abstract; ptype_cstrs = []; ptype_private = Public; ptype_manifest = Some {ptyp_desc = polyvar_desc; ptyp_loc = loc; ptyp_attributes = []}} (** convert [np_language] into [module_binding] **) let gen_module_binding {npl_loc = loc; npl_name = lang_name; npl_nonterms = nonterms} = let struct_desc = Pmod_structure [ {pstr_desc = Pstr_type (Recursive, List.map gen_type_decl nonterms); pstr_loc = loc} ] in {pmb_name = {txt = lang_name; loc}; pmb_loc = loc; pmb_attributes = []; pmb_expr = {pmod_desc = struct_desc; pmod_loc = loc; pmod_attributes = []}}