Blob Blame History Raw
From f137332fdb7376f742f1c3c184764cb562ea931e Mon Sep 17 00:00:00 2001
From: Chet Murthy <chetsky@gmail.com>
Date: Wed, 29 Apr 2020 11:38:50 -0700
Subject: [PATCH 07/10] start on 4.11.0

---
 lib/versdep.ml                           |  19 +-
 main/ast2pt.ml                           |   4 +-
 main/ast2pt.mli                          |   3 +
 ocaml_src/lib/versdep/4.11.0.ml          | 808 +++++++++++++++++++
 ocaml_src/main/ast2pt.ml                 |   4 +-
 ocaml_stuff/4.11.0/parsing/.depend       |   4 +
 ocaml_stuff/4.11.0/parsing/.gitignore    |   1 +
 ocaml_stuff/4.11.0/parsing/Makefile      |  19 +
 ocaml_stuff/4.11.0/parsing/asttypes.mli  |  63 ++
 ocaml_stuff/4.11.0/parsing/location.mli  | 287 +++++++
 ocaml_stuff/4.11.0/parsing/longident.mli |  60 ++
 ocaml_stuff/4.11.0/parsing/parsetree.mli | 970 +++++++++++++++++++++++
 ocaml_stuff/4.11.0/utils/.depend         |   2 +
 ocaml_stuff/4.11.0/utils/.gitignore      |   1 +
 ocaml_stuff/4.11.0/utils/Makefile        |  27 +
 ocaml_stuff/4.11.0/utils/pconfig.ml      |   2 +
 ocaml_stuff/4.11.0/utils/pconfig.mli     |   2 +
 ocaml_stuff/4.11.0/utils/warnings.mli    | 140 ++++
 18 files changed, 2407 insertions(+), 9 deletions(-)
 create mode 100644 ocaml_src/lib/versdep/4.11.0.ml
 create mode 100644 ocaml_stuff/4.11.0/parsing/.depend
 create mode 100644 ocaml_stuff/4.11.0/parsing/.gitignore
 create mode 100644 ocaml_stuff/4.11.0/parsing/Makefile
 create mode 100644 ocaml_stuff/4.11.0/parsing/asttypes.mli
 create mode 100644 ocaml_stuff/4.11.0/parsing/location.mli
 create mode 100644 ocaml_stuff/4.11.0/parsing/longident.mli
 create mode 100644 ocaml_stuff/4.11.0/parsing/parsetree.mli
 create mode 100644 ocaml_stuff/4.11.0/utils/.depend
 create mode 100644 ocaml_stuff/4.11.0/utils/.gitignore
 create mode 100644 ocaml_stuff/4.11.0/utils/Makefile
 create mode 100644 ocaml_stuff/4.11.0/utils/pconfig.ml
 create mode 100644 ocaml_stuff/4.11.0/utils/pconfig.mli
 create mode 100644 ocaml_stuff/4.11.0/utils/warnings.mli

diff --git a/lib/versdep.ml b/lib/versdep.ml
index b766160a..1481e265 100644
--- a/lib/versdep.ml
+++ b/lib/versdep.ml
@@ -583,14 +583,19 @@ value ocaml_pconst_float s =
   ELSE Pconst_float s None END
 ;
 
-value ocaml_const_string s =
+value ocaml_const_string s loc =
   IFDEF OCAML_VERSION < OCAML_4_02_0 THEN Const_string s
-  ELSE Const_string s None END
+  ELSIFDEF OCAML_VERSION < OCAML_4_11_0 THEN
+    Const_string s None
+  ELSE
+    Const_string s loc None
+  END
 ;
-value ocaml_pconst_string s so =
+value ocaml_pconst_string s loc so =
   IFDEF OCAML_VERSION < OCAML_4_02_0 THEN Const_string s
   ELSIFDEF OCAML_VERSION < OCAML_4_03_0 THEN Const_string s so
-  ELSE Pconst_string s so END
+  ELSIFDEF OCAML_VERSION < OCAML_4_11_0 THEN Pconst_string s so
+  ELSE Pconst_string s loc so END
 ;
 
 value pconst_of_const =
@@ -617,7 +622,11 @@ value pconst_of_const =
     fun
     [ Const_int i -> ocaml_pconst_int i
     | Const_char c -> ocaml_pconst_char c
-    | Const_string s so -> ocaml_pconst_string s so
+    | IFDEF OCAML_VERSION < OCAML_4_11_0 THEN
+        Const_string s so -> ocaml_pconst_string s so
+      ELSE
+        Const_string s loc so -> ocaml_pconst_string s loc so
+      END
     | Const_float s -> ocaml_pconst_float s
     | Const_int32 i32 -> Pconst_integer (Int32.to_string i32) (Some 'l')
     | Const_int64 i64 -> Pconst_integer (Int64.to_string i64) (Some 'L')
diff --git a/main/ast2pt.ml b/main/ast2pt.ml
index b280ac19..4b97a074 100644
--- a/main/ast2pt.ml
+++ b/main/ast2pt.ml
@@ -607,7 +607,7 @@ value rec patt =
   | PaStr loc s →
       mkpat loc
         (Ppat_constant
-           (ocaml_pconst_string (string_of_string_token loc (uv s)) None))
+           (ocaml_pconst_string (string_of_string_token loc (uv s)) (mkloc loc) None))
   | PaTup loc pl → mkpat loc (Ppat_tuple (List.map patt (uv pl)))
   | PaTyc loc p t → mkpat loc (Ppat_constraint (patt p) (ctyp t))
   | PaTyp loc sl →
@@ -1045,7 +1045,7 @@ value rec expr =
   | ExStr loc s →
       mkexp loc
         (Pexp_constant
-           (ocaml_pconst_string (string_of_string_token loc (uv s)) None))
+           (ocaml_pconst_string (string_of_string_token loc (uv s)) (mkloc loc) None))
   | ExTry loc e pel → mkexp loc (Pexp_try (expr e) (List.map mkpwe (uv pel)))
   | ExTup loc el → mkexp loc (Pexp_tuple (List.map expr (uv el)))
   | ExTyc loc e t →
diff --git a/main/ast2pt.mli b/main/ast2pt.mli
index 949af7d7..80b54dc3 100644
--- a/main/ast2pt.mli
+++ b/main/ast2pt.mli
@@ -15,3 +15,6 @@ value mkloc : Ploc.t -> Location.t;
    (** Convert a Camlp5 location into an OCaml location. *)
 value fast : ref bool;
    (** Flag to generate fast (unsafe) access to arrays. Default: False. *)
+value ctyp : MLast.ctyp -> Parsetree.core_type ;
+value expr : MLast.expr -> Parsetree.expression ;
+value patt : MLast.patt -> Parsetree.pattern ;
diff --git a/ocaml_src/lib/versdep/4.11.0.ml b/ocaml_src/lib/versdep/4.11.0.ml
new file mode 100644
index 00000000..bb7124dd
--- /dev/null
+++ b/ocaml_src/lib/versdep/4.11.0.ml
@@ -0,0 +1,808 @@
+(* camlp5r pa_macro.cmo *)
+(* versdep.ml,v *)
+(* Copyright (c) INRIA 2007-2017 *)
+
+open Parsetree;;
+open Longident;;
+open Asttypes;;
+
+type ('a, 'b) choice =
+    Left of 'a
+  | Right of 'b
+;;
+
+let option_map f x =
+  match x with
+    Some x -> Some (f x)
+  | None -> None
+;;
+let mustSome symbol =
+  function
+    Some x -> x
+  | None -> failwith ("Some: " ^ symbol)
+;;
+
+let ocaml_name = "ocaml";;
+
+let sys_ocaml_version = Sys.ocaml_version;;
+
+let ocaml_location (fname, lnum, bolp, lnuml, bolpl, bp, ep) =
+  let loc_at n lnum bolp =
+    {Lexing.pos_fname = if lnum = -1 then "" else fname;
+     Lexing.pos_lnum = lnum; Lexing.pos_bol = bolp; Lexing.pos_cnum = n}
+  in
+  {Location.loc_start = loc_at bp lnum bolp;
+   Location.loc_end = loc_at ep lnuml bolpl;
+   Location.loc_ghost = bp = 0 && ep = 0}
+;;
+
+let loc_none =
+  let loc =
+    {Lexing.pos_fname = "_none_"; Lexing.pos_lnum = 1; Lexing.pos_bol = 0;
+     Lexing.pos_cnum = -1}
+  in
+  {Location.loc_start = loc; Location.loc_end = loc;
+   Location.loc_ghost = true}
+;;
+
+let mkloc loc txt = {Location.txt = txt; Location.loc = loc};;
+let mknoloc txt = mkloc loc_none txt;;
+
+let ocaml_id_or_li_of_string_list loc sl =
+  let mkli s =
+    let rec loop f =
+      function
+        i :: il -> loop (fun s -> Ldot (f i, s)) il
+      | [] -> f s
+    in
+    loop (fun s -> Lident s)
+  in
+  match List.rev sl with
+    [] -> None
+  | s :: sl -> Some (mkli s (List.rev sl))
+;;
+
+let list_map_check f l =
+  let rec loop rev_l =
+    function
+      x :: l ->
+        begin match f x with
+          Some s -> loop (s :: rev_l) l
+        | None -> None
+        end
+    | [] -> Some (List.rev rev_l)
+  in
+  loop [] l
+;;
+
+let labelled lab =
+  if lab = "" then Nolabel
+  else if lab.[0] = '?' then
+    Optional (String.sub lab 1 (String.length lab - 1))
+  else Labelled lab
+;;
+
+(* *)
+
+let ocaml_value_description vn t p =
+  {pval_type = t; pval_prim = p; pval_loc = t.ptyp_loc;
+   pval_name = mkloc t.ptyp_loc vn; pval_attributes = []}
+;;
+
+let ocaml_class_type_field loc ctfd =
+  {pctf_desc = ctfd; pctf_loc = loc; pctf_attributes = []}
+;;
+
+let ocaml_class_field loc cfd =
+  {pcf_desc = cfd; pcf_loc = loc; pcf_attributes = []}
+;;
+
+let ocaml_mktyp loc x =
+  {ptyp_desc = x; ptyp_loc = loc; ptyp_loc_stack = []; ptyp_attributes = []}
+;;
+let ocaml_mkpat loc x =
+  {ppat_desc = x; ppat_loc = loc; ppat_loc_stack = []; ppat_attributes = []}
+;;
+let ocaml_mkexp loc x =
+  {pexp_desc = x; pexp_loc = loc; pexp_loc_stack = []; pexp_attributes = []}
+;;
+let ocaml_mkmty loc x =
+  {pmty_desc = x; pmty_loc = loc; pmty_attributes = []}
+;;
+let ocaml_mkmod loc x =
+  {pmod_desc = x; pmod_loc = loc; pmod_attributes = []}
+;;
+let ocaml_mkfield loc (lab, x) fl =
+  {pof_desc = Otag (mkloc loc lab, x); pof_loc = loc; pof_attributes = []} ::
+  fl
+;;
+let ocaml_mkfield_var loc = [];;
+
+let variance_of_bool_bool =
+  function
+    false, true -> Contravariant
+  | true, false -> Covariant
+  | _ -> Invariant
+;;
+
+let ocaml_type_declaration tn params cl tk pf tm loc variance =
+  match list_map_check (fun s_opt -> s_opt) params with
+    Some params ->
+      let _ =
+        if List.length params <> List.length variance then
+          failwith "internal error: ocaml_type_declaration"
+      in
+      let params =
+        List.map2
+          (fun os va ->
+             ocaml_mktyp loc (Ptyp_var os), variance_of_bool_bool va)
+          params variance
+      in
+      Right
+        {ptype_params = params; ptype_cstrs = cl; ptype_kind = tk;
+         ptype_private = pf; ptype_manifest = tm; ptype_loc = loc;
+         ptype_name = mkloc loc tn; ptype_attributes = []}
+  | None -> Left "no '_' type param in this ocaml version"
+;;
+
+let ocaml_class_type =
+  Some (fun d loc -> {pcty_desc = d; pcty_loc = loc; pcty_attributes = []})
+;;
+
+let ocaml_class_expr =
+  Some (fun d loc -> {pcl_desc = d; pcl_loc = loc; pcl_attributes = []})
+;;
+
+let ocaml_class_structure p cil = {pcstr_self = p; pcstr_fields = cil};;
+
+let ocaml_pmty_ident loc li = Pmty_ident (mkloc loc li);;
+
+
+let ocaml_pmty_functor sloc mt1 mt2 =
+  let mt1 =
+    match mt1 with
+      None -> Unit
+    | Some (idopt, mt) -> Named (mknoloc idopt, mt)
+  in
+  Pmty_functor (mt1, mt2)
+;;
+
+let ocaml_pmty_typeof = Some (fun me -> Pmty_typeof me);;
+
+let ocaml_pmty_with mt lcl =
+  let lcl = List.map snd lcl in Pmty_with (mt, lcl)
+;;
+
+let ocaml_ptype_abstract = Ptype_abstract;;
+
+let ocaml_ptype_record ltl priv =
+  Ptype_record
+    (List.map
+       (fun (s, mf, ct, loc) ->
+          {pld_name = mkloc loc s; pld_mutable = mf; pld_type = ct;
+           pld_loc = loc; pld_attributes = []})
+       ltl)
+;;
+
+let ocaml_ptype_variant ctl priv =
+  try
+    let ctl =
+      List.map
+        (fun (c, tl, rto, loc) ->
+           if rto <> None then raise Exit
+           else
+             let tl = Pcstr_tuple tl in
+             {pcd_name = mkloc loc c; pcd_args = tl; pcd_res = None;
+              pcd_loc = loc; pcd_attributes = []})
+        ctl
+    in
+    Some (Ptype_variant ctl)
+  with Exit -> None
+;;
+
+let ocaml_ptyp_arrow lab t1 t2 = Ptyp_arrow (labelled lab, t1, t2);;
+
+let ocaml_ptyp_class li tl ll = Ptyp_class (mknoloc li, tl);;
+
+let ocaml_ptyp_constr loc li tl = Ptyp_constr (mkloc loc li, tl);;
+
+let ocaml_ptyp_object loc ml is_open =
+  Ptyp_object (ml, (if is_open then Open else Closed))
+;;
+
+let ocaml_ptyp_package = Some (fun pt -> Ptyp_package pt);;
+
+let ocaml_ptyp_poly =
+  Some
+    (fun loc cl t ->
+       match cl with
+         [] -> t.ptyp_desc
+       | _ -> Ptyp_poly (List.map (mkloc loc) cl, t))
+;;
+
+let ocaml_ptyp_variant loc catl clos sl_opt =
+  let catl =
+    List.map
+      (fun c ->
+         let d =
+           match c with
+             Left (c, a, tl) -> Rtag (mkloc loc c, a, tl)
+           | Right t -> Rinherit t
+         in
+         {prf_desc = d; prf_loc = loc; prf_attributes = []})
+      catl
+  in
+  let clos = if clos then Closed else Open in
+  Some (Ptyp_variant (catl, clos, sl_opt))
+;;
+
+let ocaml_package_type li ltl =
+  mknoloc li, List.map (fun (li, t) -> mkloc t.ptyp_loc li, t) ltl
+;;
+
+let ocaml_pconst_char c = Pconst_char c;;
+let ocaml_pconst_int i = Pconst_integer (string_of_int i, None);;
+let ocaml_pconst_float s = Pconst_float (s, None);;
+
+let ocaml_const_string s = Const_string (s, None);;
+let ocaml_pconst_string s so = Pconst_string (s, so);;
+
+let pconst_of_const =
+  function
+    Const_int i -> ocaml_pconst_int i
+  | Const_char c -> ocaml_pconst_char c
+  | Const_string (s, so) -> ocaml_pconst_string s so
+  | Const_float s -> ocaml_pconst_float s
+  | Const_int32 i32 -> Pconst_integer (Int32.to_string i32, Some 'l')
+  | Const_int64 i64 -> Pconst_integer (Int64.to_string i64, Some 'L')
+  | Const_nativeint ni -> Pconst_integer (Nativeint.to_string ni, Some 'n')
+;;
+
+let ocaml_const_int32 = Some (fun s -> Const_int32 (Int32.of_string s));;
+
+let ocaml_const_int64 = Some (fun s -> Const_int64 (Int64.of_string s));;
+
+let ocaml_const_nativeint =
+  Some (fun s -> Const_nativeint (Nativeint.of_string s))
+;;
+
+let ocaml_pexp_apply f lel =
+  Pexp_apply (f, List.map (fun (l, e) -> labelled l, e) lel)
+;;
+
+let ocaml_pexp_assertfalse fname loc =
+  Pexp_assert
+    (ocaml_mkexp loc (Pexp_construct (mkloc loc (Lident "false"), None)))
+;;
+
+let ocaml_pexp_assert fname loc e = Pexp_assert e;;
+
+let ocaml_pexp_constraint e ot1 ot2 =
+  match ot2 with
+    Some t2 -> Pexp_coerce (e, ot1, t2)
+  | None ->
+      match ot1 with
+        Some t1 -> Pexp_constraint (e, t1)
+      | None -> failwith "internal error: ocaml_pexp_constraint"
+;;
+
+let ocaml_pexp_construct loc li po chk_arity =
+  Pexp_construct (mkloc loc li, po)
+;;
+
+let ocaml_pexp_construct_args =
+  function
+    Pexp_construct (li, po) -> Some (li.txt, li.loc, po, 0)
+  | _ -> None
+;;
+
+let mkexp_ocaml_pexp_construct_arity loc li_loc li al =
+  let a = ocaml_mkexp loc (Pexp_tuple al) in
+  {pexp_desc = ocaml_pexp_construct li_loc li (Some a) true; pexp_loc = loc;
+   pexp_loc_stack = [];
+   pexp_attributes =
+     [{attr_name = mkloc loc "ocaml.explicit_arity"; attr_payload = PStr [];
+       attr_loc = loc}]}
+;;
+
+let ocaml_pexp_field loc e li = Pexp_field (e, mkloc loc li);;
+
+let ocaml_pexp_for i e1 e2 df e =
+  Pexp_for (ocaml_mkpat loc_none (Ppat_var (mknoloc i)), e1, e2, df, e)
+;;
+
+let ocaml_case (p, wo, loc, e) = {pc_lhs = p; pc_guard = wo; pc_rhs = e};;
+
+let ocaml_pexp_function lab eo pel =
+  match pel with
+    [{pc_lhs = p; pc_guard = None; pc_rhs = e}] ->
+      Pexp_fun (labelled lab, eo, p, e)
+  | pel ->
+      if lab = "" && eo = None then Pexp_function pel
+      else failwith "internal error: bad ast in ocaml_pexp_function"
+;;
+
+let ocaml_pexp_lazy = Some (fun e -> Pexp_lazy e);;
+
+let ocaml_pexp_ident loc li = Pexp_ident (mkloc loc li);;
+
+let ocaml_pexp_letmodule =
+  Some (fun i me e -> Pexp_letmodule (mknoloc i, me, e))
+;;
+
+let ocaml_pexp_new loc li = Pexp_new (mkloc loc li);;
+
+let ocaml_pexp_newtype = Some (fun loc s e -> Pexp_newtype (mkloc loc s, e));;
+
+let ocaml_pexp_object = Some (fun cs -> Pexp_object cs);;
+
+let ocaml_pexp_open =
+  Some
+    (fun li e ->
+       Pexp_open
+         ({popen_expr =
+            {pmod_desc = Pmod_ident (mknoloc li); pmod_loc = loc_none;
+             pmod_attributes = []};
+           popen_override = Fresh; popen_loc = loc_none;
+           popen_attributes = []},
+          e))
+;;
+
+let ocaml_pexp_override sel =
+  let sel = List.map (fun (s, e) -> mknoloc s, e) sel in Pexp_override sel
+;;
+
+let ocaml_pexp_pack : ('a -> 'b -> 'c, 'd) choice option =
+  Some (Right ((fun me -> Pexp_pack me), (fun pt -> Ptyp_package pt)))
+;;
+
+let ocaml_pexp_poly = Some (fun e t -> Pexp_poly (e, t));;
+
+let ocaml_pexp_record lel eo =
+  let lel = List.map (fun (li, loc, e) -> mkloc loc li, e) lel in
+  Pexp_record (lel, eo)
+;;
+
+let ocaml_pexp_send loc e s = Pexp_send (e, mkloc loc s);;
+
+let ocaml_pexp_setinstvar s e = Pexp_setinstvar (mknoloc s, e);;
+
+let ocaml_pexp_variant =
+  let pexp_variant_pat =
+    function
+      Pexp_variant (lab, eo) -> Some (lab, eo)
+    | _ -> None
+  in
+  let pexp_variant (lab, eo) = Pexp_variant (lab, eo) in
+  Some (pexp_variant_pat, pexp_variant)
+;;
+
+let ocaml_value_binding loc p e =
+  {pvb_pat = p; pvb_expr = e; pvb_loc = loc; pvb_attributes = []}
+;;
+
+let ocaml_ppat_alias p i iloc = Ppat_alias (p, mkloc iloc i);;
+
+let ocaml_ppat_array = Some (fun pl -> Ppat_array pl);;
+
+let ocaml_ppat_construct loc li po chk_arity =
+  Ppat_construct (mkloc loc li, po)
+;;
+
+let ocaml_ppat_construct_args =
+  function
+    Ppat_construct (li, po) -> Some (li.txt, li.loc, po, 0)
+  | _ -> None
+;;
+
+let mkpat_ocaml_ppat_construct_arity loc li_loc li al =
+  let a = ocaml_mkpat loc (Ppat_tuple al) in
+  {ppat_desc = ocaml_ppat_construct li_loc li (Some a) true; ppat_loc = loc;
+   ppat_loc_stack = [];
+   ppat_attributes =
+     [{attr_name = mkloc loc "ocaml.explicit_arity"; attr_payload = PStr [];
+       attr_loc = loc}]}
+;;
+
+let ocaml_ppat_lazy = Some (fun p -> Ppat_lazy p);;
+
+let ocaml_ppat_record lpl is_closed =
+  let lpl = List.map (fun (li, loc, p) -> mkloc loc li, p) lpl in
+  Ppat_record (lpl, (if is_closed then Closed else Open))
+;;
+
+let ocaml_ppat_type = Some (fun loc li -> Ppat_type (mkloc loc li));;
+
+let ocaml_ppat_unpack =
+  Some ((fun loc s -> Ppat_unpack (mkloc loc s)), (fun pt -> Ptyp_package pt))
+;;
+
+let ocaml_ppat_var loc s = Ppat_var (mkloc loc s);;
+
+let ocaml_ppat_variant =
+  let ppat_variant_pat =
+    function
+      Ppat_variant (lab, po) -> Some (lab, po)
+    | _ -> None
+  in
+  let ppat_variant (lab, po) = Ppat_variant (lab, po) in
+  Some (ppat_variant_pat, ppat_variant)
+;;
+
+let ocaml_psig_class_type = Some (fun ctl -> Psig_class_type ctl);;
+
+let ocaml_psig_exception loc s ed =
+  Psig_exception
+    {ptyexn_constructor =
+      {pext_name = mkloc loc s; pext_kind = Pext_decl (Pcstr_tuple ed, None);
+       pext_loc = loc; pext_attributes = []};
+     ptyexn_attributes = []; ptyexn_loc = loc}
+;;
+
+let ocaml_psig_include loc mt =
+  Psig_include {pincl_mod = mt; pincl_loc = loc; pincl_attributes = []}
+;;
+
+let ocaml_psig_module loc (s : string option) mt =
+  Psig_module
+    {pmd_name = mkloc loc s; pmd_type = mt; pmd_attributes = [];
+     pmd_loc = loc}
+;;
+
+let ocaml_psig_modtype loc s mto =
+  let pmtd =
+    {pmtd_name = mkloc loc s; pmtd_type = mto; pmtd_attributes = [];
+     pmtd_loc = loc}
+  in
+  Psig_modtype pmtd
+;;
+
+let ocaml_psig_open loc li =
+  Psig_open
+    {popen_expr = mknoloc li; popen_override = Fresh; popen_loc = loc;
+     popen_attributes = []}
+;;
+
+let ocaml_psig_recmodule =
+  let f ntl =
+    let ntl =
+      List.map
+        (fun (s, mt) ->
+           {pmd_name = mknoloc s; pmd_type = mt; pmd_attributes = [];
+            pmd_loc = loc_none})
+        ntl
+    in
+    Psig_recmodule ntl
+  in
+  Some f
+;;
+
+let ocaml_psig_type stl =
+  let stl = List.map (fun (s, t) -> t) stl in Psig_type (Recursive, stl)
+;;
+
+let ocaml_psig_value s vd = Psig_value vd;;
+
+let ocaml_pstr_class_type = Some (fun ctl -> Pstr_class_type ctl);;
+
+let ocaml_pstr_eval e = Pstr_eval (e, []);;
+
+let ocaml_pstr_exception loc s ed =
+  Pstr_exception
+    {ptyexn_constructor =
+      {pext_name = mkloc loc s; pext_kind = Pext_decl (Pcstr_tuple ed, None);
+       pext_loc = loc; pext_attributes = []};
+     ptyexn_attributes = []; ptyexn_loc = loc}
+;;
+
+let ocaml_pstr_exn_rebind =
+  Some
+    (fun loc s li ->
+       Pstr_exception
+         {ptyexn_constructor =
+           {pext_name = mkloc loc s; pext_kind = Pext_rebind (mkloc loc li);
+            pext_loc = loc; pext_attributes = []};
+          ptyexn_attributes = []; ptyexn_loc = loc})
+;;
+
+let ocaml_pstr_include =
+  Some
+    (fun loc me ->
+       Pstr_include {pincl_mod = me; pincl_loc = loc; pincl_attributes = []})
+;;
+
+let ocaml_pstr_modtype loc s mt =
+  let pmtd =
+    {pmtd_name = mkloc loc s; pmtd_type = Some mt; pmtd_attributes = [];
+     pmtd_loc = loc}
+  in
+  Pstr_modtype pmtd
+;;
+
+let ocaml_pstr_module loc (s : string option) me =
+  let mb =
+    {pmb_name = mkloc loc s; pmb_expr = me; pmb_attributes = [];
+     pmb_loc = loc}
+  in
+  Pstr_module mb
+;;
+
+let ocaml_pstr_open loc li =
+  Pstr_open
+    {popen_expr =
+      {pmod_desc = Pmod_ident (mknoloc li); pmod_loc = loc_none;
+       pmod_attributes = []};
+     popen_override = Fresh; popen_loc = loc; popen_attributes = []}
+;;
+
+let ocaml_pstr_primitive s vd = Pstr_primitive vd;;
+
+let ocaml_pstr_recmodule =
+  let f nel =
+    Pstr_recmodule
+      (List.map
+         (fun ((s : string option), mt, me) ->
+            {pmb_name = mknoloc s; pmb_expr = me; pmb_attributes = [];
+             pmb_loc = loc_none})
+         nel)
+  in
+  Some f
+;;
+
+let ocaml_pstr_type is_nonrec stl =
+  let stl = List.map (fun (s, t) -> t) stl in
+  Pstr_type ((if is_nonrec then Nonrecursive else Recursive), stl)
+;;
+
+let ocaml_class_infos =
+  Some
+    (fun virt (sl, sloc) name expr loc variance ->
+       let _ =
+         if List.length sl <> List.length variance then
+           failwith "internal error: ocaml_class_infos"
+       in
+       let params =
+         List.map2
+           (fun os va ->
+              ocaml_mktyp loc (Ptyp_var os), variance_of_bool_bool va)
+           sl variance
+       in
+       {pci_virt = virt; pci_params = params; pci_name = mkloc loc name;
+        pci_expr = expr; pci_loc = loc; pci_attributes = []})
+;;
+
+let ocaml_pmod_constraint loc me mt =
+  ocaml_mkmod loc (Pmod_constraint (me, mt))
+;;
+
+let ocaml_pmod_ident li = Pmod_ident (mknoloc li);;
+
+let ocaml_pmod_functor mt me =
+  let mt =
+    match mt with
+      None -> Unit
+    | Some (idopt, mt) -> Named (mknoloc idopt, mt)
+  in
+  Pmod_functor (mt, me)
+;;
+
+let ocaml_pmod_unpack : ('a -> 'b -> 'c, 'd) choice option =
+  Some (Right ((fun e -> Pmod_unpack e), (fun pt -> Ptyp_package pt)))
+;;
+
+let ocaml_pcf_cstr = Some (fun (t1, t2, loc) -> Pcf_constraint (t1, t2));;
+
+let ocaml_pcf_inher loc ce pb =
+  Pcf_inherit (Fresh, ce, option_map (mkloc loc) pb)
+;;
+
+let ocaml_pcf_init = Some (fun e -> Pcf_initializer e);;
+
+let ocaml_pcf_meth (s, pf, ovf, e, loc) =
+  let pf = if pf then Private else Public in
+  let ovf = if ovf then Override else Fresh in
+  Pcf_method (mkloc loc s, pf, Cfk_concrete (ovf, e))
+;;
+
+let ocaml_pcf_val (s, mf, ovf, e, loc) =
+  let mf = if mf then Mutable else Immutable in
+  let ovf = if ovf then Override else Fresh in
+  Pcf_val (mkloc loc s, mf, Cfk_concrete (ovf, e))
+;;
+
+let ocaml_pcf_valvirt =
+  let ocaml_pcf (s, mf, t, loc) =
+    let mf = if mf then Mutable else Immutable in
+    Pcf_val (mkloc loc s, mf, Cfk_virtual t)
+  in
+  Some ocaml_pcf
+;;
+
+let ocaml_pcf_virt (s, pf, t, loc) =
+  Pcf_method (mkloc loc s, pf, Cfk_virtual t)
+;;
+
+let ocaml_pcl_apply =
+  Some
+    (fun ce lel -> Pcl_apply (ce, List.map (fun (l, e) -> labelled l, e) lel))
+;;
+
+let ocaml_pcl_constr = Some (fun li ctl -> Pcl_constr (mknoloc li, ctl));;
+
+let ocaml_pcl_constraint = Some (fun ce ct -> Pcl_constraint (ce, ct));;
+
+let ocaml_pcl_fun =
+  Some (fun lab ceo p ce -> Pcl_fun (labelled lab, ceo, p, ce))
+;;
+
+let ocaml_pcl_let = Some (fun rf pel ce -> Pcl_let (rf, pel, ce));;
+
+let ocaml_pcl_structure = Some (fun cs -> Pcl_structure cs);;
+
+let ocaml_pctf_cstr = Some (fun (t1, t2, loc) -> Pctf_constraint (t1, t2));;
+
+let ocaml_pctf_inher ct = Pctf_inherit ct;;
+
+let ocaml_pctf_meth (s, pf, t, loc) =
+  Pctf_method (mkloc loc s, pf, Concrete, t)
+;;
+
+let ocaml_pctf_val (s, mf, t, loc) = Pctf_val (mkloc loc s, mf, Concrete, t);;
+
+let ocaml_pctf_virt (s, pf, t, loc) =
+  Pctf_method (mkloc loc s, pf, Virtual, t)
+;;
+
+let ocaml_pcty_constr = Some (fun li ltl -> Pcty_constr (mknoloc li, ltl));;
+
+let ocaml_pcty_fun =
+  Some (fun lab t ot ct -> Pcty_arrow (labelled lab, t, ct))
+;;
+
+let ocaml_pcty_signature =
+  let f (t, ctfl) =
+    let cs = {pcsig_self = t; pcsig_fields = ctfl} in Pcty_signature cs
+  in
+  Some f
+;;
+
+let ocaml_pdir_bool = Some (fun b -> Pdir_bool b);;
+let ocaml_pdir_int i s = Pdir_int (i, None);;
+let ocaml_pdir_some x = Some x;;
+let ocaml_pdir_none = None;;
+let ocaml_ptop_dir loc s da =
+  Ptop_dir
+    {pdir_name = mkloc loc s;
+     pdir_arg =
+       begin match da with
+         Some da -> Some {pdira_desc = da; pdira_loc = loc}
+       | None -> None
+       end;
+     pdir_loc = loc}
+;;
+
+let ocaml_pwith_modsubst =
+  Some (fun loc me -> Pwith_modsubst (mkloc loc (Lident ""), mkloc loc me))
+;;
+
+let ocaml_pwith_type loc (i, td) = Pwith_type (mkloc loc i, td);;
+
+let ocaml_pwith_module loc mname me =
+  Pwith_module (mkloc loc mname, mkloc loc me)
+;;
+
+let ocaml_pwith_typesubst =
+  Some (fun loc td -> Pwith_typesubst (mkloc loc (Lident ""), td))
+;;
+
+let module_prefix_can_be_in_first_record_label_only = true;;
+
+let split_or_patterns_with_bindings = false;;
+
+let has_records_with_with = true;;
+
+(* *)
+
+let jocaml_pstr_def : (_ -> _) option = None;;
+
+let jocaml_pexp_def : (_ -> _ -> _) option = None;;
+
+let jocaml_pexp_par : (_ -> _ -> _) option = None;;
+
+let jocaml_pexp_reply : (_ -> _ -> _ -> _) option = None;;
+
+let jocaml_pexp_spawn : (_ -> _) option = None;;
+
+let arg_rest =
+  function
+    Arg.Rest r -> Some r
+  | _ -> None
+;;
+
+let arg_set_string =
+  function
+    Arg.Set_string r -> Some r
+  | _ -> None
+;;
+
+let arg_set_int =
+  function
+    Arg.Set_int r -> Some r
+  | _ -> None
+;;
+
+let arg_set_float =
+  function
+    Arg.Set_float r -> Some r
+  | _ -> None
+;;
+
+let arg_symbol =
+  function
+    Arg.Symbol (s, f) -> Some (s, f)
+  | _ -> None
+;;
+
+let arg_tuple =
+  function
+    Arg.Tuple t -> Some t
+  | _ -> None
+;;
+
+let arg_bool =
+  function
+    Arg.Bool f -> Some f
+  | _ -> None
+;;
+
+let char_escaped = Char.escaped;;
+
+let hashtbl_mem = Hashtbl.mem;;
+
+let list_rev_append = List.rev_append;;
+
+let list_rev_map = List.rev_map;;
+
+let list_sort = List.sort;;
+
+let pervasives_set_binary_mode_out = set_binary_mode_out;;
+
+let printf_ksprintf = Printf.ksprintf;;
+
+let char_uppercase = Char.uppercase_ascii;;
+
+let bytes_modname = "Bytes";;
+
+let bytes_of_string s = Bytes.of_string s;;
+
+let bytes_to_string s = Bytes.to_string s;;
+
+let string_capitalize = String.capitalize_ascii;;
+
+let string_contains = String.contains;;
+
+let string_cat s1 s2 = Bytes.cat s1 s2;;
+
+let string_copy = Bytes.copy;;
+
+let string_create = Bytes.create;;
+
+let string_get = Bytes.get;;
+
+let string_index = Bytes.index;;
+
+let string_length = Bytes.length;;
+
+let string_lowercase = String.lowercase_ascii;;
+
+let string_unsafe_set = Bytes.unsafe_set;;
+
+let string_uncapitalize = String.uncapitalize_ascii;;
+
+let string_uppercase = String.uppercase_ascii;;
+
+let string_set = Bytes.set;;
+
+let string_sub = Bytes.sub;;
+
+let array_create = Array.make;;
diff --git a/ocaml_src/main/ast2pt.ml b/ocaml_src/main/ast2pt.ml
index d854c8bb..87b34922 100644
--- a/ocaml_src/main/ast2pt.ml
+++ b/ocaml_src/main/ast2pt.ml
@@ -629,7 +629,7 @@ let rec patt =
   | PaStr (loc, s) ->
       mkpat loc
         (Ppat_constant
-           (ocaml_pconst_string (string_of_string_token loc (uv s)) None))
+           (ocaml_pconst_string (string_of_string_token loc (uv s)) (mkloc loc) None))
   | PaTup (loc, pl) -> mkpat loc (Ppat_tuple (List.map patt (uv pl)))
   | PaTyc (loc, p, t) -> mkpat loc (Ppat_constraint (patt p, ctyp t))
   | PaTyp (loc, sl) ->
@@ -1225,7 +1225,7 @@ let rec expr =
   | ExStr (loc, s) ->
       mkexp loc
         (Pexp_constant
-           (ocaml_pconst_string (string_of_string_token loc (uv s)) None))
+           (ocaml_pconst_string (string_of_string_token loc (uv s)) (mkloc loc) None))
   | ExTry (loc, e, pel) ->
       mkexp loc (Pexp_try (expr e, List.map mkpwe (uv pel)))
   | ExTup (loc, el) -> mkexp loc (Pexp_tuple (List.map expr (uv el)))
diff --git a/ocaml_stuff/4.11.0/parsing/.depend b/ocaml_stuff/4.11.0/parsing/.depend
new file mode 100644
index 00000000..c589fb6e
--- /dev/null
+++ b/ocaml_stuff/4.11.0/parsing/.depend
@@ -0,0 +1,4 @@
+asttypes.cmi : location.cmi
+location.cmi : ../utils/warnings.cmi
+longident.cmi :
+parsetree.cmi : longident.cmi location.cmi asttypes.cmi
diff --git a/ocaml_stuff/4.11.0/parsing/.gitignore b/ocaml_stuff/4.11.0/parsing/.gitignore
new file mode 100644
index 00000000..8e6c39c2
--- /dev/null
+++ b/ocaml_stuff/4.11.0/parsing/.gitignore
@@ -0,0 +1 @@
+*.cm[oi]
diff --git a/ocaml_stuff/4.11.0/parsing/Makefile b/ocaml_stuff/4.11.0/parsing/Makefile
new file mode 100644
index 00000000..6d08a199
--- /dev/null
+++ b/ocaml_stuff/4.11.0/parsing/Makefile
@@ -0,0 +1,19 @@
+# Makefile,v
+
+FILES=asttypes.cmi location.cmi longident.cmi parsetree.cmi
+INCL=-I ../utils
+
+all: $(FILES)
+
+clean:
+	rm -f *.cmi
+
+depend:
+	ocamldep $(INCL) *.ml* | sed -e 's/  *$$//' > .depend
+
+.SUFFIXES: .mli .cmi
+
+.mli.cmi:
+	$(OCAMLN)c $(INCL) -c $<
+
+include .depend
diff --git a/ocaml_stuff/4.11.0/parsing/asttypes.mli b/ocaml_stuff/4.11.0/parsing/asttypes.mli
new file mode 100644
index 00000000..353d7776
--- /dev/null
+++ b/ocaml_stuff/4.11.0/parsing/asttypes.mli
@@ -0,0 +1,63 @@
+(**************************************************************************)
+(*                                                                        *)
+(*                                 OCaml                                  *)
+(*                                                                        *)
+(*             Xavier Leroy, projet Cristal, INRIA Rocquencourt           *)
+(*                                                                        *)
+(*   Copyright 1996 Institut National de Recherche en Informatique et     *)
+(*     en Automatique.                                                    *)
+(*                                                                        *)
+(*   All rights reserved.  This file is distributed under the terms of    *)
+(*   the GNU Lesser General Public License version 2.1, with the          *)
+(*   special exception on linking described in the file LICENSE.          *)
+(*                                                                        *)
+(**************************************************************************)
+
+(** Auxiliary AST types used by parsetree and typedtree.
+
+  {b Warning:} this module is unstable and part of
+  {{!Compiler_libs}compiler-libs}.
+
+*)
+
+type constant =
+    Const_int of int
+  | Const_char of char
+  | Const_string of string * Location.t * string option
+  | Const_float of string
+  | Const_int32 of int32
+  | Const_int64 of int64
+  | Const_nativeint of nativeint
+
+type rec_flag = Nonrecursive | Recursive
+
+type direction_flag = Upto | Downto
+
+(* Order matters, used in polymorphic comparison *)
+type private_flag = Private | Public
+
+type mutable_flag = Immutable | Mutable
+
+type virtual_flag = Virtual | Concrete
+
+type override_flag = Override | Fresh
+
+type closed_flag = Closed | Open
+
+type label = string
+
+type arg_label =
+    Nolabel
+  | Labelled of string (*  label:T -> ... *)
+  | Optional of string (* ?label:T -> ... *)
+
+type 'a loc = 'a Location.loc = {
+  txt : 'a;
+  loc : Location.t;
+}
+
+
+type variance =
+  | Covariant
+  | Contravariant
+  | Invariant
diff --git a/ocaml_stuff/4.11.0/parsing/location.mli b/ocaml_stuff/4.11.0/parsing/location.mli
new file mode 100644
index 00000000..ecf39b21
--- /dev/null
+++ b/ocaml_stuff/4.11.0/parsing/location.mli
@@ -0,0 +1,287 @@
+(**************************************************************************)
+(*                                                                        *)
+(*                                 OCaml                                  *)
+(*                                                                        *)
+(*             Xavier Leroy, projet Cristal, INRIA Rocquencourt           *)
+(*                                                                        *)
+(*   Copyright 1996 Institut National de Recherche en Informatique et     *)
+(*     en Automatique.                                                    *)
+(*                                                                        *)
+(*   All rights reserved.  This file is distributed under the terms of    *)
+(*   the GNU Lesser General Public License version 2.1, with the          *)
+(*   special exception on linking described in the file LICENSE.          *)
+(*                                                                        *)
+(**************************************************************************)
+
+(** {1 Source code locations (ranges of positions), used in parsetree}
+
+  {b Warning:} this module is unstable and part of
+  {{!Compiler_libs}compiler-libs}.
+
+*)
+
+open Format
+
+type t = Warnings.loc = {
+  loc_start: Lexing.position;
+  loc_end: Lexing.position;
+  loc_ghost: bool;
+}
+
+(** Note on the use of Lexing.position in this module.
+   If [pos_fname = ""], then use [!input_name] instead.
+   If [pos_lnum = -1], then [pos_bol = 0]. Use [pos_cnum] and
+     re-parse the file to get the line and character numbers.
+   Else all fields are correct.
+*)
+
+val none : t
+(** An arbitrary value of type [t]; describes an empty ghost range. *)
+
+val is_none : t -> bool
+(** True for [Location.none], false any other location *)
+
+val in_file : string -> t
+(** Return an empty ghost range located in a given file. *)
+
+val init : Lexing.lexbuf -> string -> unit
+(** Set the file name and line number of the [lexbuf] to be the start
+    of the named file. *)
+
+val curr : Lexing.lexbuf -> t
+(** Get the location of the current token from the [lexbuf]. *)
+
+val symbol_rloc: unit -> t
+val symbol_gloc: unit -> t
+
+(** [rhs_loc n] returns the location of the symbol at position [n], starting
+  at 1, in the current parser rule. *)
+val rhs_loc: int -> t
+
+val rhs_interval: int -> int -> t
+
+val get_pos_info: Lexing.position -> string * int * int
+(** file, line, char *)
+
+type 'a loc = {
+  txt : 'a;
+  loc : t;
+}
+
+val mknoloc : 'a -> 'a loc
+val mkloc : 'a -> t -> 'a loc
+
+
+(** {1 Input info} *)
+
+val input_name: string ref
+val input_lexbuf: Lexing.lexbuf option ref
+
+(* This is used for reporting errors coming from the toplevel.
+
+   When running a toplevel session (i.e. when [!input_name] is "//toplevel//"),
+   [!input_phrase_buffer] should be [Some buf] where [buf] contains the last
+   toplevel phrase. *)
+val input_phrase_buffer: Buffer.t option ref
+
+
+(** {1 Toplevel-specific functions} *)
+
+val echo_eof: unit -> unit
+val reset: unit -> unit
+
+
+(** {1 Printing locations} *)
+
+val rewrite_absolute_path: string -> string
+    (** rewrite absolute path to honor the BUILD_PATH_PREFIX_MAP
+        variable (https://reproducible-builds.org/specs/build-path-prefix-map/)
+        if it is set. *)
+
+val absolute_path: string -> string
+
+val show_filename: string -> string
+    (** In -absname mode, return the absolute path for this filename.
+        Otherwise, returns the filename unchanged. *)
+
+val print_filename: formatter -> string -> unit
+
+val print_loc: formatter -> t -> unit
+val print_locs: formatter -> t list -> unit
+
+
+(** {1 Toplevel-specific location highlighting} *)
+
+val highlight_terminfo:
+  Lexing.lexbuf -> formatter -> t list -> unit
+
+
+(** {1 Reporting errors and warnings} *)
+
+(** {2 The type of reports and report printers} *)
+
+type msg = (Format.formatter -> unit) loc
+
+val msg: ?loc:t -> ('a, Format.formatter, unit, msg) format4 -> 'a
+
+type report_kind =
+  | Report_error
+  | Report_warning of string
+  | Report_warning_as_error of string
+  | Report_alert of string
+  | Report_alert_as_error of string
+
+type report = {
+  kind : report_kind;
+  main : msg;
+  sub : msg list;
+}
+
+type report_printer = {
+  (* The entry point *)
+  pp : report_printer ->
+    Format.formatter -> report -> unit;
+
+  pp_report_kind : report_printer -> report ->
+    Format.formatter -> report_kind -> unit;
+  pp_main_loc : report_printer -> report ->
+    Format.formatter -> t -> unit;
+  pp_main_txt : report_printer -> report ->
+    Format.formatter -> (Format.formatter -> unit) -> unit;
+  pp_submsgs : report_printer -> report ->
+    Format.formatter -> msg list -> unit;
+  pp_submsg : report_printer -> report ->
+    Format.formatter -> msg -> unit;
+  pp_submsg_loc : report_printer -> report ->
+    Format.formatter -> t -> unit;
+  pp_submsg_txt : report_printer -> report ->
+    Format.formatter -> (Format.formatter -> unit) -> unit;
+}
+(** A printer for [report]s, defined using open-recursion.
+    The goal is to make it easy to define new printers by re-using code from
+    existing ones.
+*)
+
+(** {2 Report printers used in the compiler} *)
+
+val batch_mode_printer: report_printer
+
+val terminfo_toplevel_printer: Lexing.lexbuf -> report_printer
+
+val best_toplevel_printer: unit -> report_printer
+(** Detects the terminal capabilities and selects an adequate printer *)
+
+(** {2 Printing a [report]} *)
+
+val print_report: formatter -> report -> unit
+(** Display an error or warning report. *)
+
+val report_printer: (unit -> report_printer) ref
+(** Hook for redefining the printer of reports.
+
+    The hook is a [unit -> report_printer] and not simply a [report_printer]:
+    this is useful so that it can detect the type of the output (a file, a
+    terminal, ...) and select a printer accordingly. *)
+
+val default_report_printer: unit -> report_printer
+(** Original report printer for use in hooks. *)
+
+
+(** {1 Reporting warnings} *)
+
+(** {2 Converting a [Warnings.t] into a [report]} *)
+
+val report_warning: t -> Warnings.t -> report option
+(** [report_warning loc w] produces a report for the given warning [w], or
+   [None] if the warning is not to be printed. *)
+
+val warning_reporter: (t -> Warnings.t -> report option) ref
+(** Hook for intercepting warnings. *)
+
+val default_warning_reporter: t -> Warnings.t -> report option
+(** Original warning reporter for use in hooks. *)
+
+(** {2 Printing warnings} *)
+
+val formatter_for_warnings : formatter ref
+
+val print_warning: t -> formatter -> Warnings.t -> unit
+(** Prints a warning. This is simply the composition of [report_warning] and
+   [print_report]. *)
+
+val prerr_warning: t -> Warnings.t -> unit
+(** Same as [print_warning], but uses [!formatter_for_warnings] as output
+   formatter. *)
+
+(** {1 Reporting alerts} *)
+
+(** {2 Converting an [Alert.t] into a [report]} *)
+
+val report_alert: t -> Warnings.alert -> report option
+(** [report_alert loc w] produces a report for the given alert [w], or
+   [None] if the alert is not to be printed. *)
+
+val alert_reporter: (t -> Warnings.alert -> report option) ref
+(** Hook for intercepting alerts. *)
+
+val default_alert_reporter: t -> Warnings.alert -> report option
+(** Original alert reporter for use in hooks. *)
+
+(** {2 Printing alerts} *)
+
+val print_alert: t -> formatter -> Warnings.alert -> unit
+(** Prints an alert. This is simply the composition of [report_alert] and
+   [print_report]. *)
+
+val prerr_alert: t -> Warnings.alert -> unit
+(** Same as [print_alert], but uses [!formatter_for_warnings] as output
+   formatter. *)
+
+val deprecated: ?def:t -> ?use:t -> t -> string -> unit
+(** Prints a deprecation alert. *)
+
+val alert: ?def:t -> ?use:t -> kind:string -> t -> string -> unit
+(** Prints an arbitrary alert. *)
+
+
+(** {1 Reporting errors} *)
+
+type error = report
+(** An [error] is a [report] which [report_kind] must be [Report_error]. *)
+
+val error: ?loc:t -> ?sub:msg list -> string -> error
+
+val errorf: ?loc:t -> ?sub:msg list ->
+  ('a, Format.formatter, unit, error) format4 -> 'a
+
+val error_of_printer: ?loc:t -> ?sub:msg list ->
+  (formatter -> 'a -> unit) -> 'a -> error
+
+val error_of_printer_file: (formatter -> 'a -> unit) -> 'a -> error
+
+
+(** {1 Automatically reporting errors for raised exceptions} *)
+
+val register_error_of_exn: (exn -> error option) -> unit
+(** Each compiler module which defines a custom type of exception
+    which can surface as a user-visible error should register
+    a "printer" for this exception using [register_error_of_exn].
+    The result of the printer is an [error] value containing
+    a location, a message, and optionally sub-messages (each of them
+    being located as well). *)
+
+val error_of_exn: exn -> [ `Ok of error | `Already_displayed ] option
+
+exception Error of error
+(** Raising [Error e] signals an error [e]; the exception will be caught and the
+   error will be printed. *)
+
+exception Already_displayed_error
+(** Raising [Already_displayed_error] signals an error which has already been
+   printed. The exception will be caught, but nothing will be printed *)
+
+val raise_errorf: ?loc:t -> ?sub:msg list ->
+  ('a, Format.formatter, unit, 'b) format4 -> 'a
+
+val report_exception: formatter -> exn -> unit
+(** Reraise the exception if it is unknown. *)
diff --git a/ocaml_stuff/4.11.0/parsing/longident.mli b/ocaml_stuff/4.11.0/parsing/longident.mli
new file mode 100644
index 00000000..07086301
--- /dev/null
+++ b/ocaml_stuff/4.11.0/parsing/longident.mli
@@ -0,0 +1,60 @@
+(**************************************************************************)
+(*                                                                        *)
+(*                                 OCaml                                  *)
+(*                                                                        *)
+(*             Xavier Leroy, projet Cristal, INRIA Rocquencourt           *)
+(*                                                                        *)
+(*   Copyright 1996 Institut National de Recherche en Informatique et     *)
+(*     en Automatique.                                                    *)
+(*                                                                        *)
+(*   All rights reserved.  This file is distributed under the terms of    *)
+(*   the GNU Lesser General Public License version 2.1, with the          *)
+(*   special exception on linking described in the file LICENSE.          *)
+(*                                                                        *)
+(**************************************************************************)
+
+(** Long identifiers, used in parsetree.
+
+  {b Warning:} this module is unstable and part of
+  {{!Compiler_libs}compiler-libs}.
+
+*)
+
+type t =
+    Lident of string
+  | Ldot of t * string
+  | Lapply of t * t
+
+val flatten: t -> string list
+val unflatten: string list -> t option
+(** For a non-empty list [l], [unflatten l] is [Some lid] where [lid] is
+    the long identifier created by concatenating the elements of [l]
+    with [Ldot].
+    [unflatten []] is [None].
+*)
+
+val last: t -> string
+val parse: string -> t
+[@@deprecated "this function may misparse its input,\n\
+use \"Parse.longident\" or \"Longident.unflatten\""]
+(**
+
+   This function is broken on identifiers that are not just "Word.Word.word";
+   for example, it returns incorrect results on infix operators
+   and extended module paths.
+
+   If you want to generate long identifiers that are a list of
+   dot-separated identifiers, the function {!unflatten} is safer and faster.
+   {!unflatten} is available since OCaml 4.06.0.
+
+   If you want to parse any identifier correctly, use the long-identifiers
+   functions from the {!Parse} module, in particular {!Parse.longident}.
+   They are available since OCaml 4.11, and also provide proper
+   input-location support.
+
+*)
+
+
+
+(** To print a longident, see {!Pprintast.longident}, using
+    {!Format.asprintf} to convert to a string. *)
diff --git a/ocaml_stuff/4.11.0/parsing/parsetree.mli b/ocaml_stuff/4.11.0/parsing/parsetree.mli
new file mode 100644
index 00000000..0712f87c
--- /dev/null
+++ b/ocaml_stuff/4.11.0/parsing/parsetree.mli
@@ -0,0 +1,970 @@
+(**************************************************************************)
+(*                                                                        *)
+(*                                 OCaml                                  *)
+(*                                                                        *)
+(*             Xavier Leroy, projet Cristal, INRIA Rocquencourt           *)
+(*                                                                        *)
+(*   Copyright 1996 Institut National de Recherche en Informatique et     *)
+(*     en Automatique.                                                    *)
+(*                                                                        *)
+(*   All rights reserved.  This file is distributed under the terms of    *)
+(*   the GNU Lesser General Public License version 2.1, with the          *)
+(*   special exception on linking described in the file LICENSE.          *)
+(*                                                                        *)
+(**************************************************************************)
+
+(** Abstract syntax tree produced by parsing
+
+  {b Warning:} this module is unstable and part of
+  {{!Compiler_libs}compiler-libs}.
+
+*)
+
+open Asttypes
+
+type constant =
+    Pconst_integer of string * char option
+  (* 3 3l 3L 3n
+
+     Suffixes [g-z][G-Z] are accepted by the parser.
+     Suffixes except 'l', 'L' and 'n' are rejected by the typechecker
+  *)
+  | Pconst_char of char
+  (* 'c' *)
+  | Pconst_string of string * Location.t * string option
+  (* "constant"
+     {delim|other constant|delim}
+
+     The location span the content of the string, without the delimiters.
+  *)
+  | Pconst_float of string * char option
+  (* 3.4 2e5 1.4e-4
+
+     Suffixes [g-z][G-Z] are accepted by the parser.
+     Suffixes are rejected by the typechecker.
+  *)
+
+type location_stack = Location.t list
+
+(** {1 Extension points} *)
+
+type attribute = {
+    attr_name : string loc;
+    attr_payload : payload;
+    attr_loc : Location.t;
+  }
+       (* [@id ARG]
+          [@@id ARG]
+
+          Metadata containers passed around within the AST.
+          The compiler ignores unknown attributes.
+       *)
+
+and extension = string loc * payload
+      (* [%id ARG]
+         [%%id ARG]
+
+         Sub-language placeholder -- rejected by the typechecker.
+      *)
+
+and attributes = attribute list
+
+and payload =
+  | PStr of structure
+  | PSig of signature (* : SIG *)
+  | PTyp of core_type  (* : T *)
+  | PPat of pattern * expression option  (* ? P  or  ? P when E *)
+
+(** {1 Core language} *)
+
+(* Type expressions *)
+
+and core_type =
+    {
+     ptyp_desc: core_type_desc;
+     ptyp_loc: Location.t;
+     ptyp_loc_stack: location_stack;
+     ptyp_attributes: attributes; (* ... [@id1] [@id2] *)
+    }
+
+and core_type_desc =
+  | Ptyp_any
+        (*  _ *)
+  | Ptyp_var of string
+        (* 'a *)
+  | Ptyp_arrow of arg_label * core_type * core_type
+        (* T1 -> T2       Simple
+           ~l:T1 -> T2    Labelled
+           ?l:T1 -> T2    Optional
+         *)
+  | Ptyp_tuple of core_type list
+        (* T1 * ... * Tn
+
+           Invariant: n >= 2
+        *)
+  | Ptyp_constr of Longident.t loc * core_type list
+        (* tconstr
+           T tconstr
+           (T1, ..., Tn) tconstr
+         *)
+  | Ptyp_object of object_field list * closed_flag
+        (* < l1:T1; ...; ln:Tn >     (flag = Closed)
+           < l1:T1; ...; ln:Tn; .. > (flag = Open)
+         *)
+  | Ptyp_class of Longident.t loc * core_type list
+        (* #tconstr
+           T #tconstr
+           (T1, ..., Tn) #tconstr
+         *)
+  | Ptyp_alias of core_type * string
+        (* T as 'a *)
+  | Ptyp_variant of row_field list * closed_flag * label list option
+        (* [ `A|`B ]         (flag = Closed; labels = None)
+           [> `A|`B ]        (flag = Open;   labels = None)
+           [< `A|`B ]        (flag = Closed; labels = Some [])
+           [< `A|`B > `X `Y ](flag = Closed; labels = Some ["X";"Y"])
+         *)
+  | Ptyp_poly of string loc list * core_type
+        (* 'a1 ... 'an. T
+
+           Can only appear in the following context:
+
+           - As the core_type of a Ppat_constraint node corresponding
+             to a constraint on a let-binding: let x : 'a1 ... 'an. T
+             = e ...
+
+           - Under Cfk_virtual for methods (not values).
+
+           - As the core_type of a Pctf_method node.
+
+           - As the core_type of a Pexp_poly node.
+
+           - As the pld_type field of a label_declaration.
+
+           - As a core_type of a Ptyp_object node.
+         *)
+
+  | Ptyp_package of package_type
+        (* (module S) *)
+  | Ptyp_extension of extension
+        (* [%id] *)
+
+and package_type = Longident.t loc * (Longident.t loc * core_type) list
+      (*
+        (module S)
+        (module S with type t1 = T1 and ... and tn = Tn)
+       *)
+
+and row_field = {
+  prf_desc : row_field_desc;
+  prf_loc : Location.t;
+  prf_attributes : attributes;
+}
+
+and row_field_desc =
+  | Rtag of label loc * bool * core_type list
+        (* [`A]                   ( true,  [] )
+           [`A of T]              ( false, [T] )
+           [`A of T1 & .. & Tn]   ( false, [T1;...Tn] )
+           [`A of & T1 & .. & Tn] ( true,  [T1;...Tn] )
+
+          - The 'bool' field is true if the tag contains a
+            constant (empty) constructor.
+          - '&' occurs when several types are used for the same constructor
+            (see 4.2 in the manual)
+        *)
+  | Rinherit of core_type
+        (* [ T ] *)
+
+and object_field = {
+  pof_desc : object_field_desc;
+  pof_loc : Location.t;
+  pof_attributes : attributes;
+}
+
+and object_field_desc =
+  | Otag of label loc * core_type
+  | Oinherit of core_type
+
+(* Patterns *)
+
+and pattern =
+    {
+     ppat_desc: pattern_desc;
+     ppat_loc: Location.t;
+     ppat_loc_stack: location_stack;
+     ppat_attributes: attributes; (* ... [@id1] [@id2] *)
+    }
+
+and pattern_desc =
+  | Ppat_any
+        (* _ *)
+  | Ppat_var of string loc
+        (* x *)
+  | Ppat_alias of pattern * string loc
+        (* P as 'a *)
+  | Ppat_constant of constant
+        (* 1, 'a', "true", 1.0, 1l, 1L, 1n *)
+  | Ppat_interval of constant * constant
+        (* 'a'..'z'
+
+           Other forms of interval are recognized by the parser
+           but rejected by the type-checker. *)
+  | Ppat_tuple of pattern list
+        (* (P1, ..., Pn)
+
+           Invariant: n >= 2
+        *)
+  | Ppat_construct of Longident.t loc * pattern option
+        (* C                None
+           C P              Some P
+           C (P1, ..., Pn)  Some (Ppat_tuple [P1; ...; Pn])
+         *)
+  | Ppat_variant of label * pattern option
+        (* `A             (None)
+           `A P           (Some P)
+         *)
+  | Ppat_record of (Longident.t loc * pattern) list * closed_flag
+        (* { l1=P1; ...; ln=Pn }     (flag = Closed)
+           { l1=P1; ...; ln=Pn; _}   (flag = Open)
+
+           Invariant: n > 0
+         *)
+  | Ppat_array of pattern list
+        (* [| P1; ...; Pn |] *)
+  | Ppat_or of pattern * pattern
+        (* P1 | P2 *)
+  | Ppat_constraint of pattern * core_type
+        (* (P : T) *)
+  | Ppat_type of Longident.t loc
+        (* #tconst *)
+  | Ppat_lazy of pattern
+        (* lazy P *)
+  | Ppat_unpack of string option loc
+        (* (module P)        Some "P"
+           (module _)        None
+
+           Note: (module P : S) is represented as
+           Ppat_constraint(Ppat_unpack, Ptyp_package)
+         *)
+  | Ppat_exception of pattern
+        (* exception P *)
+  | Ppat_extension of extension
+        (* [%id] *)
+  | Ppat_open of Longident.t loc * pattern
+        (* M.(P) *)
+
+(* Value expressions *)
+
+and expression =
+    {
+     pexp_desc: expression_desc;
+     pexp_loc: Location.t;
+     pexp_loc_stack: location_stack;
+     pexp_attributes: attributes; (* ... [@id1] [@id2] *)
+    }
+
+and expression_desc =
+  | Pexp_ident of Longident.t loc
+        (* x
+           M.x
+         *)
+  | Pexp_constant of constant
+        (* 1, 'a', "true", 1.0, 1l, 1L, 1n *)
+  | Pexp_let of rec_flag * value_binding list * expression
+        (* let P1 = E1 and ... and Pn = EN in E       (flag = Nonrecursive)
+           let rec P1 = E1 and ... and Pn = EN in E   (flag = Recursive)
+         *)
+  | Pexp_function of case list
+        (* function P1 -> E1 | ... | Pn -> En *)
+  | Pexp_fun of arg_label * expression option * pattern * expression
+        (* fun P -> E1                          (Simple, None)
+           fun ~l:P -> E1                       (Labelled l, None)
+           fun ?l:P -> E1                       (Optional l, None)
+           fun ?l:(P = E0) -> E1                (Optional l, Some E0)
+
+           Notes:
+           - If E0 is provided, only Optional is allowed.
+           - "fun P1 P2 .. Pn -> E1" is represented as nested Pexp_fun.
+           - "let f P = E" is represented using Pexp_fun.
+         *)
+  | Pexp_apply of expression * (arg_label * expression) list
+        (* E0 ~l1:E1 ... ~ln:En
+           li can be empty (non labeled argument) or start with '?'
+           (optional argument).
+
+           Invariant: n > 0
+         *)
+  | Pexp_match of expression * case list
+        (* match E0 with P1 -> E1 | ... | Pn -> En *)
+  | Pexp_try of expression * case list
+        (* try E0 with P1 -> E1 | ... | Pn -> En *)
+  | Pexp_tuple of expression list
+        (* (E1, ..., En)
+
+           Invariant: n >= 2
+        *)
+  | Pexp_construct of Longident.t loc * expression option
+        (* C                None
+           C E              Some E
+           C (E1, ..., En)  Some (Pexp_tuple[E1;...;En])
+        *)
+  | Pexp_variant of label * expression option
+        (* `A             (None)
+           `A E           (Some E)
+         *)
+  | Pexp_record of (Longident.t loc * expression) list * expression option
+        (* { l1=P1; ...; ln=Pn }     (None)
+           { E0 with l1=P1; ...; ln=Pn }   (Some E0)
+
+           Invariant: n > 0
+         *)
+  | Pexp_field of expression * Longident.t loc
+        (* E.l *)
+  | Pexp_setfield of expression * Longident.t loc * expression
+        (* E1.l <- E2 *)
+  | Pexp_array of expression list
+        (* [| E1; ...; En |] *)
+  | Pexp_ifthenelse of expression * expression * expression option
+        (* if E1 then E2 else E3 *)
+  | Pexp_sequence of expression * expression
+        (* E1; E2 *)
+  | Pexp_while of expression * expression
+        (* while E1 do E2 done *)
+  | Pexp_for of
+      pattern *  expression * expression * direction_flag * expression
+        (* for i = E1 to E2 do E3 done      (flag = Upto)
+           for i = E1 downto E2 do E3 done  (flag = Downto)
+         *)
+  | Pexp_constraint of expression * core_type
+        (* (E : T) *)
+  | Pexp_coerce of expression * core_type option * core_type
+        (* (E :> T)        (None, T)
+           (E : T0 :> T)   (Some T0, T)
+         *)
+  | Pexp_send of expression * label loc
+        (*  E # m *)
+  | Pexp_new of Longident.t loc
+        (* new M.c *)
+  | Pexp_setinstvar of label loc * expression
+        (* x <- 2 *)
+  | Pexp_override of (label loc * expression) list
+        (* {< x1 = E1; ...; Xn = En >} *)
+  | Pexp_letmodule of string option loc * module_expr * expression
+        (* let module M = ME in E *)
+  | Pexp_letexception of extension_constructor * expression
+        (* let exception C in E *)
+  | Pexp_assert of expression
+        (* assert E
+           Note: "assert false" is treated in a special way by the
+           type-checker. *)
+  | Pexp_lazy of expression
+        (* lazy E *)
+  | Pexp_poly of expression * core_type option
+        (* Used for method bodies.
+
+           Can only be used as the expression under Cfk_concrete
+           for methods (not values). *)
+  | Pexp_object of class_structure
+        (* object ... end *)
+  | Pexp_newtype of string loc * expression
+        (* fun (type t) -> E *)
+  | Pexp_pack of module_expr
+        (* (module ME)
+
+           (module ME : S) is represented as
+           Pexp_constraint(Pexp_pack, Ptyp_package S) *)
+  | Pexp_open of open_declaration * expression
+        (* M.(E)
+           let open M in E
+           let! open M in E *)
+  | Pexp_letop of letop
+        (* let* P = E in E
+           let* P = E and* P = E in E *)
+  | Pexp_extension of extension
+        (* [%id] *)
+  | Pexp_unreachable
+        (* . *)
+
+and case =   (* (P -> E) or (P when E0 -> E) *)
+    {
+     pc_lhs: pattern;
+     pc_guard: expression option;
+     pc_rhs: expression;
+   }
+
+and letop =
+  {
+    let_ : binding_op;
+    ands : binding_op list;
+    body : expression;
+  }
+
+and binding_op =
+  {
+    pbop_op : string loc;
+    pbop_pat : pattern;
+    pbop_exp : expression;
+    pbop_loc : Location.t;
+  }
+
+(* Value descriptions *)
+
+and value_description =
+    {
+     pval_name: string loc;
+     pval_type: core_type;
+     pval_prim: string list;
+     pval_attributes: attributes;  (* ... [@@id1] [@@id2] *)
+     pval_loc: Location.t;
+    }
+
+(*
+  val x: T                            (prim = [])
+  external x: T = "s1" ... "sn"       (prim = ["s1";..."sn"])
+*)
+
+(* Type declarations *)
+
+and type_declaration =
+    {
+     ptype_name: string loc;
+     ptype_params: (core_type * variance) list;
+           (* ('a1,...'an) t; None represents  _*)
+     ptype_cstrs: (core_type * core_type * Location.t) list;
+           (* ... constraint T1=T1'  ... constraint Tn=Tn' *)
+     ptype_kind: type_kind;
+     ptype_private: private_flag;   (* = private ... *)
+     ptype_manifest: core_type option;  (* = T *)
+     ptype_attributes: attributes;   (* ... [@@id1] [@@id2] *)
+     ptype_loc: Location.t;
+    }
+
+(*
+  type t                     (abstract, no manifest)
+  type t = T0                (abstract, manifest=T0)
+  type t = C of T | ...      (variant,  no manifest)
+  type t = T0 = C of T | ... (variant,  manifest=T0)
+  type t = {l: T; ...}       (record,   no manifest)
+  type t = T0 = {l : T; ...} (record,   manifest=T0)
+  type t = ..                (open,     no manifest)
+*)
+
+and type_kind =
+  | Ptype_abstract
+  | Ptype_variant of constructor_declaration list
+  | Ptype_record of label_declaration list
+        (* Invariant: non-empty list *)
+  | Ptype_open
+
+and label_declaration =
+    {
+     pld_name: string loc;
+     pld_mutable: mutable_flag;
+     pld_type: core_type;
+     pld_loc: Location.t;
+     pld_attributes: attributes; (* l : T [@id1] [@id2] *)
+    }
+
+(*  { ...; l: T; ... }            (mutable=Immutable)
+    { ...; mutable l: T; ... }    (mutable=Mutable)
+
+    Note: T can be a Ptyp_poly.
+*)
+
+and constructor_declaration =
+    {
+     pcd_name: string loc;
+     pcd_args: constructor_arguments;
+     pcd_res: core_type option;
+     pcd_loc: Location.t;
+     pcd_attributes: attributes; (* C of ... [@id1] [@id2] *)
+    }
+
+and constructor_arguments =
+  | Pcstr_tuple of core_type list
+  | Pcstr_record of label_declaration list
+
+(*
+  | C of T1 * ... * Tn     (res = None,    args = Pcstr_tuple [])
+  | C: T0                  (res = Some T0, args = [])
+  | C: T1 * ... * Tn -> T0 (res = Some T0, args = Pcstr_tuple)
+  | C of {...}             (res = None,    args = Pcstr_record)
+  | C: {...} -> T0         (res = Some T0, args = Pcstr_record)
+  | C of {...} as t        (res = None,    args = Pcstr_record)
+*)
+
+and type_extension =
+    {
+     ptyext_path: Longident.t loc;
+     ptyext_params: (core_type * variance) list;
+     ptyext_constructors: extension_constructor list;
+     ptyext_private: private_flag;
+     ptyext_loc: Location.t;
+     ptyext_attributes: attributes;   (* ... [@@id1] [@@id2] *)
+    }
+(*
+  type t += ...
+*)
+
+and extension_constructor =
+    {
+     pext_name: string loc;
+     pext_kind : extension_constructor_kind;
+     pext_loc : Location.t;
+     pext_attributes: attributes; (* C of ... [@id1] [@id2] *)
+   }
+
+(* exception E *)
+and type_exception =
+  {
+    ptyexn_constructor: extension_constructor;
+    ptyexn_loc: Location.t;
+    ptyexn_attributes: attributes; (* ... [@@id1] [@@id2] *)
+  }
+
+and extension_constructor_kind =
+    Pext_decl of constructor_arguments * core_type option
+      (*
+         | C of T1 * ... * Tn     ([T1; ...; Tn], None)
+         | C: T0                  ([], Some T0)
+         | C: T1 * ... * Tn -> T0 ([T1; ...; Tn], Some T0)
+       *)
+  | Pext_rebind of Longident.t loc
+      (*
+         | C = D
+       *)
+
+(** {1 Class language} *)
+
+(* Type expressions for the class language *)
+
+and class_type =
+    {
+     pcty_desc: class_type_desc;
+     pcty_loc: Location.t;
+     pcty_attributes: attributes; (* ... [@id1] [@id2] *)
+    }
+
+and class_type_desc =
+  | Pcty_constr of Longident.t loc * core_type list
+        (* c
+           ['a1, ..., 'an] c *)
+  | Pcty_signature of class_signature
+        (* object ... end *)
+  | Pcty_arrow of arg_label * core_type * class_type
+        (* T -> CT       Simple
+           ~l:T -> CT    Labelled l
+           ?l:T -> CT    Optional l
+         *)
+  | Pcty_extension of extension
+        (* [%id] *)
+  | Pcty_open of open_description * class_type
+        (* let open M in CT *)
+
+and class_signature =
+    {
+     pcsig_self: core_type;
+     pcsig_fields: class_type_field list;
+    }
+(* object('selfpat) ... end
+   object ... end             (self = Ptyp_any)
+ *)
+
+and class_type_field =
+    {
+     pctf_desc: class_type_field_desc;
+     pctf_loc: Location.t;
+     pctf_attributes: attributes; (* ... [@@id1] [@@id2] *)
+    }
+
+and class_type_field_desc =
+  | Pctf_inherit of class_type
+        (* inherit CT *)
+  | Pctf_val of (label loc * mutable_flag * virtual_flag * core_type)
+        (* val x: T *)
+  | Pctf_method  of (label loc * private_flag * virtual_flag * core_type)
+        (* method x: T
+
+           Note: T can be a Ptyp_poly.
+         *)
+  | Pctf_constraint  of (core_type * core_type)
+        (* constraint T1 = T2 *)
+  | Pctf_attribute of attribute
+        (* [@@@id] *)
+  | Pctf_extension of extension
+        (* [%%id] *)
+
+and 'a class_infos =
+    {
+     pci_virt: virtual_flag;
+     pci_params: (core_type * variance) list;
+     pci_name: string loc;
+     pci_expr: 'a;
+     pci_loc: Location.t;
+     pci_attributes: attributes;  (* ... [@@id1] [@@id2] *)
+    }
+(* class c = ...
+   class ['a1,...,'an] c = ...
+   class virtual c = ...
+
+   Also used for "class type" declaration.
+*)
+
+and class_description = class_type class_infos
+
+and class_type_declaration = class_type class_infos
+
+(* Value expressions for the class language *)
+
+and class_expr =
+    {
+     pcl_desc: class_expr_desc;
+     pcl_loc: Location.t;
+     pcl_attributes: attributes; (* ... [@id1] [@id2] *)
+    }
+
+and class_expr_desc =
+  | Pcl_constr of Longident.t loc * core_type list
+        (* c
+           ['a1, ..., 'an] c *)
+  | Pcl_structure of class_structure
+        (* object ... end *)
+  | Pcl_fun of arg_label * expression option * pattern * class_expr
+        (* fun P -> CE                          (Simple, None)
+           fun ~l:P -> CE                       (Labelled l, None)
+           fun ?l:P -> CE                       (Optional l, None)
+           fun ?l:(P = E0) -> CE                (Optional l, Some E0)
+         *)
+  | Pcl_apply of class_expr * (arg_label * expression) list
+        (* CE ~l1:E1 ... ~ln:En
+           li can be empty (non labeled argument) or start with '?'
+           (optional argument).
+
+           Invariant: n > 0
+         *)
+  | Pcl_let of rec_flag * value_binding list * class_expr
+        (* let P1 = E1 and ... and Pn = EN in CE      (flag = Nonrecursive)
+           let rec P1 = E1 and ... and Pn = EN in CE  (flag = Recursive)
+         *)
+  | Pcl_constraint of class_expr * class_type
+        (* (CE : CT) *)
+  | Pcl_extension of extension
+  (* [%id] *)
+  | Pcl_open of open_description * class_expr
+  (* let open M in CE *)
+
+
+and class_structure =
+    {
+     pcstr_self: pattern;
+     pcstr_fields: class_field list;
+    }
+(* object(selfpat) ... end
+   object ... end           (self = Ppat_any)
+ *)
+
+and class_field =
+    {
+     pcf_desc: class_field_desc;
+     pcf_loc: Location.t;
+     pcf_attributes: attributes; (* ... [@@id1] [@@id2] *)
+    }
+
+and class_field_desc =
+  | Pcf_inherit of override_flag * class_expr * string loc option
+        (* inherit CE
+           inherit CE as x
+           inherit! CE
+           inherit! CE as x
+         *)
+  | Pcf_val of (label loc * mutable_flag * class_field_kind)
+        (* val x = E
+           val virtual x: T
+         *)
+  | Pcf_method of (label loc * private_flag * class_field_kind)
+        (* method x = E            (E can be a Pexp_poly)
+           method virtual x: T     (T can be a Ptyp_poly)
+         *)
+  | Pcf_constraint of (core_type * core_type)
+        (* constraint T1 = T2 *)
+  | Pcf_initializer of expression
+        (* initializer E *)
+  | Pcf_attribute of attribute
+        (* [@@@id] *)
+  | Pcf_extension of extension
+        (* [%%id] *)
+
+and class_field_kind =
+  | Cfk_virtual of core_type
+  | Cfk_concrete of override_flag * expression
+
+and class_declaration = class_expr class_infos
+
+(** {1 Module language} *)
+
+(* Type expressions for the module language *)
+
+and module_type =
+    {
+     pmty_desc: module_type_desc;
+     pmty_loc: Location.t;
+     pmty_attributes: attributes; (* ... [@id1] [@id2] *)
+    }
+
+and module_type_desc =
+  | Pmty_ident of Longident.t loc
+        (* S *)
+  | Pmty_signature of signature
+        (* sig ... end *)
+  | Pmty_functor of functor_parameter * module_type
+        (* functor(X : MT1) -> MT2 *)
+  | Pmty_with of module_type * with_constraint list
+        (* MT with ... *)
+  | Pmty_typeof of module_expr
+        (* module type of ME *)
+  | Pmty_extension of extension
+        (* [%id] *)
+  | Pmty_alias of Longident.t loc
+        (* (module M) *)
+
+and functor_parameter =
+  | Unit
+        (* () *)
+  | Named of string option loc * module_type
+        (* (X : MT)          Some X, MT
+           (_ : MT)          None, MT *)
+
+and signature = signature_item list
+
+and signature_item =
+    {
+     psig_desc: signature_item_desc;
+     psig_loc: Location.t;
+    }
+
+and signature_item_desc =
+  | Psig_value of value_description
+        (*
+          val x: T
+          external x: T = "s1" ... "sn"
+         *)
+  | Psig_type of rec_flag * type_declaration list
+        (* type t1 = ... and ... and tn  = ... *)
+  | Psig_typesubst of type_declaration list
+        (* type t1 := ... and ... and tn := ...  *)
+  | Psig_typext of type_extension
+        (* type t1 += ... *)
+  | Psig_exception of type_exception
+        (* exception C of T *)
+  | Psig_module of module_declaration
+        (* module X = M
+           module X : MT *)
+  | Psig_modsubst of module_substitution
+        (* module X := M *)
+  | Psig_recmodule of module_declaration list
+        (* module rec X1 : MT1 and ... and Xn : MTn *)
+  | Psig_modtype of module_type_declaration
+        (* module type S = MT
+           module type S *)
+  | Psig_open of open_description
+        (* open X *)
+  | Psig_include of include_description
+        (* include MT *)
+  | Psig_class of class_description list
+        (* class c1 : ... and ... and cn : ... *)
+  | Psig_class_type of class_type_declaration list
+        (* class type ct1 = ... and ... and ctn = ... *)
+  | Psig_attribute of attribute
+        (* [@@@id] *)
+  | Psig_extension of extension * attributes
+        (* [%%id] *)
+
+and module_declaration =
+    {
+     pmd_name: string option loc;
+     pmd_type: module_type;
+     pmd_attributes: attributes; (* ... [@@id1] [@@id2] *)
+     pmd_loc: Location.t;
+    }
+(* S : MT *)
+
+and module_substitution =
+    {
+     pms_name: string loc;
+     pms_manifest: Longident.t loc;
+     pms_attributes: attributes; (* ... [@@id1] [@@id2] *)
+     pms_loc: Location.t;
+    }
+
+and module_type_declaration =
+    {
+     pmtd_name: string loc;
+     pmtd_type: module_type option;
+     pmtd_attributes: attributes; (* ... [@@id1] [@@id2] *)
+     pmtd_loc: Location.t;
+    }
+(* S = MT
+   S       (abstract module type declaration, pmtd_type = None)
+*)
+
+and 'a open_infos =
+    {
+     popen_expr: 'a;
+     popen_override: override_flag;
+     popen_loc: Location.t;
+     popen_attributes: attributes;
+    }
+(* open! X - popen_override = Override (silences the 'used identifier
+                              shadowing' warning)
+   open  X - popen_override = Fresh
+ *)
+
+and open_description = Longident.t loc open_infos
+(* open M.N
+   open M(N).O *)
+
+and open_declaration = module_expr open_infos
+(* open M.N
+   open M(N).O
+   open struct ... end *)
+
+and 'a include_infos =
+    {
+     pincl_mod: 'a;
+     pincl_loc: Location.t;
+     pincl_attributes: attributes;
+    }
+
+and include_description = module_type include_infos
+(* include MT *)
+
+and include_declaration = module_expr include_infos
+(* include ME *)
+
+and with_constraint =
+  | Pwith_type of Longident.t loc * type_declaration
+        (* with type X.t = ...
+
+           Note: the last component of the longident must match
+           the name of the type_declaration. *)
+  | Pwith_module of Longident.t loc * Longident.t loc
+        (* with module X.Y = Z *)
+  | Pwith_typesubst of Longident.t loc * type_declaration
+        (* with type X.t := ..., same format as [Pwith_type] *)
+  | Pwith_modsubst of Longident.t loc * Longident.t loc
+        (* with module X.Y := Z *)
+
+(* Value expressions for the module language *)
+
+and module_expr =
+    {
+     pmod_desc: module_expr_desc;
+     pmod_loc: Location.t;
+     pmod_attributes: attributes; (* ... [@id1] [@id2] *)
+    }
+
+and module_expr_desc =
+  | Pmod_ident of Longident.t loc
+        (* X *)
+  | Pmod_structure of structure
+        (* struct ... end *)
+  | Pmod_functor of functor_parameter * module_expr
+        (* functor(X : MT1) -> ME *)
+  | Pmod_apply of module_expr * module_expr
+        (* ME1(ME2) *)
+  | Pmod_constraint of module_expr * module_type
+        (* (ME : MT) *)
+  | Pmod_unpack of expression
+        (* (val E) *)
+  | Pmod_extension of extension
+        (* [%id] *)
+
+and structure = structure_item list
+
+and structure_item =
+    {
+     pstr_desc: structure_item_desc;
+     pstr_loc: Location.t;
+    }
+
+and structure_item_desc =
+  | Pstr_eval of expression * attributes
+        (* E *)
+  | Pstr_value of rec_flag * value_binding list
+        (* let P1 = E1 and ... and Pn = EN       (flag = Nonrecursive)
+           let rec P1 = E1 and ... and Pn = EN   (flag = Recursive)
+         *)
+  | Pstr_primitive of value_description
+        (*  val x: T
+            external x: T = "s1" ... "sn" *)
+  | Pstr_type of rec_flag * type_declaration list
+        (* type t1 = ... and ... and tn = ... *)
+  | Pstr_typext of type_extension
+        (* type t1 += ... *)
+  | Pstr_exception of type_exception
+        (* exception C of T
+           exception C = M.X *)
+  | Pstr_module of module_binding
+        (* module X = ME *)
+  | Pstr_recmodule of module_binding list
+        (* module rec X1 = ME1 and ... and Xn = MEn *)
+  | Pstr_modtype of module_type_declaration
+        (* module type S = MT *)
+  | Pstr_open of open_declaration
+        (* open X *)
+  | Pstr_class of class_declaration list
+        (* class c1 = ... and ... and cn = ... *)
+  | Pstr_class_type of class_type_declaration list
+        (* class type ct1 = ... and ... and ctn = ... *)
+  | Pstr_include of include_declaration
+        (* include ME *)
+  | Pstr_attribute of attribute
+        (* [@@@id] *)
+  | Pstr_extension of extension * attributes
+        (* [%%id] *)
+
+and value_binding =
+  {
+    pvb_pat: pattern;
+    pvb_expr: expression;
+    pvb_attributes: attributes;
+    pvb_loc: Location.t;
+  }
+
+and module_binding =
+    {
+     pmb_name: string option loc;
+     pmb_expr: module_expr;
+     pmb_attributes: attributes;
+     pmb_loc: Location.t;
+    }
+(* X = ME *)
+
+(** {1 Toplevel} *)
+
+(* Toplevel phrases *)
+
+type toplevel_phrase =
+  | Ptop_def of structure
+  | Ptop_dir of toplevel_directive
+     (* #use, #load ... *)
+
+and toplevel_directive =
+  {
+    pdir_name : string loc;
+    pdir_arg : directive_argument option;
+    pdir_loc : Location.t;
+  }
+
+and directive_argument =
+  {
+    pdira_desc : directive_argument_desc;
+    pdira_loc : Location.t;
+  }
+
+and directive_argument_desc =
+  | Pdir_string of string
+  | Pdir_int of string * char option
+  | Pdir_ident of Longident.t
+  | Pdir_bool of bool
diff --git a/ocaml_stuff/4.11.0/utils/.depend b/ocaml_stuff/4.11.0/utils/.depend
new file mode 100644
index 00000000..b261ffe0
--- /dev/null
+++ b/ocaml_stuff/4.11.0/utils/.depend
@@ -0,0 +1,2 @@
+pconfig.cmo: pconfig.cmi
+pconfig.cmx: pconfig.cmi
diff --git a/ocaml_stuff/4.11.0/utils/.gitignore b/ocaml_stuff/4.11.0/utils/.gitignore
new file mode 100644
index 00000000..23e90de9
--- /dev/null
+++ b/ocaml_stuff/4.11.0/utils/.gitignore
@@ -0,0 +1 @@
+*.cm[oix]
diff --git a/ocaml_stuff/4.11.0/utils/Makefile b/ocaml_stuff/4.11.0/utils/Makefile
new file mode 100644
index 00000000..f4ea2816
--- /dev/null
+++ b/ocaml_stuff/4.11.0/utils/Makefile
@@ -0,0 +1,27 @@
+# Makefile,v
+
+FILES=warnings.cmi pconfig.cmo
+INCL=
+
+all: $(FILES)
+
+opt: pconfig.cmx
+
+clean:
+	rm -f *.cm[oix] *.o
+
+depend:
+	ocamldep $(INCL) *.ml* | sed -e 's/  *$$//' > .depend
+
+.SUFFIXES: .mli .cmi .ml .cmo .cmx
+
+.mli.cmi:
+	$(OCAMLN)c $(INCL) -c $<
+
+.ml.cmo:
+	$(OCAMLN)c $(INCL) -c $<
+
+.ml.cmx:
+	$(OCAMLN)opt $(INCL) -c $<
+
+include .depend
diff --git a/ocaml_stuff/4.11.0/utils/pconfig.ml b/ocaml_stuff/4.11.0/utils/pconfig.ml
new file mode 100644
index 00000000..cc05fde1
--- /dev/null
+++ b/ocaml_stuff/4.11.0/utils/pconfig.ml
@@ -0,0 +1,2 @@
+let ast_impl_magic_number = "Caml1999M027"
+let ast_intf_magic_number = "Caml1999N027"
diff --git a/ocaml_stuff/4.11.0/utils/pconfig.mli b/ocaml_stuff/4.11.0/utils/pconfig.mli
new file mode 100644
index 00000000..6a2af67d
--- /dev/null
+++ b/ocaml_stuff/4.11.0/utils/pconfig.mli
@@ -0,0 +1,2 @@
+val ast_impl_magic_number : string
+val ast_intf_magic_number : string
diff --git a/ocaml_stuff/4.11.0/utils/warnings.mli b/ocaml_stuff/4.11.0/utils/warnings.mli
new file mode 100644
index 00000000..b80ab34c
--- /dev/null
+++ b/ocaml_stuff/4.11.0/utils/warnings.mli
@@ -0,0 +1,140 @@
+(**************************************************************************)
+(*                                                                        *)
+(*                                 OCaml                                  *)
+(*                                                                        *)
+(*             Pierre Weis && Damien Doligez, INRIA Rocquencourt          *)
+(*                                                                        *)
+(*   Copyright 1998 Institut National de Recherche en Informatique et     *)
+(*     en Automatique.                                                    *)
+(*                                                                        *)
+(*   All rights reserved.  This file is distributed under the terms of    *)
+(*   the GNU Lesser General Public License version 2.1, with the          *)
+(*   special exception on linking described in the file LICENSE.          *)
+(*                                                                        *)
+(**************************************************************************)
+
+(** Warning definitions
+
+  {b Warning:} this module is unstable and part of
+  {{!Compiler_libs}compiler-libs}.
+
+*)
+
+type loc = {
+  loc_start: Lexing.position;
+  loc_end: Lexing.position;
+  loc_ghost: bool;
+}
+
+type t =
+  | Comment_start                           (*  1 *)
+  | Comment_not_end                         (*  2 *)
+(*| Deprecated --> alert "deprecated" *)    (*  3 *)
+  | Fragile_match of string                 (*  4 *)
+  | Partial_application                     (*  5 *)
+  | Labels_omitted of string list           (*  6 *)
+  | Method_override of string list          (*  7 *)
+  | Partial_match of string                 (*  8 *)
+  | Non_closed_record_pattern of string     (*  9 *)
+  | Statement_type                          (* 10 *)
+  | Unused_match                            (* 11 *)
+  | Unused_pat                              (* 12 *)
+  | Instance_variable_override of string list (* 13 *)
+  | Illegal_backslash                       (* 14 *)
+  | Implicit_public_methods of string list  (* 15 *)
+  | Unerasable_optional_argument            (* 16 *)
+  | Undeclared_virtual_method of string     (* 17 *)
+  | Not_principal of string                 (* 18 *)
+  | Without_principality of string          (* 19 *)
+  | Unused_argument                         (* 20 *)
+  | Nonreturning_statement                  (* 21 *)
+  | Preprocessor of string                  (* 22 *)
+  | Useless_record_with                     (* 23 *)
+  | Bad_module_name of string               (* 24 *)
+  | All_clauses_guarded                     (* 8, used to be 25 *)
+  | Unused_var of string                    (* 26 *)
+  | Unused_var_strict of string             (* 27 *)
+  | Wildcard_arg_to_constant_constr         (* 28 *)
+  | Eol_in_string                           (* 29 *)
+  | Duplicate_definitions of string * string * string * string (* 30 *)
+  | Multiple_definition of string * string * string (* 31 *)
+  | Unused_value_declaration of string      (* 32 *)
+  | Unused_open of string                   (* 33 *)
+  | Unused_type_declaration of string       (* 34 *)
+  | Unused_for_index of string              (* 35 *)
+  | Unused_ancestor of string               (* 36 *)
+  | Unused_constructor of string * bool * bool (* 37 *)
+  | Unused_extension of string * bool * bool * bool (* 38 *)
+  | Unused_rec_flag                         (* 39 *)
+  | Name_out_of_scope of string * string list * bool   (* 40 *)
+  | Ambiguous_name of string list * string list * bool * string (* 41 *)
+  | Disambiguated_name of string            (* 42 *)
+  | Nonoptional_label of string             (* 43 *)
+  | Open_shadow_identifier of string * string (* 44 *)
+  | Open_shadow_label_constructor of string * string (* 45 *)
+  | Bad_env_variable of string * string     (* 46 *)
+  | Attribute_payload of string * string    (* 47 *)
+  | Eliminated_optional_arguments of string list (* 48 *)
+  | No_cmi_file of string * string option   (* 49 *)
+  | Bad_docstring of bool                   (* 50 *)
+  | Expect_tailcall                         (* 51 *)
+  | Fragile_literal_pattern                 (* 52 *)
+  | Misplaced_attribute of string           (* 53 *)
+  | Duplicated_attribute of string          (* 54 *)
+  | Inlining_impossible of string           (* 55 *)
+  | Unreachable_case                        (* 56 *)
+  | Ambiguous_pattern of string list        (* 57 *)
+  | No_cmx_file of string                   (* 58 *)
+  | Assignment_to_non_mutable_value         (* 59 *)
+  | Unused_module of string                 (* 60 *)
+  | Unboxable_type_in_prim_decl of string   (* 61 *)
+  | Constraint_on_gadt                      (* 62 *)
+  | Erroneous_printed_signature of string   (* 63 *)
+  | Unsafe_without_parsing                  (* 64 *)
+  | Redefining_unit of string               (* 65 *)
+  | Unused_open_bang of string              (* 66 *)
+  | Unused_functor_parameter of string      (* 67 *)
+;;
+
+type alert = {kind:string; message:string; def:loc; use:loc}
+
+val parse_options : bool -> string -> unit;;
+
+val parse_alert_option: string -> unit
+  (** Disable/enable alerts based on the parameter to the -alert
+      command-line option.  Raises [Arg.Bad] if the string is not a
+      valid specification.
+  *)
+
+val without_warnings : (unit -> 'a) -> 'a
+  (** Run the thunk with all warnings and alerts disabled. *)
+
+val is_active : t -> bool;;
+val is_error : t -> bool;;
+
+val defaults_w : string;;
+val defaults_warn_error : string;;
+
+type reporting_information =
+  { id : string
+  ; message : string
+  ; is_error : bool
+  ; sub_locs : (loc * string) list;
+  }
+
+val report : t -> [ `Active of reporting_information | `Inactive ]
+val report_alert : alert -> [ `Active of reporting_information | `Inactive ]
+
+exception Errors;;
+
+val check_fatal : unit -> unit;;
+val reset_fatal: unit -> unit
+
+val help_warnings: unit -> unit
+
+type state
+val backup: unit -> state
+val restore: state -> unit
+val mk_lazy: (unit -> 'a) -> 'a Lazy.t
+    (** Like [Lazy.of_fun], but the function is applied with
+        the warning/alert settings at the time [mk_lazy] is called. *)
-- 
2.24.1