diff options
Diffstat (limited to 'ocaml-binary-annot/camlp4/boot/camlp4boot.ml')
| -rw-r--r-- | ocaml-binary-annot/camlp4/boot/camlp4boot.ml | 15516 |
1 files changed, 15516 insertions, 0 deletions
diff --git a/ocaml-binary-annot/camlp4/boot/camlp4boot.ml b/ocaml-binary-annot/camlp4/boot/camlp4boot.ml new file mode 100644 index 0000000000..20482abcb5 --- /dev/null +++ b/ocaml-binary-annot/camlp4/boot/camlp4boot.ml @@ -0,0 +1,15516 @@ +module R = + struct + open Camlp4 + + (* -*- camlp4r -*- *) + (****************************************************************************) + (* *) + (* Objective Caml *) + (* *) + (* INRIA Rocquencourt *) + (* *) + (* Copyright 2002-2006 Institut National de Recherche en Informatique et *) + (* en Automatique. All rights reserved. This file is distributed under *) + (* the terms of the GNU Library General Public License, with the special *) + (* exception on linking described in LICENSE at the top of the Objective *) + (* Caml source tree. *) + (* *) + (****************************************************************************) + (* Authors: + * - Daniel de Rauglaudre: initial version + * - Nicolas Pouillard: refactoring + *) + module Id = + struct + let name = "Camlp4OCamlRevisedParser" + + let version = Sys.ocaml_version + + end + + module Make (Syntax : Sig.Camlp4Syntax) = + struct + open Sig + + include Syntax + + (* Camlp4_config.constructors_arity.val := True; *) + let _ = Camlp4_config.constructors_arity := false + + let help_sequences () = + (Printf.eprintf + "\ +New syntax:\n\ + (e1; e2; ... ; en) OR begin e1; e2; ... ; en end\n\ + while e do e1; e2; ... ; en done\n\ + for v = v1 to/downto v2 do e1; e2; ... ; en done\n\ +Old syntax (still supported):\n\ + do {e1; e2; ... ; en}\n\ + while e do {e1; e2; ... ; en}\n\ + for v = v1 to/downto v2 do {e1; e2; ... ; en}\n\ +Very old (no more supported) syntax:\n\ + do e1; e2; ... ; en-1; return en\n\ + while e do e1; e2; ... ; en; done\n\ + for v = v1 to/downto v2 do e1; e2; ... ; en; done\n\ + "; + flush stderr; + exit 1) + + let _ = + Options.add "-help_seq" (Arg.Unit help_sequences) + "Print explanations about new sequences and exit." + + let _ = Gram.Entry.clear a_CHAR + + let _ = Gram.Entry.clear a_FLOAT + + let _ = Gram.Entry.clear a_INT + + let _ = Gram.Entry.clear a_INT32 + + let _ = Gram.Entry.clear a_INT64 + + let _ = Gram.Entry.clear a_LABEL + + let _ = Gram.Entry.clear a_LIDENT + + let _ = Gram.Entry.clear a_NATIVEINT + + let _ = Gram.Entry.clear a_OPTLABEL + + let _ = Gram.Entry.clear a_STRING + + let _ = Gram.Entry.clear a_UIDENT + + let _ = Gram.Entry.clear a_ident + + let _ = Gram.Entry.clear amp_ctyp + + let _ = Gram.Entry.clear and_ctyp + + let _ = Gram.Entry.clear match_case + + let _ = Gram.Entry.clear match_case0 + + let _ = Gram.Entry.clear match_case_quot + + let _ = Gram.Entry.clear binding + + let _ = Gram.Entry.clear binding_quot + + let _ = Gram.Entry.clear rec_binding_quot + + let _ = Gram.Entry.clear class_declaration + + let _ = Gram.Entry.clear class_description + + let _ = Gram.Entry.clear class_expr + + let _ = Gram.Entry.clear class_expr_quot + + let _ = Gram.Entry.clear class_fun_binding + + let _ = Gram.Entry.clear class_fun_def + + let _ = Gram.Entry.clear class_info_for_class_expr + + let _ = Gram.Entry.clear class_info_for_class_type + + let _ = Gram.Entry.clear class_longident + + let _ = Gram.Entry.clear class_longident_and_param + + let _ = Gram.Entry.clear class_name_and_param + + let _ = Gram.Entry.clear class_sig_item + + let _ = Gram.Entry.clear class_sig_item_quot + + let _ = Gram.Entry.clear class_signature + + let _ = Gram.Entry.clear class_str_item + + let _ = Gram.Entry.clear class_str_item_quot + + let _ = Gram.Entry.clear class_structure + + let _ = Gram.Entry.clear class_type + + let _ = Gram.Entry.clear class_type_declaration + + let _ = Gram.Entry.clear class_type_longident + + let _ = Gram.Entry.clear class_type_longident_and_param + + let _ = Gram.Entry.clear class_type_plus + + let _ = Gram.Entry.clear class_type_quot + + let _ = Gram.Entry.clear comma_ctyp + + let _ = Gram.Entry.clear comma_expr + + let _ = Gram.Entry.clear comma_ipatt + + let _ = Gram.Entry.clear comma_patt + + let _ = Gram.Entry.clear comma_type_parameter + + let _ = Gram.Entry.clear constrain + + let _ = Gram.Entry.clear constructor_arg_list + + let _ = Gram.Entry.clear constructor_declaration + + let _ = Gram.Entry.clear constructor_declarations + + let _ = Gram.Entry.clear ctyp + + let _ = Gram.Entry.clear ctyp_quot + + let _ = Gram.Entry.clear cvalue_binding + + let _ = Gram.Entry.clear direction_flag + + let _ = Gram.Entry.clear dummy + + let _ = Gram.Entry.clear eq_expr + + let _ = Gram.Entry.clear expr + + let _ = Gram.Entry.clear expr_eoi + + let _ = Gram.Entry.clear expr_quot + + let _ = Gram.Entry.clear field_expr + + let _ = Gram.Entry.clear field_expr_list + + let _ = Gram.Entry.clear fun_binding + + let _ = Gram.Entry.clear fun_def + + let _ = Gram.Entry.clear ident + + let _ = Gram.Entry.clear ident_quot + + let _ = Gram.Entry.clear implem + + let _ = Gram.Entry.clear interf + + let _ = Gram.Entry.clear ipatt + + let _ = Gram.Entry.clear ipatt_tcon + + let _ = Gram.Entry.clear label + + let _ = Gram.Entry.clear label_declaration + + let _ = Gram.Entry.clear label_declaration_list + + let _ = Gram.Entry.clear label_expr_list + + let _ = Gram.Entry.clear label_expr + + let _ = Gram.Entry.clear label_ipatt + + let _ = Gram.Entry.clear label_ipatt_list + + let _ = Gram.Entry.clear label_longident + + let _ = Gram.Entry.clear label_patt + + let _ = Gram.Entry.clear label_patt_list + + let _ = Gram.Entry.clear labeled_ipatt + + let _ = Gram.Entry.clear let_binding + + let _ = Gram.Entry.clear meth_list + + let _ = Gram.Entry.clear meth_decl + + let _ = Gram.Entry.clear module_binding + + let _ = Gram.Entry.clear module_binding0 + + let _ = Gram.Entry.clear module_binding_quot + + let _ = Gram.Entry.clear module_declaration + + let _ = Gram.Entry.clear module_expr + + let _ = Gram.Entry.clear module_expr_quot + + let _ = Gram.Entry.clear module_longident + + let _ = Gram.Entry.clear module_longident_with_app + + let _ = Gram.Entry.clear module_rec_declaration + + let _ = Gram.Entry.clear module_type + + let _ = Gram.Entry.clear module_type_quot + + let _ = Gram.Entry.clear more_ctyp + + let _ = Gram.Entry.clear name_tags + + let _ = Gram.Entry.clear opt_as_lident + + let _ = Gram.Entry.clear opt_class_self_patt + + let _ = Gram.Entry.clear opt_class_self_type + + let _ = Gram.Entry.clear opt_comma_ctyp + + let _ = Gram.Entry.clear opt_dot_dot + + let _ = Gram.Entry.clear opt_eq_ctyp + + let _ = Gram.Entry.clear opt_expr + + let _ = Gram.Entry.clear opt_meth_list + + let _ = Gram.Entry.clear opt_mutable + + let _ = Gram.Entry.clear opt_polyt + + let _ = Gram.Entry.clear opt_private + + let _ = Gram.Entry.clear opt_rec + + let _ = Gram.Entry.clear opt_virtual + + let _ = Gram.Entry.clear opt_when_expr + + let _ = Gram.Entry.clear patt + + let _ = Gram.Entry.clear patt_as_patt_opt + + let _ = Gram.Entry.clear patt_eoi + + let _ = Gram.Entry.clear patt_quot + + let _ = Gram.Entry.clear patt_tcon + + let _ = Gram.Entry.clear phrase + + let _ = Gram.Entry.clear poly_type + + let _ = Gram.Entry.clear row_field + + let _ = Gram.Entry.clear sem_expr + + let _ = Gram.Entry.clear sem_expr_for_list + + let _ = Gram.Entry.clear sem_patt + + let _ = Gram.Entry.clear sem_patt_for_list + + let _ = Gram.Entry.clear semi + + let _ = Gram.Entry.clear sequence + + let _ = Gram.Entry.clear sig_item + + let _ = Gram.Entry.clear sig_item_quot + + let _ = Gram.Entry.clear sig_items + + let _ = Gram.Entry.clear star_ctyp + + let _ = Gram.Entry.clear str_item + + let _ = Gram.Entry.clear str_item_quot + + let _ = Gram.Entry.clear str_items + + let _ = Gram.Entry.clear top_phrase + + let _ = Gram.Entry.clear type_constraint + + let _ = Gram.Entry.clear type_declaration + + let _ = Gram.Entry.clear type_ident_and_parameters + + let _ = Gram.Entry.clear type_kind + + let _ = Gram.Entry.clear type_longident + + let _ = Gram.Entry.clear type_longident_and_parameters + + let _ = Gram.Entry.clear type_parameter + + let _ = Gram.Entry.clear type_parameters + + let _ = Gram.Entry.clear typevars + + let _ = Gram.Entry.clear use_file + + let _ = Gram.Entry.clear val_longident + + let _ = Gram.Entry.clear value_let + + let _ = Gram.Entry.clear value_val + + let _ = Gram.Entry.clear with_constr + + let _ = Gram.Entry.clear with_constr_quot + + let neg_string n = + let len = String.length n + in + if (len > 0) && (n.[0] = '-') + then String.sub n 1 (len - 1) + else "-" ^ n + + let mkumin _loc f arg = + match arg with + | Ast.ExInt (_, n) -> Ast.ExInt (_loc, (neg_string n)) + | Ast.ExInt32 (_, n) -> Ast.ExInt32 (_loc, (neg_string n)) + | Ast.ExInt64 (_, n) -> Ast.ExInt64 (_loc, (neg_string n)) + | Ast.ExNativeInt (_, n) -> Ast.ExNativeInt (_loc, (neg_string n)) + | Ast.ExFlo (_, n) -> Ast.ExFlo (_loc, (neg_string n)) + | _ -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdLid (_loc, ("~" ^ f))))), arg) + + let mklistexp _loc last = + let rec loop top = + function + | [] -> + (match last with + | Some e -> e + | None -> Ast.ExId (_loc, (Ast.IdUid (_loc, "[]")))) + | e1 :: el -> + let _loc = + if top then _loc else Loc.merge (Ast.loc_of_expr e1) _loc + in + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdUid (_loc, "::")))), e1)), + (loop false el)) + in loop true + + let mkassert _loc = + function + | Ast.ExId (_, (Ast.IdUid (_, "False"))) -> Ast.ExAsf _loc + | (* this case takes care about + the special assert false node *) + e -> Ast.ExAsr (_loc, e) + + let append_eLem el e = el @ [ e ] + + let mk_anti ?(c = "") n s = "\\$" ^ (n ^ (c ^ (":" ^ s))) + + let mksequence _loc = + function + | (Ast.ExSem (_, _, _) | Ast.ExAnt (_, _) as e) -> + Ast.ExSeq (_loc, e) + | e -> e + + let mksequence' _loc = + function + | (Ast.ExSem (_, _, _) as e) -> Ast.ExSeq (_loc, e) + | e -> e + + let rec lid_of_ident = + function + | Ast.IdAcc (_, _, i) -> lid_of_ident i + | Ast.IdLid (_, lid) -> lid + | _ -> assert false + + let module_type_app mt1 mt2 = + match (mt1, mt2) with + | (Ast.MtId (_loc, i1), Ast.MtId (_, i2)) -> + Ast.MtId (_loc, (Ast.IdApp (_loc, i1, i2))) + | _ -> raise Stream.Failure + + let module_type_acc mt1 mt2 = + match (mt1, mt2) with + | (Ast.MtId (_loc, i1), Ast.MtId (_, i2)) -> + Ast.MtId (_loc, (Ast.IdAcc (_loc, i1, i2))) + | _ -> raise Stream.Failure + + let bigarray_get _loc arr arg = + let coords = + match arg with + | Ast.ExTup (_, (Ast.ExCom (_, e1, e2))) | Ast.ExCom (_, e1, e2) + -> Ast.list_of_expr e1 (Ast.list_of_expr e2 []) + | _ -> [ arg ] + in + match coords with + | [ c1 ] -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Bigarray")), + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Array1")), + (Ast.IdLid (_loc, "get")))))))), + arr)), + c1) + | [ c1; c2 ] -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Bigarray")), + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Array2")), + (Ast.IdLid (_loc, "get")))))))), + arr)), + c1)), + c2) + | [ c1; c2; c3 ] -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Bigarray")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Array3")), + (Ast.IdLid (_loc, "get")))))))), + arr)), + c1)), + c2)), + c3) + | (* | coords -> <:expr< Bigarray.Genarray.get $arr$ [| $list:coords$ |] >> ] *) + coords -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Bigarray")), + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Genarray")), + (Ast.IdLid (_loc, "get")))))))), + arr)), + (Ast.ExArr (_loc, (Ast.exSem_of_list coords)))) + + let bigarray_set _loc var newval = + match var with + | Ast.ExApp (_, + (Ast.ExApp (_, + (Ast.ExId (_, + (Ast.IdAcc (_, (Ast.IdUid (_, "Bigarray")), + (Ast.IdAcc (_, (Ast.IdUid (_, "Array1")), + (Ast.IdLid (_, "get")))))))), + arr)), + c1) -> + Some + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Bigarray")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Array1")), + (Ast.IdLid (_loc, "set")))))))), + arr)), + c1)), + newval)) + | Ast.ExApp (_, + (Ast.ExApp (_, + (Ast.ExApp (_, + (Ast.ExId (_, + (Ast.IdAcc (_, (Ast.IdUid (_, "Bigarray")), + (Ast.IdAcc (_, (Ast.IdUid (_, "Array2")), + (Ast.IdLid (_, "get")))))))), + arr)), + c1)), + c2) -> + Some + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Bigarray")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Array2")), + (Ast.IdLid (_loc, "set")))))))), + arr)), + c1)), + c2)), + newval)) + | Ast.ExApp (_, + (Ast.ExApp (_, + (Ast.ExApp (_, + (Ast.ExApp (_, + (Ast.ExId (_, + (Ast.IdAcc (_, (Ast.IdUid (_, "Bigarray")), + (Ast.IdAcc (_, (Ast.IdUid (_, "Array3")), + (Ast.IdLid (_, "get")))))))), + arr)), + c1)), + c2)), + c3) -> + Some + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Bigarray")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Array3")), + (Ast.IdLid (_loc, "set")))))))), + arr)), + c1)), + c2)), + c3)), + newval)) + | Ast.ExApp (_, + (Ast.ExApp (_, + (Ast.ExId (_, + (Ast.IdAcc (_, (Ast.IdUid (_, "Bigarray")), + (Ast.IdAcc (_, (Ast.IdUid (_, "Genarray")), + (Ast.IdLid (_, "get")))))))), + arr)), + (Ast.ExArr (_, coords))) -> + Some + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Bigarray")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Genarray")), + (Ast.IdLid (_loc, "set")))))))), + arr)), + (Ast.ExArr (_loc, coords)))), + newval)) + | _ -> None + + let stopped_at _loc = Some (Loc.move_line 1 _loc) + + (* FIXME be more precise *) + let symbolchar = + let list = + [ '$'; '!'; '%'; '&'; '*'; '+'; '-'; '.'; '/'; ':'; '<'; '='; + '>'; '?'; '@'; '^'; '|'; '~'; '\\' ] in + let rec loop s i = + if i == (String.length s) + then true + else if List.mem s.[i] list then loop s (i + 1) else false + in loop + + let setup_op_parser entry p = + Gram.Entry.setup_parser entry + (fun (__strm : _ Stream.t) -> + match Stream.peek __strm with + | Some (((KEYWORD x | SYMBOL x), ti)) when p x -> + (Stream.junk __strm; + let _loc = Gram.token_location ti + in Ast.ExId (_loc, (Ast.IdLid (_loc, x)))) + | _ -> raise Stream.Failure) + + let _ = + let list = [ '!'; '?'; '~' ] in + let excl = [ "!="; "??" ] + in + setup_op_parser prefixop + (fun x -> + (not (List.mem x excl)) && + (((String.length x) >= 2) && + ((List.mem x.[0] list) && (symbolchar x 1)))) + + let _ = + let list_ok = + [ "<"; ">"; "<="; ">="; "="; "<>"; "=="; "!="; "$" ] in + let list_first_char_ok = [ '='; '<'; '>'; '|'; '&'; '$'; '!' ] in + let excl = [ "<-"; "||"; "&&" ] + in + setup_op_parser infixop0 + (fun x -> + (List.mem x list_ok) || + ((not (List.mem x excl)) && + (((String.length x) >= 2) && + ((List.mem x.[0] list_first_char_ok) && + (symbolchar x 1))))) + + let _ = + let list = [ '@'; '^' ] + in + setup_op_parser infixop1 + (fun x -> + ((String.length x) >= 1) && + ((List.mem x.[0] list) && (symbolchar x 1))) + + let _ = + let list = [ '+'; '-' ] + in + setup_op_parser infixop2 + (fun x -> + (x <> "->") && + (((String.length x) >= 1) && + ((List.mem x.[0] list) && (symbolchar x 1)))) + + let _ = + let list = [ '*'; '/'; '%'; '\\' ] + in + setup_op_parser infixop3 + (fun x -> + ((String.length x) >= 1) && + ((List.mem x.[0] list) && + (((x.[0] <> '*') || + (((String.length x) < 2) || (x.[1] <> '*'))) + && (symbolchar x 1)))) + + let _ = + setup_op_parser infixop4 + (fun x -> + ((String.length x) >= 2) && + ((x.[0] == '*') && ((x.[1] == '*') && (symbolchar x 2)))) + + let rec infix_kwds_filter (__strm : _ Stream.t) = + match Stream.peek __strm with + | Some (((KEYWORD "(", _) as tok)) -> + (Stream.junk __strm; + let xs = __strm in + let (__strm : _ Stream.t) = xs + in + (match Stream.peek __strm with + | Some + ((KEYWORD + (("mod" | "land" | "lor" | "lxor" | "lsl" | "lsr" | + "asr" + as i)), + _loc)) + -> + (Stream.junk __strm; + (match Stream.peek __strm with + | Some ((KEYWORD ")", _)) -> + (Stream.junk __strm; + let xs = __strm + in + Stream.lcons (fun _ -> ((LIDENT i), _loc)) + (Stream.slazy + (fun _ -> infix_kwds_filter xs))) + | _ -> raise (Stream.Error ""))) + | _ -> + let xs = __strm + in + Stream.icons tok + (Stream.slazy (fun _ -> infix_kwds_filter xs)))) + | Some x -> + (Stream.junk __strm; + let xs = __strm + in + Stream.icons x + (Stream.slazy (fun _ -> infix_kwds_filter xs))) + | _ -> raise Stream.Failure + + let _ = + Token.Filter.define_filter (Gram.get_filter ()) + (fun f strm -> infix_kwds_filter (f strm)) + + let _ = + Gram.Entry.setup_parser sem_expr + (let symb1 = Gram.parse_tokens_after_filter expr in + let symb (__strm : _ Stream.t) = + match Stream.peek __strm with + | Some ((ANTIQUOT ((("list" as n)), s), ti)) -> + (Stream.junk __strm; + let _loc = Gram.token_location ti + in Ast.ExAnt (_loc, (mk_anti ~c: "expr;" n s))) + | _ -> symb1 __strm in + let rec kont al (__strm : _ Stream.t) = + match Stream.peek __strm with + | Some ((KEYWORD ";", _)) -> + (Stream.junk __strm; + let a = + (try symb __strm + with | Stream.Failure -> raise (Stream.Error "")) in + let s = __strm in + let _loc = + Loc.merge (Ast.loc_of_expr al) (Ast.loc_of_expr a) + in kont (Ast.ExSem (_loc, al, a)) s) + | _ -> al + in + fun (__strm : _ Stream.t) -> + let a = symb __strm in kont a __strm) + + let _ = + let _ = (a_CHAR : 'a_CHAR Gram.Entry.t) + and _ = (override_flag_quot : 'override_flag_quot Gram.Entry.t) + and _ = (row_var_flag_quot : 'row_var_flag_quot Gram.Entry.t) + and _ = (virtual_flag_quot : 'virtual_flag_quot Gram.Entry.t) + and _ = (private_flag_quot : 'private_flag_quot Gram.Entry.t) + and _ = (mutable_flag_quot : 'mutable_flag_quot Gram.Entry.t) + and _ = (direction_flag_quot : 'direction_flag_quot Gram.Entry.t) + and _ = (rec_flag_quot : 'rec_flag_quot Gram.Entry.t) + and _ = (package_type : 'package_type Gram.Entry.t) + and _ = (do_sequence : 'do_sequence Gram.Entry.t) + and _ = (infixop4 : 'infixop4 Gram.Entry.t) + and _ = (infixop3 : 'infixop3 Gram.Entry.t) + and _ = (infixop2 : 'infixop2 Gram.Entry.t) + and _ = (infixop1 : 'infixop1 Gram.Entry.t) + and _ = (infixop0 : 'infixop0 Gram.Entry.t) + and _ = (with_constr_quot : 'with_constr_quot Gram.Entry.t) + and _ = (with_constr : 'with_constr Gram.Entry.t) + and _ = (value_val : 'value_val Gram.Entry.t) + and _ = (value_let : 'value_let Gram.Entry.t) + and _ = (val_longident : 'val_longident Gram.Entry.t) + and _ = (use_file : 'use_file Gram.Entry.t) + and _ = (typevars : 'typevars Gram.Entry.t) + and _ = (type_parameters : 'type_parameters Gram.Entry.t) + and _ = (type_parameter : 'type_parameter Gram.Entry.t) + and _ = + (type_longident_and_parameters : + 'type_longident_and_parameters Gram.Entry.t) + and _ = (type_longident : 'type_longident Gram.Entry.t) + and _ = (type_kind : 'type_kind Gram.Entry.t) + and _ = + (type_ident_and_parameters : + 'type_ident_and_parameters Gram.Entry.t) + and _ = (type_declaration : 'type_declaration Gram.Entry.t) + and _ = (type_constraint : 'type_constraint Gram.Entry.t) + and _ = (top_phrase : 'top_phrase Gram.Entry.t) + and _ = (str_items : 'str_items Gram.Entry.t) + and _ = (str_item_quot : 'str_item_quot Gram.Entry.t) + and _ = (str_item : 'str_item Gram.Entry.t) + and _ = (star_ctyp : 'star_ctyp Gram.Entry.t) + and _ = (sig_items : 'sig_items Gram.Entry.t) + and _ = (sig_item_quot : 'sig_item_quot Gram.Entry.t) + and _ = (sig_item : 'sig_item Gram.Entry.t) + and _ = (sequence : 'sequence Gram.Entry.t) + and _ = (semi : 'semi Gram.Entry.t) + and _ = (sem_patt_for_list : 'sem_patt_for_list Gram.Entry.t) + and _ = (sem_patt : 'sem_patt Gram.Entry.t) + and _ = (sem_expr_for_list : 'sem_expr_for_list Gram.Entry.t) + and _ = (sem_expr : 'sem_expr Gram.Entry.t) + and _ = (row_field : 'row_field Gram.Entry.t) + and _ = (poly_type : 'poly_type Gram.Entry.t) + and _ = (phrase : 'phrase Gram.Entry.t) + and _ = (patt_tcon : 'patt_tcon Gram.Entry.t) + and _ = (patt_quot : 'patt_quot Gram.Entry.t) + and _ = (patt_eoi : 'patt_eoi Gram.Entry.t) + and _ = (patt_as_patt_opt : 'patt_as_patt_opt Gram.Entry.t) + and _ = (patt : 'patt Gram.Entry.t) + and _ = (opt_when_expr : 'opt_when_expr Gram.Entry.t) + and _ = (opt_virtual : 'opt_virtual Gram.Entry.t) + and _ = (opt_rec : 'opt_rec Gram.Entry.t) + and _ = (opt_private : 'opt_private Gram.Entry.t) + and _ = (opt_polyt : 'opt_polyt Gram.Entry.t) + and _ = (opt_mutable : 'opt_mutable Gram.Entry.t) + and _ = (opt_meth_list : 'opt_meth_list Gram.Entry.t) + and _ = (opt_expr : 'opt_expr Gram.Entry.t) + and _ = (opt_eq_ctyp : 'opt_eq_ctyp Gram.Entry.t) + and _ = (opt_dot_dot : 'opt_dot_dot Gram.Entry.t) + and _ = (opt_comma_ctyp : 'opt_comma_ctyp Gram.Entry.t) + and _ = (opt_class_self_type : 'opt_class_self_type Gram.Entry.t) + and _ = (opt_class_self_patt : 'opt_class_self_patt Gram.Entry.t) + and _ = (opt_as_lident : 'opt_as_lident Gram.Entry.t) + and _ = (name_tags : 'name_tags Gram.Entry.t) + and _ = (more_ctyp : 'more_ctyp Gram.Entry.t) + and _ = (module_type_quot : 'module_type_quot Gram.Entry.t) + and _ = (module_type : 'module_type Gram.Entry.t) + and _ = + (module_rec_declaration : 'module_rec_declaration Gram.Entry.t) + and _ = + (module_longident_with_app : + 'module_longident_with_app Gram.Entry.t) + and _ = (module_longident : 'module_longident Gram.Entry.t) + and _ = (module_expr_quot : 'module_expr_quot Gram.Entry.t) + and _ = (module_expr : 'module_expr Gram.Entry.t) + and _ = (module_declaration : 'module_declaration Gram.Entry.t) + and _ = (module_binding_quot : 'module_binding_quot Gram.Entry.t) + and _ = (module_binding0 : 'module_binding0 Gram.Entry.t) + and _ = (module_binding : 'module_binding Gram.Entry.t) + and _ = (meth_decl : 'meth_decl Gram.Entry.t) + and _ = (meth_list : 'meth_list Gram.Entry.t) + and _ = (let_binding : 'let_binding Gram.Entry.t) + and _ = (labeled_ipatt : 'labeled_ipatt Gram.Entry.t) + and _ = (label_patt_list : 'label_patt_list Gram.Entry.t) + and _ = (label_patt : 'label_patt Gram.Entry.t) + and _ = (label_longident : 'label_longident Gram.Entry.t) + and _ = (label_ipatt_list : 'label_ipatt_list Gram.Entry.t) + and _ = (label_ipatt : 'label_ipatt Gram.Entry.t) + and _ = (label_expr_list : 'label_expr_list Gram.Entry.t) + and _ = (label_expr : 'label_expr Gram.Entry.t) + and _ = + (label_declaration_list : 'label_declaration_list Gram.Entry.t) + and _ = (label_declaration : 'label_declaration Gram.Entry.t) + and _ = (label : 'label Gram.Entry.t) + and _ = (ipatt_tcon : 'ipatt_tcon Gram.Entry.t) + and _ = (ipatt : 'ipatt Gram.Entry.t) + and _ = (interf : 'interf Gram.Entry.t) + and _ = (implem : 'implem Gram.Entry.t) + and _ = (ident_quot : 'ident_quot Gram.Entry.t) + and _ = (ident : 'ident Gram.Entry.t) + and _ = (fun_def : 'fun_def Gram.Entry.t) + and _ = (fun_binding : 'fun_binding Gram.Entry.t) + and _ = (field_expr_list : 'field_expr_list Gram.Entry.t) + and _ = (field_expr : 'field_expr Gram.Entry.t) + and _ = (expr_quot : 'expr_quot Gram.Entry.t) + and _ = (expr_eoi : 'expr_eoi Gram.Entry.t) + and _ = (expr : 'expr Gram.Entry.t) + and _ = (eq_expr : 'eq_expr Gram.Entry.t) + and _ = (dummy : 'dummy Gram.Entry.t) + and _ = (direction_flag : 'direction_flag Gram.Entry.t) + and _ = (cvalue_binding : 'cvalue_binding Gram.Entry.t) + and _ = (ctyp_quot : 'ctyp_quot Gram.Entry.t) + and _ = (ctyp : 'ctyp Gram.Entry.t) + and _ = + (constructor_declarations : + 'constructor_declarations Gram.Entry.t) + and _ = + (constructor_declaration : 'constructor_declaration Gram.Entry.t) + and _ = (constructor_arg_list : 'constructor_arg_list Gram.Entry.t) + and _ = (constrain : 'constrain Gram.Entry.t) + and _ = (comma_type_parameter : 'comma_type_parameter Gram.Entry.t) + and _ = (comma_patt : 'comma_patt Gram.Entry.t) + and _ = (comma_ipatt : 'comma_ipatt Gram.Entry.t) + and _ = (comma_expr : 'comma_expr Gram.Entry.t) + and _ = (comma_ctyp : 'comma_ctyp Gram.Entry.t) + and _ = (class_type_quot : 'class_type_quot Gram.Entry.t) + and _ = (class_type_plus : 'class_type_plus Gram.Entry.t) + and _ = + (class_type_longident_and_param : + 'class_type_longident_and_param Gram.Entry.t) + and _ = (class_type_longident : 'class_type_longident Gram.Entry.t) + and _ = + (class_type_declaration : 'class_type_declaration Gram.Entry.t) + and _ = (class_type : 'class_type Gram.Entry.t) + and _ = (class_structure : 'class_structure Gram.Entry.t) + and _ = (class_str_item_quot : 'class_str_item_quot Gram.Entry.t) + and _ = (class_str_item : 'class_str_item Gram.Entry.t) + and _ = (class_signature : 'class_signature Gram.Entry.t) + and _ = (class_sig_item_quot : 'class_sig_item_quot Gram.Entry.t) + and _ = (class_sig_item : 'class_sig_item Gram.Entry.t) + and _ = (class_name_and_param : 'class_name_and_param Gram.Entry.t) + and _ = + (class_longident_and_param : + 'class_longident_and_param Gram.Entry.t) + and _ = (class_longident : 'class_longident Gram.Entry.t) + and _ = + (class_info_for_class_type : + 'class_info_for_class_type Gram.Entry.t) + and _ = + (class_info_for_class_expr : + 'class_info_for_class_expr Gram.Entry.t) + and _ = (class_fun_def : 'class_fun_def Gram.Entry.t) + and _ = (class_fun_binding : 'class_fun_binding Gram.Entry.t) + and _ = (class_expr_quot : 'class_expr_quot Gram.Entry.t) + and _ = (class_expr : 'class_expr Gram.Entry.t) + and _ = (class_description : 'class_description Gram.Entry.t) + and _ = (class_declaration : 'class_declaration Gram.Entry.t) + and _ = (binding_quot : 'binding_quot Gram.Entry.t) + and _ = (binding : 'binding Gram.Entry.t) + and _ = (match_case_quot : 'match_case_quot Gram.Entry.t) + and _ = (match_case0 : 'match_case0 Gram.Entry.t) + and _ = (match_case : 'match_case Gram.Entry.t) + and _ = (and_ctyp : 'and_ctyp Gram.Entry.t) + and _ = (amp_ctyp : 'amp_ctyp Gram.Entry.t) + and _ = (a_ident : 'a_ident Gram.Entry.t) + and _ = (a_UIDENT : 'a_UIDENT Gram.Entry.t) + and _ = (a_STRING : 'a_STRING Gram.Entry.t) + and _ = (a_OPTLABEL : 'a_OPTLABEL Gram.Entry.t) + and _ = (a_NATIVEINT : 'a_NATIVEINT Gram.Entry.t) + and _ = (rec_binding_quot : 'rec_binding_quot Gram.Entry.t) + and _ = (a_LIDENT : 'a_LIDENT Gram.Entry.t) + and _ = (a_LABEL : 'a_LABEL Gram.Entry.t) + and _ = (a_INT64 : 'a_INT64 Gram.Entry.t) + and _ = (a_INT32 : 'a_INT32 Gram.Entry.t) + and _ = (a_INT : 'a_INT Gram.Entry.t) + and _ = (a_FLOAT : 'a_FLOAT Gram.Entry.t) in + let grammar_entry_create = Gram.Entry.mk in + let (* Here it's LABEL and not tilde_label since ~a:b is different than ~a : b *) + (* Same remark for ?a:b *) infixop5 : 'infixop5 Gram.Entry.t = + grammar_entry_create "infixop5" + and (* | i = opt_label; "("; p = patt_tcon; ")" -> *) + (* <:patt< ? $i$ : ($p$) >> *) + (* | i = opt_label; "("; p = ipatt_tcon; ")" -> + <:patt< ? $i$ : ($p$) >> + | i = opt_label; "("; p = ipatt_tcon; "="; e = expr; ")" -> + <:patt< ? $i$ : ($p$ = $e$) >> *) + string_list : 'string_list Gram.Entry.t = + grammar_entry_create "string_list" + and opt_override : 'opt_override Gram.Entry.t = + grammar_entry_create "opt_override" + and value_val_opt_override : 'value_val_opt_override Gram.Entry.t = + grammar_entry_create "value_val_opt_override" + and method_opt_override : 'method_opt_override Gram.Entry.t = + grammar_entry_create "method_opt_override" + and module_longident_dot_lparen : + 'module_longident_dot_lparen Gram.Entry.t = + grammar_entry_create "module_longident_dot_lparen" + and fun_def_cont_no_when : 'fun_def_cont_no_when Gram.Entry.t = + grammar_entry_create "fun_def_cont_no_when" + and fun_def_cont : 'fun_def_cont Gram.Entry.t = + grammar_entry_create "fun_def_cont" + and sequence' : 'sequence' Gram.Entry.t = + grammar_entry_create "sequence'" + and infixop6 : 'infixop6 Gram.Entry.t = + grammar_entry_create "infixop6" + in + (Gram.extend (module_expr : 'module_expr Gram.Entry.t) + ((fun () -> + (None, + [ ((Some "top"), None, + [ ([ Gram.Skeyword "struct"; + Gram.Snterm + (Gram.Entry.obj + (str_items : 'str_items Gram.Entry.t)); + Gram.Skeyword "end" ], + (Gram.Action.mk + (fun _ (st : 'str_items) _ (_loc : Gram.Loc.t) + -> (Ast.MeStr (_loc, st) : 'module_expr)))); + ([ Gram.Skeyword "functor"; Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)); + Gram.Skeyword ")"; Gram.Skeyword "->"; Gram.Sself ], + (Gram.Action.mk + (fun (me : 'module_expr) _ _ (t : 'module_type) + _ (i : 'a_UIDENT) _ _ (_loc : Gram.Loc.t) -> + (Ast.MeFun (_loc, i, t, me) : 'module_expr)))) ]); + ((Some "apply"), None, + [ ([ Gram.Sself; Gram.Sself ], + (Gram.Action.mk + (fun (me2 : 'module_expr) (me1 : 'module_expr) + (_loc : Gram.Loc.t) -> + (Ast.MeApp (_loc, me1, me2) : 'module_expr)))) ]); + ((Some "simple"), None, + [ ([ Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj + (value_val : 'value_val Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (package_type : 'package_type Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (p : 'package_type) _ (e : 'expr) _ _ + (_loc : Gram.Loc.t) -> + (Ast.MePkg (_loc, + (Ast.ExTyc (_loc, e, + (Ast.TyPkg (_loc, p))))) : + 'module_expr)))); + ([ Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj + (value_val : 'value_val Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (e : 'expr) _ _ (_loc : Gram.Loc.t) -> + (Ast.MePkg (_loc, e) : 'module_expr)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (me : 'module_expr) _ (_loc : Gram.Loc.t) + -> (me : 'module_expr)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (mt : 'module_type) _ (me : 'module_expr) + _ (_loc : Gram.Loc.t) -> + (Ast.MeTyc (_loc, me, mt) : 'module_expr)))); + ([ Gram.Snterm + (Gram.Entry.obj + (module_longident : + 'module_longident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'module_longident) (_loc : Gram.Loc.t) + -> (Ast.MeId (_loc, i) : 'module_expr)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.module_expr_tag : + 'module_expr) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "mexp" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"mexp\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "mexp" | "anti" | "list" as n)), + s) -> + (Ast.MeAnt (_loc, + (mk_anti ~c: "module_expr" n s)) : + 'module_expr) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (str_item : 'str_item Gram.Entry.t) + ((fun () -> + (None, + [ ((Some "top"), None, + [ ([ Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) (_loc : Gram.Loc.t) -> + (Ast.StExp (_loc, e) : 'str_item)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.str_item_tag : + 'str_item) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "stri" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"stri\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "stri" | "anti" | "list" as n)), + s) -> + (Ast.StAnt (_loc, + (mk_anti ~c: "str_item" n s)) : + 'str_item) + | _ -> assert false))); + ([ Gram.Skeyword "class"; Gram.Skeyword "type"; + Gram.Snterm + (Gram.Entry.obj + (class_type_declaration : + 'class_type_declaration Gram.Entry.t)) ], + (Gram.Action.mk + (fun (ctd : 'class_type_declaration) _ _ + (_loc : Gram.Loc.t) -> + (Ast.StClt (_loc, ctd) : 'str_item)))); + ([ Gram.Skeyword "class"; + Gram.Snterm + (Gram.Entry.obj + (class_declaration : + 'class_declaration Gram.Entry.t)) ], + (Gram.Action.mk + (fun (cd : 'class_declaration) _ + (_loc : Gram.Loc.t) -> + (Ast.StCls (_loc, cd) : 'str_item)))); + ([ Gram.Snterm + (Gram.Entry.obj + (value_let : 'value_let Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_rec : 'opt_rec Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (binding : 'binding Gram.Entry.t)) ], + (Gram.Action.mk + (fun (bi : 'binding) (r : 'opt_rec) _ + (_loc : Gram.Loc.t) -> + (Ast.StVal (_loc, r, bi) : 'str_item)))); + ([ Gram.Skeyword "type"; + Gram.Snterm + (Gram.Entry.obj + (type_declaration : + 'type_declaration Gram.Entry.t)) ], + (Gram.Action.mk + (fun (td : 'type_declaration) _ + (_loc : Gram.Loc.t) -> + (Ast.StTyp (_loc, td) : 'str_item)))); + ([ Gram.Skeyword "open"; + Gram.Snterm + (Gram.Entry.obj + (module_longident : + 'module_longident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'module_longident) _ + (_loc : Gram.Loc.t) -> + (Ast.StOpn (_loc, i) : 'str_item)))); + ([ Gram.Skeyword "module"; Gram.Skeyword "type"; + Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (mt : 'module_type) _ (i : 'a_UIDENT) _ _ + (_loc : Gram.Loc.t) -> + (Ast.StMty (_loc, i, mt) : 'str_item)))); + ([ Gram.Skeyword "module"; Gram.Skeyword "rec"; + Gram.Snterm + (Gram.Entry.obj + (module_binding : + 'module_binding Gram.Entry.t)) ], + (Gram.Action.mk + (fun (mb : 'module_binding) _ _ + (_loc : Gram.Loc.t) -> + (Ast.StRecMod (_loc, mb) : 'str_item)))); + ([ Gram.Skeyword "module"; + Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (module_binding0 : + 'module_binding0 Gram.Entry.t)) ], + (Gram.Action.mk + (fun (mb : 'module_binding0) (i : 'a_UIDENT) _ + (_loc : Gram.Loc.t) -> + (Ast.StMod (_loc, i, mb) : 'str_item)))); + ([ Gram.Skeyword "include"; + Gram.Snterm + (Gram.Entry.obj + (module_expr : 'module_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (me : 'module_expr) _ (_loc : Gram.Loc.t) + -> (Ast.StInc (_loc, me) : 'str_item)))); + ([ Gram.Skeyword "external"; + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (string_list : 'string_list Gram.Entry.t)) ], + (Gram.Action.mk + (fun (sl : 'string_list) _ (t : 'ctyp) _ + (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> + (Ast.StExt (_loc, i, t, sl) : 'str_item)))); + ([ Gram.Skeyword "exception"; + Gram.Snterm + (Gram.Entry.obj + (constructor_declaration : + 'constructor_declaration Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (type_longident : + 'type_longident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'type_longident) _ + (t : 'constructor_declaration) _ + (_loc : Gram.Loc.t) -> + (Ast.StExc (_loc, t, (Ast.OSome i)) : + 'str_item)))); + ([ Gram.Skeyword "exception"; + Gram.Snterm + (Gram.Entry.obj + (constructor_declaration : + 'constructor_declaration Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'constructor_declaration) _ + (_loc : Gram.Loc.t) -> + (Ast.StExc (_loc, t, Ast.ONone) : 'str_item)))) ]) ])) + ()); + Gram.extend (module_binding0 : 'module_binding0 Gram.Entry.t) + ((fun () -> + (None, + [ (None, (Some Camlp4.Sig.Grammar.RightA), + [ ([ Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (module_expr : 'module_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (me : 'module_expr) _ (_loc : Gram.Loc.t) + -> (me : 'module_binding0)))); + ([ Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (module_expr : 'module_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (me : 'module_expr) _ (mt : 'module_type) _ + (_loc : Gram.Loc.t) -> + (Ast.MeTyc (_loc, me, mt) : 'module_binding0)))); + ([ Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)); + Gram.Skeyword ")"; Gram.Sself ], + (Gram.Action.mk + (fun (mb : 'module_binding0) _ + (mt : 'module_type) _ (m : 'a_UIDENT) _ + (_loc : Gram.Loc.t) -> + (Ast.MeFun (_loc, m, mt, mb) : + 'module_binding0)))) ]) ])) + ()); + Gram.extend (module_binding : 'module_binding Gram.Entry.t) + ((fun () -> + (None, + [ (None, (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (module_expr : 'module_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (me : 'module_expr) _ (mt : 'module_type) _ + (m : 'a_UIDENT) (_loc : Gram.Loc.t) -> + (Ast.MbColEq (_loc, m, mt, me) : + 'module_binding)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.module_binding_tag : + 'module_binding) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("", _) -> true + | _ -> false), + "ANTIQUOT (\"\", _)")); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (module_expr : 'module_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (me : 'module_expr) _ (mt : 'module_type) _ + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" as n)), m) -> + (Ast.MbColEq (_loc, (mk_anti n m), mt, + me) : + 'module_binding) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("", _) -> true + | _ -> false), + "ANTIQUOT (\"\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" as n)), s) -> + (Ast.MbAnt (_loc, + (mk_anti ~c: "module_binding" n s)) : + 'module_binding) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT + (("module_binding" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"module_binding\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("module_binding" | "anti" | "list" as + n)), + s) -> + (Ast.MbAnt (_loc, + (mk_anti ~c: "module_binding" n s)) : + 'module_binding) + | _ -> assert false))); + ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], + (Gram.Action.mk + (fun (b2 : 'module_binding) _ + (b1 : 'module_binding) (_loc : Gram.Loc.t) -> + (Ast.MbAnd (_loc, b1, b2) : 'module_binding)))) ]) ])) + ()); + Gram.extend (module_type : 'module_type Gram.Entry.t) + ((fun () -> + (None, + [ ((Some "top"), None, + [ ([ Gram.Skeyword "functor"; Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword ":"; Gram.Sself; Gram.Skeyword ")"; + Gram.Skeyword "->"; Gram.Sself ], + (Gram.Action.mk + (fun (mt : 'module_type) _ _ (t : 'module_type) + _ (i : 'a_UIDENT) _ _ (_loc : Gram.Loc.t) -> + (Ast.MtFun (_loc, i, t, mt) : 'module_type)))) ]); + ((Some "with"), None, + [ ([ Gram.Sself; Gram.Skeyword "with"; + Gram.Snterm + (Gram.Entry.obj + (with_constr : 'with_constr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (wc : 'with_constr) _ (mt : 'module_type) + (_loc : Gram.Loc.t) -> + (Ast.MtWit (_loc, mt, wc) : 'module_type)))) ]); + ((Some "apply"), None, + [ ([ Gram.Sself; Gram.Sself; + Gram.Snterm + (Gram.Entry.obj (dummy : 'dummy Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (mt2 : 'module_type) (mt1 : 'module_type) + (_loc : Gram.Loc.t) -> + (module_type_app mt1 mt2 : 'module_type)))) ]); + ((Some "."), None, + [ ([ Gram.Sself; Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (mt2 : 'module_type) _ (mt1 : 'module_type) + (_loc : Gram.Loc.t) -> + (module_type_acc mt1 mt2 : 'module_type)))) ]); + ((Some "sig"), None, + [ ([ Gram.Skeyword "sig"; + Gram.Snterm + (Gram.Entry.obj + (sig_items : 'sig_items Gram.Entry.t)); + Gram.Skeyword "end" ], + (Gram.Action.mk + (fun _ (sg : 'sig_items) _ (_loc : Gram.Loc.t) + -> (Ast.MtSig (_loc, sg) : 'module_type)))) ]); + ((Some "simple"), None, + [ ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (mt : 'module_type) _ (_loc : Gram.Loc.t) + -> (mt : 'module_type)))); + ([ Gram.Skeyword "'"; + Gram.Snterm + (Gram.Entry.obj + (a_ident : 'a_ident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_ident) _ (_loc : Gram.Loc.t) -> + (Ast.MtQuo (_loc, i) : 'module_type)))); + ([ Gram.Snterm + (Gram.Entry.obj + (module_longident_with_app : + 'module_longident_with_app Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'module_longident_with_app) + (_loc : Gram.Loc.t) -> + (Ast.MtId (_loc, i) : 'module_type)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.module_type_tag : + 'module_type) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "mtyp" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"mtyp\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "mtyp" | "anti" | "list" as n)), + s) -> + (Ast.MtAnt (_loc, + (mk_anti ~c: "module_type" n s)) : + 'module_type) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (sig_item : 'sig_item Gram.Entry.t) + ((fun () -> + (None, + [ ((Some "top"), None, + [ ([ Gram.Skeyword "class"; Gram.Skeyword "type"; + Gram.Snterm + (Gram.Entry.obj + (class_type_declaration : + 'class_type_declaration Gram.Entry.t)) ], + (Gram.Action.mk + (fun (ctd : 'class_type_declaration) _ _ + (_loc : Gram.Loc.t) -> + (Ast.SgClt (_loc, ctd) : 'sig_item)))); + ([ Gram.Skeyword "class"; + Gram.Snterm + (Gram.Entry.obj + (class_description : + 'class_description Gram.Entry.t)) ], + (Gram.Action.mk + (fun (cd : 'class_description) _ + (_loc : Gram.Loc.t) -> + (Ast.SgCls (_loc, cd) : 'sig_item)))); + ([ Gram.Snterm + (Gram.Entry.obj + (value_val : 'value_val Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'ctyp) _ (i : 'a_LIDENT) _ + (_loc : Gram.Loc.t) -> + (Ast.SgVal (_loc, i, t) : 'sig_item)))); + ([ Gram.Skeyword "type"; + Gram.Snterm + (Gram.Entry.obj + (type_declaration : + 'type_declaration Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'type_declaration) _ + (_loc : Gram.Loc.t) -> + (Ast.SgTyp (_loc, t) : 'sig_item)))); + ([ Gram.Skeyword "open"; + Gram.Snterm + (Gram.Entry.obj + (module_longident : + 'module_longident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'module_longident) _ + (_loc : Gram.Loc.t) -> + (Ast.SgOpn (_loc, i) : 'sig_item)))); + ([ Gram.Skeyword "module"; Gram.Skeyword "type"; + Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_UIDENT) _ _ (_loc : Gram.Loc.t) -> + (Ast.SgMty (_loc, i, (Ast.MtNil _loc)) : + 'sig_item)))); + ([ Gram.Skeyword "module"; Gram.Skeyword "type"; + Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (mt : 'module_type) _ (i : 'a_UIDENT) _ _ + (_loc : Gram.Loc.t) -> + (Ast.SgMty (_loc, i, mt) : 'sig_item)))); + ([ Gram.Skeyword "module"; Gram.Skeyword "rec"; + Gram.Snterm + (Gram.Entry.obj + (module_rec_declaration : + 'module_rec_declaration Gram.Entry.t)) ], + (Gram.Action.mk + (fun (mb : 'module_rec_declaration) _ _ + (_loc : Gram.Loc.t) -> + (Ast.SgRecMod (_loc, mb) : 'sig_item)))); + ([ Gram.Skeyword "module"; + Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (module_declaration : + 'module_declaration Gram.Entry.t)) ], + (Gram.Action.mk + (fun (mt : 'module_declaration) (i : 'a_UIDENT) + _ (_loc : Gram.Loc.t) -> + (Ast.SgMod (_loc, i, mt) : 'sig_item)))); + ([ Gram.Skeyword "include"; + Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (mt : 'module_type) _ (_loc : Gram.Loc.t) + -> (Ast.SgInc (_loc, mt) : 'sig_item)))); + ([ Gram.Skeyword "external"; + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (string_list : 'string_list Gram.Entry.t)) ], + (Gram.Action.mk + (fun (sl : 'string_list) _ (t : 'ctyp) _ + (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> + (Ast.SgExt (_loc, i, t, sl) : 'sig_item)))); + ([ Gram.Skeyword "exception"; + Gram.Snterm + (Gram.Entry.obj + (constructor_declaration : + 'constructor_declaration Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'constructor_declaration) _ + (_loc : Gram.Loc.t) -> + (Ast.SgExc (_loc, t) : 'sig_item)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.sig_item_tag : + 'sig_item) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "sigi" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"sigi\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "sigi" | "anti" | "list" as n)), + s) -> + (Ast.SgAnt (_loc, + (mk_anti ~c: "sig_item" n s)) : + 'sig_item) + | _ -> assert false))) ]) ])) + ()); + Gram.extend + (module_declaration : 'module_declaration Gram.Entry.t) + ((fun () -> + (None, + [ (None, (Some Camlp4.Sig.Grammar.RightA), + [ ([ Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)); + Gram.Skeyword ")"; Gram.Sself ], + (Gram.Action.mk + (fun (mt : 'module_declaration) _ + (t : 'module_type) _ (i : 'a_UIDENT) _ + (_loc : Gram.Loc.t) -> + (Ast.MtFun (_loc, i, t, mt) : + 'module_declaration)))); + ([ Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (mt : 'module_type) _ (_loc : Gram.Loc.t) + -> (mt : 'module_declaration)))) ]) ])) + ()); + Gram.extend + (module_rec_declaration : + 'module_rec_declaration Gram.Entry.t) + ((fun () -> + (None, + [ (None, (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (mt : 'module_type) _ (m : 'a_UIDENT) + (_loc : Gram.Loc.t) -> + (Ast.MbCol (_loc, m, mt) : + 'module_rec_declaration)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.module_binding_tag : + 'module_rec_declaration) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT + (("" | "module_binding" | "anti" | + "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"module_binding\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "module_binding" | "anti" | + "list" + as n)), + s) -> + (Ast.MbAnt (_loc, + (mk_anti ~c: "module_binding" n s)) : + 'module_rec_declaration) + | _ -> assert false))); + ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], + (Gram.Action.mk + (fun (m2 : 'module_rec_declaration) _ + (m1 : 'module_rec_declaration) + (_loc : Gram.Loc.t) -> + (Ast.MbAnd (_loc, m1, m2) : + 'module_rec_declaration)))) ]) ])) + ()); + Gram.extend (with_constr : 'with_constr Gram.Entry.t) + ((fun () -> + (None, + [ (None, (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Skeyword "module"; + Gram.Snterm + (Gram.Entry.obj + (module_longident : + 'module_longident Gram.Entry.t)); + Gram.Skeyword ":="; + Gram.Snterm + (Gram.Entry.obj + (module_longident_with_app : + 'module_longident_with_app Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i2 : 'module_longident_with_app) _ + (i1 : 'module_longident) _ + (_loc : Gram.Loc.t) -> + (Ast.WcMoS (_loc, i1, i2) : 'with_constr)))); + ([ Gram.Skeyword "type"; + Gram.Snterm + (Gram.Entry.obj + (type_longident_and_parameters : + 'type_longident_and_parameters Gram.Entry. + t)); + Gram.Skeyword ":="; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t2 : 'ctyp) _ + (t1 : 'type_longident_and_parameters) _ + (_loc : Gram.Loc.t) -> + (Ast.WcTyS (_loc, t1, t2) : 'with_constr)))); + ([ Gram.Skeyword "type"; + Gram.Stoken + (((function + | ANTIQUOT (("" | "typ" | "anti"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"typ\" | \"anti\"), _)")); + Gram.Skeyword ":="; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'ctyp) _ (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "typ" | "anti" as n)), s) + -> + (Ast.WcTyS (_loc, + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp" n s))), + t) : + 'with_constr) + | _ -> assert false))); + ([ Gram.Skeyword "module"; + Gram.Snterm + (Gram.Entry.obj + (module_longident : + 'module_longident Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (module_longident_with_app : + 'module_longident_with_app Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i2 : 'module_longident_with_app) _ + (i1 : 'module_longident) _ + (_loc : Gram.Loc.t) -> + (Ast.WcMod (_loc, i1, i2) : 'with_constr)))); + ([ Gram.Skeyword "type"; + Gram.Snterm + (Gram.Entry.obj + (type_longident_and_parameters : + 'type_longident_and_parameters Gram.Entry. + t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t2 : 'ctyp) _ + (t1 : 'type_longident_and_parameters) _ + (_loc : Gram.Loc.t) -> + (Ast.WcTyp (_loc, t1, t2) : 'with_constr)))); + ([ Gram.Skeyword "type"; + Gram.Stoken + (((function + | ANTIQUOT (("" | "typ" | "anti"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"typ\" | \"anti\"), _)")); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'ctyp) _ (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "typ" | "anti" as n)), s) + -> + (Ast.WcTyp (_loc, + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp" n s))), + t) : + 'with_constr) + | _ -> assert false))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.with_constr_tag : + 'with_constr) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT + (("" | "with_constr" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"with_constr\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "with_constr" | "anti" | "list" + as n)), + s) -> + (Ast.WcAnt (_loc, + (mk_anti ~c: "with_constr" n s)) : + 'with_constr) + | _ -> assert false))); + ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], + (Gram.Action.mk + (fun (wc2 : 'with_constr) _ (wc1 : 'with_constr) + (_loc : Gram.Loc.t) -> + (Ast.WcAnd (_loc, wc1, wc2) : 'with_constr)))) ]) ])) + ()); + Gram.extend (expr : 'expr Gram.Entry.t) + ((fun () -> + (None, + [ ((Some "top"), (Some Camlp4.Sig.Grammar.RightA), + [ ([ Gram.Skeyword "object"; + Gram.Snterm + (Gram.Entry.obj + (opt_class_self_patt : + 'opt_class_self_patt Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (class_structure : + 'class_structure Gram.Entry.t)); + Gram.Skeyword "end" ], + (Gram.Action.mk + (fun _ (cst : 'class_structure) + (csp : 'opt_class_self_patt) _ + (_loc : Gram.Loc.t) -> + (Ast.ExObj (_loc, csp, cst) : 'expr)))); + ([ Gram.Skeyword "while"; + Gram.Snterm + (Gram.Entry.obj + (sequence : 'sequence Gram.Entry.t)); + Gram.Skeyword "do"; + Gram.Snterm + (Gram.Entry.obj + (do_sequence : 'do_sequence Gram.Entry.t)) ], + (Gram.Action.mk + (fun (seq : 'do_sequence) _ (e : 'sequence) _ + (_loc : Gram.Loc.t) -> + (Ast.ExWhi (_loc, (mksequence' _loc e), seq) : + 'expr)))); + ([ Gram.Skeyword "for"; + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (sequence : 'sequence Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (direction_flag : + 'direction_flag Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (sequence : 'sequence Gram.Entry.t)); + Gram.Skeyword "do"; + Gram.Snterm + (Gram.Entry.obj + (do_sequence : 'do_sequence Gram.Entry.t)) ], + (Gram.Action.mk + (fun (seq : 'do_sequence) _ (e2 : 'sequence) + (df : 'direction_flag) (e1 : 'sequence) _ + (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> + (Ast.ExFor (_loc, i, (mksequence' _loc e1), + (mksequence' _loc e2), df, seq) : + 'expr)))); + ([ Gram.Skeyword "do"; + Gram.Snterm + (Gram.Entry.obj + (do_sequence : 'do_sequence Gram.Entry.t)) ], + (Gram.Action.mk + (fun (seq : 'do_sequence) _ (_loc : Gram.Loc.t) + -> (mksequence _loc seq : 'expr)))); + ([ Gram.Skeyword "if"; Gram.Sself; + Gram.Skeyword "then"; Gram.Sself; + Gram.Skeyword "else"; Gram.Sself ], + (Gram.Action.mk + (fun (e3 : 'expr) _ (e2 : 'expr) _ (e1 : 'expr) + _ (_loc : Gram.Loc.t) -> + (Ast.ExIfe (_loc, e1, e2, e3) : 'expr)))); + ([ Gram.Skeyword "try"; + Gram.Snterm + (Gram.Entry.obj + (sequence : 'sequence Gram.Entry.t)); + Gram.Skeyword "with"; + Gram.Snterm + (Gram.Entry.obj + (match_case : 'match_case Gram.Entry.t)) ], + (Gram.Action.mk + (fun (a : 'match_case) _ (e : 'sequence) _ + (_loc : Gram.Loc.t) -> + (Ast.ExTry (_loc, (mksequence' _loc e), a) : + 'expr)))); + ([ Gram.Skeyword "match"; + Gram.Snterm + (Gram.Entry.obj + (sequence : 'sequence Gram.Entry.t)); + Gram.Skeyword "with"; + Gram.Snterm + (Gram.Entry.obj + (match_case : 'match_case Gram.Entry.t)) ], + (Gram.Action.mk + (fun (a : 'match_case) _ (e : 'sequence) _ + (_loc : Gram.Loc.t) -> + (Ast.ExMat (_loc, (mksequence' _loc e), a) : + 'expr)))); + ([ Gram.Skeyword "fun"; + Gram.Snterm + (Gram.Entry.obj + (fun_def : 'fun_def Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'fun_def) _ (_loc : Gram.Loc.t) -> + (e : 'expr)))); + ([ Gram.Skeyword "fun"; Gram.Skeyword "["; + Gram.Slist0sep + ((Gram.Snterm + (Gram.Entry.obj + (match_case0 : + 'match_case0 Gram.Entry.t))), + (Gram.Skeyword "|")); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (a : 'match_case0 list) _ _ + (_loc : Gram.Loc.t) -> + (Ast.ExFun (_loc, (Ast.mcOr_of_list a)) : + 'expr)))); + ([ Gram.Skeyword "let"; Gram.Skeyword "open"; + Gram.Snterm + (Gram.Entry.obj + (module_longident : + 'module_longident Gram.Entry.t)); + Gram.Skeyword "in"; Gram.Sself ], + (Gram.Action.mk + (fun (e : 'expr) _ (i : 'module_longident) _ _ + (_loc : Gram.Loc.t) -> + (Ast.ExOpI (_loc, i, e) : 'expr)))); + ([ Gram.Skeyword "let"; Gram.Skeyword "module"; + Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (module_binding0 : + 'module_binding0 Gram.Entry.t)); + Gram.Skeyword "in"; Gram.Sself ], + (Gram.Action.mk + (fun (e : 'expr) _ (mb : 'module_binding0) + (m : 'a_UIDENT) _ _ (_loc : Gram.Loc.t) -> + (Ast.ExLmd (_loc, m, mb, e) : 'expr)))); + ([ Gram.Skeyword "let"; + Gram.Snterm + (Gram.Entry.obj + (opt_rec : 'opt_rec Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (binding : 'binding Gram.Entry.t)); + Gram.Skeyword "in"; Gram.Sself ], + (Gram.Action.mk + (fun (x : 'expr) _ (bi : 'binding) + (r : 'opt_rec) _ (_loc : Gram.Loc.t) -> + (Ast.ExLet (_loc, r, bi, x) : 'expr)))) ]); + ((Some "where"), None, + [ ([ Gram.Sself; Gram.Skeyword "where"; + Gram.Snterm + (Gram.Entry.obj + (opt_rec : 'opt_rec Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (let_binding : 'let_binding Gram.Entry.t)) ], + (Gram.Action.mk + (fun (lb : 'let_binding) (rf : 'opt_rec) _ + (e : 'expr) (_loc : Gram.Loc.t) -> + (Ast.ExLet (_loc, rf, lb, e) : 'expr)))) ]); + ((Some ":="), (Some Camlp4.Sig.Grammar.NonA), + [ ([ Gram.Sself; Gram.Skeyword ":="; Gram.Sself; + Gram.Snterm + (Gram.Entry.obj (dummy : 'dummy Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (e2 : 'expr) _ (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (match bigarray_set _loc e1 e2 with + | Some e -> e + | None -> Ast.ExAss (_loc, e1, e2) : 'expr)))) ]); + ((Some "||"), (Some Camlp4.Sig.Grammar.RightA), + [ ([ Gram.Sself; + Gram.Snterm + (Gram.Entry.obj + (infixop6 : 'infixop6 Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'expr) (op : 'infixop6) (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, (Ast.ExApp (_loc, op, e1)), + e2) : + 'expr)))) ]); + ((Some "&&"), (Some Camlp4.Sig.Grammar.RightA), + [ ([ Gram.Sself; + Gram.Snterm + (Gram.Entry.obj + (infixop5 : 'infixop5 Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'expr) (op : 'infixop5) (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, (Ast.ExApp (_loc, op, e1)), + e2) : + 'expr)))) ]); + ((Some "<"), (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Sself; + Gram.Snterm + (Gram.Entry.obj + (infixop0 : 'infixop0 Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'expr) (op : 'infixop0) (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, (Ast.ExApp (_loc, op, e1)), + e2) : + 'expr)))) ]); + ((Some "^"), (Some Camlp4.Sig.Grammar.RightA), + [ ([ Gram.Sself; + Gram.Snterm + (Gram.Entry.obj + (infixop1 : 'infixop1 Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'expr) (op : 'infixop1) (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, (Ast.ExApp (_loc, op, e1)), + e2) : + 'expr)))) ]); + ((Some "+"), (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Sself; + Gram.Snterm + (Gram.Entry.obj + (infixop2 : 'infixop2 Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'expr) (op : 'infixop2) (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, (Ast.ExApp (_loc, op, e1)), + e2) : + 'expr)))) ]); + ((Some "*"), (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Sself; + Gram.Snterm + (Gram.Entry.obj + (infixop3 : 'infixop3 Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'expr) (op : 'infixop3) (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, (Ast.ExApp (_loc, op, e1)), + e2) : + 'expr)))); + ([ Gram.Sself; Gram.Skeyword "mod"; Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'expr) _ (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdLid (_loc, "mod")))), + e1)), + e2) : + 'expr)))); + ([ Gram.Sself; Gram.Skeyword "lxor"; Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'expr) _ (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdLid (_loc, "lxor")))), + e1)), + e2) : + 'expr)))); + ([ Gram.Sself; Gram.Skeyword "lor"; Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'expr) _ (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdLid (_loc, "lor")))), + e1)), + e2) : + 'expr)))); + ([ Gram.Sself; Gram.Skeyword "land"; Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'expr) _ (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdLid (_loc, "land")))), + e1)), + e2) : + 'expr)))) ]); + ((Some "**"), (Some Camlp4.Sig.Grammar.RightA), + [ ([ Gram.Sself; + Gram.Snterm + (Gram.Entry.obj + (infixop4 : 'infixop4 Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'expr) (op : 'infixop4) (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, (Ast.ExApp (_loc, op, e1)), + e2) : + 'expr)))); + ([ Gram.Sself; Gram.Skeyword "lsr"; Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'expr) _ (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdLid (_loc, "lsr")))), + e1)), + e2) : + 'expr)))); + ([ Gram.Sself; Gram.Skeyword "lsl"; Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'expr) _ (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdLid (_loc, "lsl")))), + e1)), + e2) : + 'expr)))); + ([ Gram.Sself; Gram.Skeyword "asr"; Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'expr) _ (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdLid (_loc, "asr")))), + e1)), + e2) : + 'expr)))) ]); + ((Some "unary minus"), (Some Camlp4.Sig.Grammar.NonA), + [ ([ Gram.Skeyword "-."; Gram.Sself ], + (Gram.Action.mk + (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> + (mkumin _loc "-." e : 'expr)))); + ([ Gram.Skeyword "-"; Gram.Sself ], + (Gram.Action.mk + (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> + (mkumin _loc "-" e : 'expr)))) ]); + ((Some "apply"), (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Skeyword "lazy"; Gram.Sself ], + (Gram.Action.mk + (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> + (Ast.ExLaz (_loc, e) : 'expr)))); + ([ Gram.Skeyword "new"; + Gram.Snterm + (Gram.Entry.obj + (class_longident : + 'class_longident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'class_longident) _ + (_loc : Gram.Loc.t) -> + (Ast.ExNew (_loc, i) : 'expr)))); + ([ Gram.Skeyword "assert"; Gram.Sself ], + (Gram.Action.mk + (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> + (mkassert _loc e : 'expr)))); + ([ Gram.Sself; Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'expr) (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, e1, e2) : 'expr)))) ]); + ((Some "label"), (Some Camlp4.Sig.Grammar.NonA), + [ ([ Gram.Skeyword "?"; + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> + (Ast.ExOlb (_loc, i, (Ast.ExNil _loc)) : + 'expr)))); + ([ Gram.Skeyword "?"; + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Skeyword ":"; Gram.Sself ], + (Gram.Action.mk + (fun (e : 'expr) _ (i : 'a_LIDENT) _ + (_loc : Gram.Loc.t) -> + (Ast.ExOlb (_loc, i, e) : 'expr)))); + ([ Gram.Stoken + (((function | OPTLABEL _ -> true | _ -> false), + "OPTLABEL _")); + Gram.Sself ], + (Gram.Action.mk + (fun (e : 'expr) (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | OPTLABEL i -> + (Ast.ExOlb (_loc, i, e) : 'expr) + | _ -> assert false))); + ([ Gram.Stoken + (((function | LABEL _ -> true | _ -> false), + "LABEL _")); + Gram.Sself ], + (Gram.Action.mk + (fun (e : 'expr) (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LABEL i -> (Ast.ExLab (_loc, i, e) : 'expr) + | _ -> assert false))); + ([ Gram.Skeyword "~"; + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> + (Ast.ExLab (_loc, i, (Ast.ExNil _loc)) : + 'expr)))); + ([ Gram.Skeyword "~"; + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Skeyword ":"; Gram.Sself ], + (Gram.Action.mk + (fun (e : 'expr) _ (i : 'a_LIDENT) _ + (_loc : Gram.Loc.t) -> + (Ast.ExLab (_loc, i, e) : 'expr)))) ]); + ((Some "."), (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Sself; Gram.Skeyword "#"; + Gram.Snterm + (Gram.Entry.obj (label : 'label Gram.Entry.t)) ], + (Gram.Action.mk + (fun (lab : 'label) _ (e : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExSnd (_loc, e, lab) : 'expr)))); + ([ Gram.Sself; Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'expr) _ (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExAcc (_loc, e1, e2) : 'expr)))); + ([ Gram.Sself; Gram.Skeyword "."; Gram.Skeyword "{"; + Gram.Snterm + (Gram.Entry.obj + (comma_expr : 'comma_expr Gram.Entry.t)); + Gram.Skeyword "}" ], + (Gram.Action.mk + (fun _ (e2 : 'comma_expr) _ _ (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (bigarray_get _loc e1 e2 : 'expr)))); + ([ Gram.Sself; Gram.Skeyword "."; Gram.Skeyword "["; + Gram.Sself; Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (e2 : 'expr) _ _ (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExSte (_loc, e1, e2) : 'expr)))); + ([ Gram.Sself; Gram.Skeyword "."; Gram.Skeyword "("; + Gram.Sself; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (e2 : 'expr) _ _ (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExAre (_loc, e1, e2) : 'expr)))) ]); + ((Some "~-"), (Some Camlp4.Sig.Grammar.NonA), + [ ([ Gram.Snterm + (Gram.Entry.obj + (prefixop : 'prefixop Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (e : 'expr) (f : 'prefixop) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, f, e) : 'expr)))); + ([ Gram.Skeyword "!"; Gram.Sself ], + (Gram.Action.mk + (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> + (Ast.ExAcc (_loc, e, + (Ast.ExId (_loc, + (Ast.IdLid (_loc, "val"))))) : + 'expr)))) ]); + ((Some "simple"), None, + [ ([ Gram.Skeyword "("; Gram.Skeyword "module"; + Gram.Snterm + (Gram.Entry.obj + (module_expr : 'module_expr Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (package_type : 'package_type Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (pt : 'package_type) _ + (me : 'module_expr) _ _ (_loc : Gram.Loc.t) + -> + (Ast.ExPkg (_loc, (Ast.MeTyc (_loc, me, pt))) : + 'expr)))); + ([ Gram.Skeyword "("; Gram.Skeyword "module"; + Gram.Snterm + (Gram.Entry.obj + (module_expr : 'module_expr Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (me : 'module_expr) _ _ + (_loc : Gram.Loc.t) -> + (Ast.ExPkg (_loc, me) : 'expr)))); + ([ Gram.Skeyword "begin"; Gram.Skeyword "end" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))) : + 'expr)))); + ([ Gram.Skeyword "begin"; + Gram.Snterm + (Gram.Entry.obj + (sequence : 'sequence Gram.Entry.t)); + Gram.Skeyword "end" ], + (Gram.Action.mk + (fun _ (seq : 'sequence) _ (_loc : Gram.Loc.t) + -> (mksequence _loc seq : 'expr)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (e : 'expr) _ (_loc : Gram.Loc.t) -> + (e : 'expr)))); + ([ Gram.Skeyword "("; Gram.Sself; + Gram.Skeyword ":>"; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (t : 'ctyp) _ (e : 'expr) _ + (_loc : Gram.Loc.t) -> + (Ast.ExCoe (_loc, e, (Ast.TyNil _loc), t) : + 'expr)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); + Gram.Skeyword ":>"; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (t2 : 'ctyp) _ (t : 'ctyp) _ (e : 'expr) + _ (_loc : Gram.Loc.t) -> + (Ast.ExCoe (_loc, e, t, t2) : 'expr)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ";"; + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ _ (e : 'expr) _ (_loc : Gram.Loc.t) -> + (mksequence _loc e : 'expr)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ";"; + Gram.Snterm + (Gram.Entry.obj + (sequence : 'sequence Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (seq : 'sequence) _ (e : 'expr) _ + (_loc : Gram.Loc.t) -> + (mksequence _loc (Ast.ExSem (_loc, e, seq)) : + 'expr)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ","; + Gram.Snterm + (Gram.Entry.obj + (comma_expr : 'comma_expr Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (el : 'comma_expr) _ (e : 'expr) _ + (_loc : Gram.Loc.t) -> + (Ast.ExTup (_loc, (Ast.ExCom (_loc, e, el))) : + 'expr)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (t : 'ctyp) _ (e : 'expr) _ + (_loc : Gram.Loc.t) -> + (Ast.ExTyc (_loc, e, t) : 'expr)))); + ([ Gram.Skeyword "("; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))) : + 'expr)))); + ([ Gram.Skeyword "{<"; + Gram.Snterm + (Gram.Entry.obj + (field_expr_list : + 'field_expr_list Gram.Entry.t)); + Gram.Skeyword ">}" ], + (Gram.Action.mk + (fun _ (fel : 'field_expr_list) _ + (_loc : Gram.Loc.t) -> + (Ast.ExOvr (_loc, fel) : 'expr)))); + ([ Gram.Skeyword "{<"; Gram.Skeyword ">}" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (Ast.ExOvr (_loc, (Ast.RbNil _loc)) : 'expr)))); + ([ Gram.Skeyword "{"; Gram.Skeyword "("; Gram.Sself; + Gram.Skeyword ")"; Gram.Skeyword "with"; + Gram.Snterm + (Gram.Entry.obj + (label_expr_list : + 'label_expr_list Gram.Entry.t)); + Gram.Skeyword "}" ], + (Gram.Action.mk + (fun _ (el : 'label_expr_list) _ _ (e : 'expr) _ + _ (_loc : Gram.Loc.t) -> + (Ast.ExRec (_loc, el, e) : 'expr)))); + ([ Gram.Skeyword "{"; + Gram.Snterm + (Gram.Entry.obj + (label_expr_list : + 'label_expr_list Gram.Entry.t)); + Gram.Skeyword "}" ], + (Gram.Action.mk + (fun _ (el : 'label_expr_list) _ + (_loc : Gram.Loc.t) -> + (Ast.ExRec (_loc, el, (Ast.ExNil _loc)) : + 'expr)))); + ([ Gram.Skeyword "[|"; + Gram.Snterm + (Gram.Entry.obj + (sem_expr : 'sem_expr Gram.Entry.t)); + Gram.Skeyword "|]" ], + (Gram.Action.mk + (fun _ (el : 'sem_expr) _ (_loc : Gram.Loc.t) -> + (Ast.ExArr (_loc, el) : 'expr)))); + ([ Gram.Skeyword "[|"; Gram.Skeyword "|]" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (Ast.ExArr (_loc, (Ast.ExNil _loc)) : 'expr)))); + ([ Gram.Skeyword "["; + Gram.Snterm + (Gram.Entry.obj + (sem_expr_for_list : + 'sem_expr_for_list Gram.Entry.t)); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (mk_list : 'sem_expr_for_list) _ + (_loc : Gram.Loc.t) -> + (mk_list + (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]")))) : + 'expr)))); + ([ Gram.Skeyword "["; + Gram.Snterm + (Gram.Entry.obj + (sem_expr_for_list : + 'sem_expr_for_list Gram.Entry.t)); + Gram.Skeyword "::"; Gram.Sself; Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (last : 'expr) _ + (mk_list : 'sem_expr_for_list) _ + (_loc : Gram.Loc.t) -> (mk_list last : 'expr)))); + ([ Gram.Skeyword "["; Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]"))) : + 'expr)))); + ([ Gram.Skeyword "`"; + Gram.Snterm + (Gram.Entry.obj + (a_ident : 'a_ident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_ident) _ (_loc : Gram.Loc.t) -> + (Ast.ExVrn (_loc, s) : 'expr)))); + ([ Gram.Stry + (Gram.Snterm + (Gram.Entry.obj + (val_longident : + 'val_longident Gram.Entry.t))) ], + (Gram.Action.mk + (fun (i : 'val_longident) (_loc : Gram.Loc.t) -> + (Ast.ExId (_loc, i) : 'expr)))); + ([ Gram.Stry + (Gram.Snterm + (Gram.Entry.obj + (module_longident_dot_lparen : + 'module_longident_dot_lparen Gram. + Entry.t))); + Gram.Snterm + (Gram.Entry.obj + (sequence : 'sequence Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (e : 'sequence) + (i : 'module_longident_dot_lparen) + (_loc : Gram.Loc.t) -> + (Ast.ExOpI (_loc, i, e) : 'expr)))); + ([ Gram.Snterm + (Gram.Entry.obj (a_CHAR : 'a_CHAR Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_CHAR) (_loc : Gram.Loc.t) -> + (Ast.ExChr (_loc, s) : 'expr)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_STRING : 'a_STRING Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_STRING) (_loc : Gram.Loc.t) -> + (Ast.ExStr (_loc, s) : 'expr)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_FLOAT : 'a_FLOAT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_FLOAT) (_loc : Gram.Loc.t) -> + (Ast.ExFlo (_loc, s) : 'expr)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_NATIVEINT : 'a_NATIVEINT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_NATIVEINT) (_loc : Gram.Loc.t) -> + (Ast.ExNativeInt (_loc, s) : 'expr)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_INT64 : 'a_INT64 Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_INT64) (_loc : Gram.Loc.t) -> + (Ast.ExInt64 (_loc, s) : 'expr)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_INT32 : 'a_INT32 Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_INT32) (_loc : Gram.Loc.t) -> + (Ast.ExInt32 (_loc, s) : 'expr)))); + ([ Gram.Snterm + (Gram.Entry.obj (a_INT : 'a_INT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_INT) (_loc : Gram.Loc.t) -> + (Ast.ExInt (_loc, s) : 'expr)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("seq", _) -> true + | _ -> false), + "ANTIQUOT (\"seq\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("seq" as n)), s) -> + (Ast.ExSeq (_loc, + (Ast.ExAnt (_loc, + (mk_anti ~c: "expr" n s)))) : + 'expr) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("tup", _) -> true + | _ -> false), + "ANTIQUOT (\"tup\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("tup" as n)), s) -> + (Ast.ExTup (_loc, + (Ast.ExAnt (_loc, + (mk_anti ~c: "expr" n s)))) : + 'expr) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("`bool", _) -> true + | _ -> false), + "ANTIQUOT (\"`bool\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("`bool" as n)), s) -> + (Ast.ExId (_loc, + (Ast.IdAnt (_loc, (mk_anti n s)))) : + 'expr) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("exp" | "" | "anti"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"exp\" | \"\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("exp" | "" | "anti" as n)), s) + -> + (Ast.ExAnt (_loc, + (mk_anti ~c: "expr" n s)) : + 'expr) + | _ -> assert false))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.expr_tag : + 'expr) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (do_sequence : 'do_sequence Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "done" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))) : + 'do_sequence)))); + ([ Gram.Stry + (Gram.srules do_sequence + [ ([ Gram.Snterm + (Gram.Entry.obj + (sequence : + 'sequence Gram.Entry.t)); + Gram.Skeyword "done" ], + (Gram.Action.mk + (fun _ (seq : 'sequence) + (_loc : Gram.Loc.t) -> + (seq : 'e__3)))) ]) ], + (Gram.Action.mk + (fun (seq : 'e__3) (_loc : Gram.Loc.t) -> + (seq : 'do_sequence)))); + ([ Gram.Stry + (Gram.srules do_sequence + [ ([ Gram.Skeyword "{"; Gram.Skeyword "}" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (() : 'e__2)))) ]) ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))) : + 'do_sequence)))); + ([ Gram.Stry + (Gram.srules do_sequence + [ ([ Gram.Skeyword "{"; + Gram.Snterm + (Gram.Entry.obj + (sequence : + 'sequence Gram.Entry.t)); + Gram.Skeyword "}" ], + (Gram.Action.mk + (fun _ (seq : 'sequence) _ + (_loc : Gram.Loc.t) -> + (seq : 'e__1)))) ]) ], + (Gram.Action.mk + (fun (seq : 'e__1) (_loc : Gram.Loc.t) -> + (seq : 'do_sequence)))) ]) ])) + ()); + Gram.extend (infixop5 : 'infixop5 Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.srules infixop5 + [ ([ Gram.Skeyword "&&" ], + (Gram.Action.mk + (fun (x : Gram.Token.t) + (_loc : Gram.Loc.t) -> + (Gram.Token.extract_string x : 'e__4)))); + ([ Gram.Skeyword "&" ], + (Gram.Action.mk + (fun (x : Gram.Token.t) + (_loc : Gram.Loc.t) -> + (Gram.Token.extract_string x : 'e__4)))) ] ], + (Gram.Action.mk + (fun (x : 'e__4) (_loc : Gram.Loc.t) -> + (Ast.ExId (_loc, (Ast.IdLid (_loc, x))) : + 'infixop5)))) ]) ])) + ()); + Gram.extend (infixop6 : 'infixop6 Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.srules infixop6 + [ ([ Gram.Skeyword "||" ], + (Gram.Action.mk + (fun (x : Gram.Token.t) + (_loc : Gram.Loc.t) -> + (Gram.Token.extract_string x : 'e__5)))); + ([ Gram.Skeyword "or" ], + (Gram.Action.mk + (fun (x : Gram.Token.t) + (_loc : Gram.Loc.t) -> + (Gram.Token.extract_string x : 'e__5)))) ] ], + (Gram.Action.mk + (fun (x : 'e__5) (_loc : Gram.Loc.t) -> + (Ast.ExId (_loc, (Ast.IdLid (_loc, x))) : + 'infixop6)))) ]) ])) + ()); + Gram.extend + (sem_expr_for_list : 'sem_expr_for_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) (_loc : Gram.Loc.t) -> + (fun acc -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdUid (_loc, "::")))), + e)), + acc) : + 'sem_expr_for_list)))); + ([ Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Skeyword ";" ], + (Gram.Action.mk + (fun _ (e : 'expr) (_loc : Gram.Loc.t) -> + (fun acc -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdUid (_loc, "::")))), + e)), + acc) : + 'sem_expr_for_list)))); + ([ Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Sself ], + (Gram.Action.mk + (fun (el : 'sem_expr_for_list) _ (e : 'expr) + (_loc : Gram.Loc.t) -> + (fun acc -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdUid (_loc, "::")))), + e)), + (el acc)) : + 'sem_expr_for_list)))) ]) ])) + ()); + Gram.extend (comma_expr : 'comma_expr Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterml + ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), + "top") ], + (Gram.Action.mk + (fun (e : 'expr) (_loc : Gram.Loc.t) -> + (e : 'comma_expr)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.ExAnt (_loc, + (mk_anti ~c: "expr," n s)) : + 'comma_expr) + | _ -> assert false))); + ([ Gram.Sself; Gram.Skeyword ","; Gram.Sself ], + (Gram.Action.mk + (fun (e2 : 'comma_expr) _ (e1 : 'comma_expr) + (_loc : Gram.Loc.t) -> + (Ast.ExCom (_loc, e1, e2) : 'comma_expr)))) ]) ])) + ()); + Gram.extend (dummy : 'dummy Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> (() : 'dummy)))) ]) ])) + ()); + Gram.extend (sequence' : 'sequence' Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword ";"; + Gram.Snterm + (Gram.Entry.obj + (sequence : 'sequence Gram.Entry.t)) ], + (Gram.Action.mk + (fun (el : 'sequence) _ (_loc : Gram.Loc.t) -> + (fun e -> Ast.ExSem (_loc, e, el) : + 'sequence')))); + ([ Gram.Skeyword ";" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (fun e -> e : 'sequence')))); + ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (fun e -> e : 'sequence')))) ]) ])) + ()); + Gram.extend (sequence : 'sequence Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (sequence' : 'sequence' Gram.Entry.t)) ], + (Gram.Action.mk + (fun (k : 'sequence') (e : 'expr) + (_loc : Gram.Loc.t) -> (k e : 'sequence)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.ExAnt (_loc, + (mk_anti ~c: "expr;" n s)) : + 'sequence) + | _ -> assert false))); + ([ Gram.Skeyword "let"; Gram.Skeyword "open"; + Gram.Snterm + (Gram.Entry.obj + (module_longident : + 'module_longident Gram.Entry.t)); + Gram.Skeyword "in"; Gram.Sself ], + (Gram.Action.mk + (fun (e : 'sequence) _ (i : 'module_longident) _ + _ (_loc : Gram.Loc.t) -> + (Ast.ExOpI (_loc, i, e) : 'sequence)))); + ([ Gram.Skeyword "let"; Gram.Skeyword "module"; + Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (module_binding0 : + 'module_binding0 Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Sself ], + (Gram.Action.mk + (fun (el : 'sequence) _ (mb : 'module_binding0) + (m : 'a_UIDENT) _ _ (_loc : Gram.Loc.t) -> + (Ast.ExLmd (_loc, m, mb, + (mksequence _loc el)) : + 'sequence)))); + ([ Gram.Skeyword "let"; Gram.Skeyword "module"; + Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (module_binding0 : + 'module_binding0 Gram.Entry.t)); + Gram.Skeyword "in"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (sequence' : 'sequence' Gram.Entry.t)) ], + (Gram.Action.mk + (fun (k : 'sequence') (e : 'expr) _ + (mb : 'module_binding0) (m : 'a_UIDENT) _ _ + (_loc : Gram.Loc.t) -> + (k (Ast.ExLmd (_loc, m, mb, e)) : 'sequence)))); + ([ Gram.Skeyword "let"; + Gram.Snterm + (Gram.Entry.obj + (opt_rec : 'opt_rec Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (binding : 'binding Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Sself ], + (Gram.Action.mk + (fun (el : 'sequence) _ (bi : 'binding) + (rf : 'opt_rec) _ (_loc : Gram.Loc.t) -> + (Ast.ExLet (_loc, rf, bi, + (mksequence _loc el)) : + 'sequence)))); + ([ Gram.Skeyword "let"; + Gram.Snterm + (Gram.Entry.obj + (opt_rec : 'opt_rec Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (binding : 'binding Gram.Entry.t)); + Gram.Skeyword "in"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (sequence' : 'sequence' Gram.Entry.t)) ], + (Gram.Action.mk + (fun (k : 'sequence') (e : 'expr) _ + (bi : 'binding) (rf : 'opt_rec) _ + (_loc : Gram.Loc.t) -> + (k (Ast.ExLet (_loc, rf, bi, e)) : 'sequence)))) ]) ])) + ()); + Gram.extend (binding : 'binding Gram.Entry.t) + ((fun () -> + (None, + [ (None, (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Snterm + (Gram.Entry.obj + (let_binding : 'let_binding Gram.Entry.t)) ], + (Gram.Action.mk + (fun (b : 'let_binding) (_loc : Gram.Loc.t) -> + (b : 'binding)))); + ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], + (Gram.Action.mk + (fun (b2 : 'binding) _ (b1 : 'binding) + (_loc : Gram.Loc.t) -> + (Ast.BiAnd (_loc, b1, b2) : 'binding)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "anti"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "anti" as n)), s) -> + (Ast.BiAnt (_loc, + (mk_anti ~c: "binding" n s)) : + 'binding) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "anti"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"anti\"), _)")); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "anti" as n)), s) -> + (Ast.BiEq (_loc, + (Ast.PaAnt (_loc, + (mk_anti ~c: "patt" n s))), + e) : + 'binding) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("binding" | "list"), _) -> true + | _ -> false), + "ANTIQUOT ((\"binding\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("binding" | "list" as n)), s) + -> + (Ast.BiAnt (_loc, + (mk_anti ~c: "binding" n s)) : + 'binding) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (let_binding : 'let_binding Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (ipatt : 'ipatt Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (fun_binding : 'fun_binding Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'fun_binding) (p : 'ipatt) + (_loc : Gram.Loc.t) -> + (Ast.BiEq (_loc, p, e) : 'let_binding)))) ]) ])) + ()); + Gram.extend (fun_binding : 'fun_binding Gram.Entry.t) + ((fun () -> + (None, + [ (None, (Some Camlp4.Sig.Grammar.RightA), + [ ([ Gram.Snterm + (Gram.Entry.obj + (cvalue_binding : + 'cvalue_binding Gram.Entry.t)) ], + (Gram.Action.mk + (fun (bi : 'cvalue_binding) (_loc : Gram.Loc.t) + -> (bi : 'fun_binding)))); + ([ Gram.Stry + (Gram.Snterm + (Gram.Entry.obj + (labeled_ipatt : + 'labeled_ipatt Gram.Entry.t))); + Gram.Sself ], + (Gram.Action.mk + (fun (e : 'fun_binding) (p : 'labeled_ipatt) + (_loc : Gram.Loc.t) -> + (Ast.ExFun (_loc, + (Ast.McArr (_loc, p, (Ast.ExNil _loc), e))) : + 'fun_binding)))); + ([ Gram.Stry + (Gram.srules fun_binding + [ ([ Gram.Skeyword "("; Gram.Skeyword "type" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (() : 'e__6)))) ]); + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Skeyword ")"; Gram.Sself ], + (Gram.Action.mk + (fun (e : 'fun_binding) _ (i : 'a_LIDENT) _ + (_loc : Gram.Loc.t) -> + (Ast.ExFUN (_loc, i, e) : 'fun_binding)))) ]) ])) + ()); + Gram.extend (match_case : 'match_case Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (ipatt : 'ipatt Gram.Entry.t)); + Gram.Skeyword "->"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (p : 'ipatt) + (_loc : Gram.Loc.t) -> + (Ast.McArr (_loc, p, (Ast.ExNil _loc), e) : + 'match_case)))); + ([ Gram.Skeyword "["; + Gram.Slist0sep + ((Gram.Snterm + (Gram.Entry.obj + (match_case0 : + 'match_case0 Gram.Entry.t))), + (Gram.Skeyword "|")); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (l : 'match_case0 list) _ + (_loc : Gram.Loc.t) -> + (Ast.mcOr_of_list l : 'match_case)))) ]) ])) + ()); + Gram.extend (match_case0 : 'match_case0 Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (patt_as_patt_opt : + 'patt_as_patt_opt Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_when_expr : + 'opt_when_expr Gram.Entry.t)); + Gram.Skeyword "->"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (w : 'opt_when_expr) + (p : 'patt_as_patt_opt) (_loc : Gram.Loc.t) + -> (Ast.McArr (_loc, p, w, e) : 'match_case0)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "anti"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"anti\"), _)")); + Gram.Skeyword "when"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Skeyword "->"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (w : 'expr) _ + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "anti" as n)), s) -> + (Ast.McArr (_loc, + (Ast.PaAnt (_loc, + (mk_anti ~c: "patt" n s))), + w, e) : + 'match_case0) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "anti"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"anti\"), _)")); + Gram.Skeyword "->"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "anti" as n)), s) -> + (Ast.McArr (_loc, + (Ast.PaAnt (_loc, + (mk_anti ~c: "patt" n s))), + (Ast.ExNil _loc), e) : + 'match_case0) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "anti"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "anti" as n)), s) -> + (Ast.McAnt (_loc, + (mk_anti ~c: "match_case" n s)) : + 'match_case0) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("match_case" | "list"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"match_case\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("match_case" | "list" as n)), + s) -> + (Ast.McAnt (_loc, + (mk_anti ~c: "match_case" n s)) : + 'match_case0) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (opt_when_expr : 'opt_when_expr Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.ExNil _loc : 'opt_when_expr)))); + ([ Gram.Skeyword "when"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (w : 'expr) _ (_loc : Gram.Loc.t) -> + (w : 'opt_when_expr)))) ]) ])) + ()); + Gram.extend (patt_as_patt_opt : 'patt_as_patt_opt Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p : 'patt) (_loc : Gram.Loc.t) -> + (p : 'patt_as_patt_opt)))); + ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); + Gram.Skeyword "as"; + Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p2 : 'patt) _ (p1 : 'patt) + (_loc : Gram.Loc.t) -> + (Ast.PaAli (_loc, p1, p2) : + 'patt_as_patt_opt)))) ]) ])) + ()); + Gram.extend (label_expr_list : 'label_expr_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (label_expr : 'label_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (b1 : 'label_expr) (_loc : Gram.Loc.t) -> + (b1 : 'label_expr_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (label_expr : 'label_expr Gram.Entry.t)); + Gram.Skeyword ";" ], + (Gram.Action.mk + (fun _ (b1 : 'label_expr) (_loc : Gram.Loc.t) -> + (b1 : 'label_expr_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (label_expr : 'label_expr Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Sself ], + (Gram.Action.mk + (fun (b2 : 'label_expr_list) _ + (b1 : 'label_expr) (_loc : Gram.Loc.t) -> + (Ast.RbSem (_loc, b1, b2) : 'label_expr_list)))) ]) ])) + ()); + Gram.extend (label_expr : 'label_expr Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (label_longident : + 'label_longident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'label_longident) (_loc : Gram.Loc.t) + -> + (Ast.RbEq (_loc, i, + (Ast.ExId (_loc, + (Ast.IdLid (_loc, (lid_of_ident i)))))) : + 'label_expr)))); + ([ Gram.Snterm + (Gram.Entry.obj + (label_longident : + 'label_longident Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (fun_binding : 'fun_binding Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'fun_binding) (i : 'label_longident) + (_loc : Gram.Loc.t) -> + (Ast.RbEq (_loc, i, e) : 'label_expr)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.RbAnt (_loc, + (mk_anti ~c: "rec_binding" n s)) : + 'label_expr) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "anti"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"anti\"), _)")); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "anti" as n)), s) -> + (Ast.RbEq (_loc, + (Ast.IdAnt (_loc, + (mk_anti ~c: "ident" n s))), + e) : + 'label_expr) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "anti"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "anti" as n)), s) -> + (Ast.RbAnt (_loc, + (mk_anti ~c: "rec_binding" n s)) : + 'label_expr) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("rec_binding", _) -> true + | _ -> false), + "ANTIQUOT (\"rec_binding\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("rec_binding" as n)), s) -> + (Ast.RbAnt (_loc, + (mk_anti ~c: "rec_binding" n s)) : + 'label_expr) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (fun_def : 'fun_def Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stry + (Gram.Snterm + (Gram.Entry.obj + (labeled_ipatt : + 'labeled_ipatt Gram.Entry.t))); + Gram.Snterm + (Gram.Entry.obj + (fun_def_cont : 'fun_def_cont Gram.Entry.t)) ], + (Gram.Action.mk + (fun ((w, e) : 'fun_def_cont) + (p : 'labeled_ipatt) (_loc : Gram.Loc.t) -> + (Ast.ExFun (_loc, + (Ast.McArr (_loc, p, w, e))) : + 'fun_def)))); + ([ Gram.Stry + (Gram.srules fun_def + [ ([ Gram.Skeyword "("; Gram.Skeyword "type" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (() : 'e__7)))) ]); + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Skeyword ")"; + Gram.Snterm + (Gram.Entry.obj + (fun_def_cont_no_when : + 'fun_def_cont_no_when Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'fun_def_cont_no_when) _ + (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> + (Ast.ExFUN (_loc, i, e) : 'fun_def)))) ]) ])) + ()); + Gram.extend (fun_def_cont : 'fun_def_cont Gram.Entry.t) + ((fun () -> + (None, + [ (None, (Some Camlp4.Sig.Grammar.RightA), + [ ([ Gram.Skeyword "->"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> + (((Ast.ExNil _loc), e) : 'fun_def_cont)))); + ([ Gram.Skeyword "when"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Skeyword "->"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (w : 'expr) _ + (_loc : Gram.Loc.t) -> + ((w, e) : 'fun_def_cont)))); + ([ Gram.Stry + (Gram.Snterm + (Gram.Entry.obj + (labeled_ipatt : + 'labeled_ipatt Gram.Entry.t))); + Gram.Sself ], + (Gram.Action.mk + (fun ((w, e) : 'fun_def_cont) + (p : 'labeled_ipatt) (_loc : Gram.Loc.t) -> + (((Ast.ExNil _loc), + (Ast.ExFun (_loc, + (Ast.McArr (_loc, p, w, e))))) : + 'fun_def_cont)))); + ([ Gram.Stry + (Gram.srules fun_def_cont + [ ([ Gram.Skeyword "("; Gram.Skeyword "type" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (() : 'e__8)))) ]); + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Skeyword ")"; + Gram.Snterm + (Gram.Entry.obj + (fun_def_cont_no_when : + 'fun_def_cont_no_when Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'fun_def_cont_no_when) _ + (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> + (((Ast.ExNil _loc), (Ast.ExFUN (_loc, i, e))) : + 'fun_def_cont)))) ]) ])) + ()); + Gram.extend + (fun_def_cont_no_when : 'fun_def_cont_no_when Gram.Entry.t) + ((fun () -> + (None, + [ (None, (Some Camlp4.Sig.Grammar.RightA), + [ ([ Gram.Skeyword "->"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> + (e : 'fun_def_cont_no_when)))); + ([ Gram.Stry + (Gram.Snterm + (Gram.Entry.obj + (labeled_ipatt : + 'labeled_ipatt Gram.Entry.t))); + Gram.Snterm + (Gram.Entry.obj + (fun_def_cont : 'fun_def_cont Gram.Entry.t)) ], + (Gram.Action.mk + (fun ((w, e) : 'fun_def_cont) + (p : 'labeled_ipatt) (_loc : Gram.Loc.t) -> + (Ast.ExFun (_loc, + (Ast.McArr (_loc, p, w, e))) : + 'fun_def_cont_no_when)))); + ([ Gram.Stry + (Gram.srules fun_def_cont_no_when + [ ([ Gram.Skeyword "("; Gram.Skeyword "type" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (() : 'e__9)))) ]); + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Skeyword ")"; Gram.Sself ], + (Gram.Action.mk + (fun (e : 'fun_def_cont_no_when) _ + (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> + (Ast.ExFUN (_loc, i, e) : + 'fun_def_cont_no_when)))) ]) ])) + ()); + Gram.extend (patt : 'patt Gram.Entry.t) + ((fun () -> + (None, + [ ((Some "|"), (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Sself; Gram.Skeyword "|"; Gram.Sself ], + (Gram.Action.mk + (fun (p2 : 'patt) _ (p1 : 'patt) + (_loc : Gram.Loc.t) -> + (Ast.PaOrp (_loc, p1, p2) : 'patt)))) ]); + ((Some ".."), (Some Camlp4.Sig.Grammar.NonA), + [ ([ Gram.Sself; Gram.Skeyword ".."; Gram.Sself ], + (Gram.Action.mk + (fun (p2 : 'patt) _ (p1 : 'patt) + (_loc : Gram.Loc.t) -> + (Ast.PaRng (_loc, p1, p2) : 'patt)))) ]); + ((Some "apply"), (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Skeyword "lazy"; Gram.Sself ], + (Gram.Action.mk + (fun (p : 'patt) _ (_loc : Gram.Loc.t) -> + (Ast.PaLaz (_loc, p) : 'patt)))); + ([ Gram.Sself; Gram.Sself ], + (Gram.Action.mk + (fun (p2 : 'patt) (p1 : 'patt) + (_loc : Gram.Loc.t) -> + (Ast.PaApp (_loc, p1, p2) : 'patt)))) ]); + ((Some "simple"), None, + [ ([ Gram.Skeyword "?"; Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj + (patt_tcon : 'patt_tcon Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (e : 'expr) _ (p : 'patt_tcon) _ _ + (_loc : Gram.Loc.t) -> + (Ast.PaOlbi (_loc, "", p, e) : 'patt)))); + ([ Gram.Skeyword "?"; Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj + (patt_tcon : 'patt_tcon Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (p : 'patt_tcon) _ _ (_loc : Gram.Loc.t) + -> (Ast.PaOlb (_loc, "", p) : 'patt)))); + ([ Gram.Skeyword "?"; + Gram.Stoken + (((function + | ANTIQUOT (("" | "lid"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"lid\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "lid" as n)), i) -> + (Ast.PaOlb (_loc, (mk_anti n i), + (Ast.PaNil _loc)) : + 'patt) + | _ -> assert false))); + ([ Gram.Skeyword "?"; + Gram.Stoken + (((function | LIDENT _ -> true | _ -> false), + "LIDENT _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LIDENT i -> + (Ast.PaOlb (_loc, i, (Ast.PaNil _loc)) : + 'patt) + | _ -> assert false))); + ([ Gram.Skeyword "?"; + Gram.Stoken + (((function + | ANTIQUOT (("" | "lid"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"lid\"), _)")); + Gram.Skeyword ":"; Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj + (patt_tcon : 'patt_tcon Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (eq_expr : 'eq_expr Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (f : 'eq_expr) (p : 'patt_tcon) _ _ + (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "lid" as n)), i) -> + (f (mk_anti n i) p : 'patt) + | _ -> assert false))); + ([ Gram.Stoken + (((function | OPTLABEL _ -> true | _ -> false), + "OPTLABEL _")); + Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj + (patt_tcon : 'patt_tcon Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (eq_expr : 'eq_expr Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (f : 'eq_expr) (p : 'patt_tcon) _ + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | OPTLABEL i -> (f i p : 'patt) + | _ -> assert false))); + ([ Gram.Skeyword "~"; + Gram.Stoken + (((function | LIDENT _ -> true | _ -> false), + "LIDENT _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LIDENT i -> + (Ast.PaLab (_loc, i, (Ast.PaNil _loc)) : + 'patt) + | _ -> assert false))); + ([ Gram.Skeyword "~"; + Gram.Stoken + (((function + | ANTIQUOT (("" | "lid"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"lid\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "lid" as n)), i) -> + (Ast.PaLab (_loc, (mk_anti n i), + (Ast.PaNil _loc)) : + 'patt) + | _ -> assert false))); + ([ Gram.Skeyword "~"; + Gram.Stoken + (((function + | ANTIQUOT (("" | "lid"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"lid\"), _)")); + Gram.Skeyword ":"; Gram.Sself ], + (Gram.Action.mk + (fun (p : 'patt) _ (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "lid" as n)), i) -> + (Ast.PaLab (_loc, (mk_anti n i), p) : + 'patt) + | _ -> assert false))); + ([ Gram.Stoken + (((function | LABEL _ -> true | _ -> false), + "LABEL _")); + Gram.Sself ], + (Gram.Action.mk + (fun (p : 'patt) (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LABEL i -> (Ast.PaLab (_loc, i, p) : 'patt) + | _ -> assert false))); + ([ Gram.Skeyword "#"; + Gram.Snterm + (Gram.Entry.obj + (type_longident : + 'type_longident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'type_longident) _ (_loc : Gram.Loc.t) + -> (Ast.PaTyp (_loc, i) : 'patt)))); + ([ Gram.Skeyword "`"; + Gram.Snterm + (Gram.Entry.obj + (a_ident : 'a_ident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_ident) _ (_loc : Gram.Loc.t) -> + (Ast.PaVrn (_loc, s) : 'patt)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.patt_tag : + 'patt) + | _ -> assert false))); + ([ Gram.Skeyword "_" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.PaAny _loc : 'patt)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ","; + Gram.Snterm + (Gram.Entry.obj + (comma_patt : 'comma_patt Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (pl : 'comma_patt) _ (p : 'patt) _ + (_loc : Gram.Loc.t) -> + (Ast.PaTup (_loc, (Ast.PaCom (_loc, p, pl))) : + 'patt)))); + ([ Gram.Skeyword "("; Gram.Sself; + Gram.Skeyword "as"; Gram.Sself; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (p2 : 'patt) _ (p : 'patt) _ + (_loc : Gram.Loc.t) -> + (Ast.PaAli (_loc, p, p2) : 'patt)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (t : 'ctyp) _ (p : 'patt) _ + (_loc : Gram.Loc.t) -> + (Ast.PaTyc (_loc, p, t) : 'patt)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (p : 'patt) _ (_loc : Gram.Loc.t) -> + (p : 'patt)))); + ([ Gram.Skeyword "("; Gram.Skeyword "module"; + Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (package_type : 'package_type Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (pt : 'package_type) _ (m : 'a_UIDENT) _ + _ (_loc : Gram.Loc.t) -> + (Ast.PaTyc (_loc, (Ast.PaMod (_loc, m)), + (Ast.TyPkg (_loc, pt))) : + 'patt)))); + ([ Gram.Skeyword "("; Gram.Skeyword "module"; + Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (m : 'a_UIDENT) _ _ (_loc : Gram.Loc.t) + -> (Ast.PaMod (_loc, m) : 'patt)))); + ([ Gram.Skeyword "("; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (Ast.PaId (_loc, (Ast.IdUid (_loc, "()"))) : + 'patt)))); + ([ Gram.Skeyword "{"; + Gram.Snterm + (Gram.Entry.obj + (label_patt_list : + 'label_patt_list Gram.Entry.t)); + Gram.Skeyword "}" ], + (Gram.Action.mk + (fun _ (pl : 'label_patt_list) _ + (_loc : Gram.Loc.t) -> + (Ast.PaRec (_loc, pl) : 'patt)))); + ([ Gram.Skeyword "[|"; + Gram.Snterm + (Gram.Entry.obj + (sem_patt : 'sem_patt Gram.Entry.t)); + Gram.Skeyword "|]" ], + (Gram.Action.mk + (fun _ (pl : 'sem_patt) _ (_loc : Gram.Loc.t) -> + (Ast.PaArr (_loc, pl) : 'patt)))); + ([ Gram.Skeyword "[|"; Gram.Skeyword "|]" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (Ast.PaArr (_loc, (Ast.PaNil _loc)) : 'patt)))); + ([ Gram.Skeyword "["; + Gram.Snterm + (Gram.Entry.obj + (sem_patt_for_list : + 'sem_patt_for_list Gram.Entry.t)); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (mk_list : 'sem_patt_for_list) _ + (_loc : Gram.Loc.t) -> + (mk_list + (Ast.PaId (_loc, (Ast.IdUid (_loc, "[]")))) : + 'patt)))); + ([ Gram.Skeyword "["; + Gram.Snterm + (Gram.Entry.obj + (sem_patt_for_list : + 'sem_patt_for_list Gram.Entry.t)); + Gram.Skeyword "::"; Gram.Sself; Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (last : 'patt) _ + (mk_list : 'sem_patt_for_list) _ + (_loc : Gram.Loc.t) -> (mk_list last : 'patt)))); + ([ Gram.Skeyword "["; Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (Ast.PaId (_loc, (Ast.IdUid (_loc, "[]"))) : + 'patt)))); + ([ Gram.Skeyword "-"; + Gram.Snterm + (Gram.Entry.obj + (a_FLOAT : 'a_FLOAT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_FLOAT) _ (_loc : Gram.Loc.t) -> + (Ast.PaFlo (_loc, (neg_string s)) : 'patt)))); + ([ Gram.Skeyword "-"; + Gram.Snterm + (Gram.Entry.obj + (a_NATIVEINT : 'a_NATIVEINT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_NATIVEINT) _ (_loc : Gram.Loc.t) -> + (Ast.PaNativeInt (_loc, (neg_string s)) : + 'patt)))); + ([ Gram.Skeyword "-"; + Gram.Snterm + (Gram.Entry.obj + (a_INT64 : 'a_INT64 Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_INT64) _ (_loc : Gram.Loc.t) -> + (Ast.PaInt64 (_loc, (neg_string s)) : 'patt)))); + ([ Gram.Skeyword "-"; + Gram.Snterm + (Gram.Entry.obj + (a_INT32 : 'a_INT32 Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_INT32) _ (_loc : Gram.Loc.t) -> + (Ast.PaInt32 (_loc, (neg_string s)) : 'patt)))); + ([ Gram.Skeyword "-"; + Gram.Snterm + (Gram.Entry.obj (a_INT : 'a_INT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_INT) _ (_loc : Gram.Loc.t) -> + (Ast.PaInt (_loc, (neg_string s)) : 'patt)))); + ([ Gram.Snterm + (Gram.Entry.obj (a_CHAR : 'a_CHAR Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_CHAR) (_loc : Gram.Loc.t) -> + (Ast.PaChr (_loc, s) : 'patt)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_STRING : 'a_STRING Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_STRING) (_loc : Gram.Loc.t) -> + (Ast.PaStr (_loc, s) : 'patt)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_FLOAT : 'a_FLOAT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_FLOAT) (_loc : Gram.Loc.t) -> + (Ast.PaFlo (_loc, s) : 'patt)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_NATIVEINT : 'a_NATIVEINT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_NATIVEINT) (_loc : Gram.Loc.t) -> + (Ast.PaNativeInt (_loc, s) : 'patt)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_INT64 : 'a_INT64 Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_INT64) (_loc : Gram.Loc.t) -> + (Ast.PaInt64 (_loc, s) : 'patt)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_INT32 : 'a_INT32 Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_INT32) (_loc : Gram.Loc.t) -> + (Ast.PaInt32 (_loc, s) : 'patt)))); + ([ Gram.Snterm + (Gram.Entry.obj (a_INT : 'a_INT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_INT) (_loc : Gram.Loc.t) -> + (Ast.PaInt (_loc, s) : 'patt)))); + ([ Gram.Snterm + (Gram.Entry.obj (ident : 'ident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'ident) (_loc : Gram.Loc.t) -> + (Ast.PaId (_loc, i) : 'patt)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("`bool", _) -> true + | _ -> false), + "ANTIQUOT (\"`bool\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("`bool" as n)), s) -> + (Ast.PaId (_loc, + (Ast.IdAnt (_loc, (mk_anti n s)))) : + 'patt) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("tup", _) -> true + | _ -> false), + "ANTIQUOT (\"tup\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("tup" as n)), s) -> + (Ast.PaTup (_loc, + (Ast.PaAnt (_loc, + (mk_anti ~c: "patt" n s)))) : + 'patt) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "pat" | "anti"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"pat\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "pat" | "anti" as n)), s) + -> + (Ast.PaAnt (_loc, + (mk_anti ~c: "patt" n s)) : + 'patt) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (comma_patt : 'comma_patt Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p : 'patt) (_loc : Gram.Loc.t) -> + (p : 'comma_patt)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.PaAnt (_loc, + (mk_anti ~c: "patt," n s)) : + 'comma_patt) + | _ -> assert false))); + ([ Gram.Sself; Gram.Skeyword ","; Gram.Sself ], + (Gram.Action.mk + (fun (p2 : 'comma_patt) _ (p1 : 'comma_patt) + (_loc : Gram.Loc.t) -> + (Ast.PaCom (_loc, p1, p2) : 'comma_patt)))) ]) ])) + ()); + Gram.extend (sem_patt : 'sem_patt Gram.Entry.t) + ((fun () -> + (None, + [ (None, (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p : 'patt) (_loc : Gram.Loc.t) -> + (p : 'sem_patt)))); + ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); + Gram.Skeyword ";" ], + (Gram.Action.mk + (fun _ (p : 'patt) (_loc : Gram.Loc.t) -> + (p : 'sem_patt)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.PaAnt (_loc, + (mk_anti ~c: "patt;" n s)) : + 'sem_patt) + | _ -> assert false))); + ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Sself ], + (Gram.Action.mk + (fun (p2 : 'sem_patt) _ (p1 : 'patt) + (_loc : Gram.Loc.t) -> + (Ast.PaSem (_loc, p1, p2) : 'sem_patt)))) ]) ])) + ()); + Gram.extend + (sem_patt_for_list : 'sem_patt_for_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p : 'patt) (_loc : Gram.Loc.t) -> + (fun acc -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdUid (_loc, "::")))), + p)), + acc) : + 'sem_patt_for_list)))); + ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); + Gram.Skeyword ";" ], + (Gram.Action.mk + (fun _ (p : 'patt) (_loc : Gram.Loc.t) -> + (fun acc -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdUid (_loc, "::")))), + p)), + acc) : + 'sem_patt_for_list)))); + ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Sself ], + (Gram.Action.mk + (fun (pl : 'sem_patt_for_list) _ (p : 'patt) + (_loc : Gram.Loc.t) -> + (fun acc -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdUid (_loc, "::")))), + p)), + (pl acc)) : + 'sem_patt_for_list)))) ]) ])) + ()); + Gram.extend (label_patt_list : 'label_patt_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (label_patt : 'label_patt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p1 : 'label_patt) (_loc : Gram.Loc.t) -> + (p1 : 'label_patt_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (label_patt : 'label_patt Gram.Entry.t)); + Gram.Skeyword ";" ], + (Gram.Action.mk + (fun _ (p1 : 'label_patt) (_loc : Gram.Loc.t) -> + (p1 : 'label_patt_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (label_patt : 'label_patt Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Skeyword "_"; + Gram.Skeyword ";" ], + (Gram.Action.mk + (fun _ _ _ (p1 : 'label_patt) + (_loc : Gram.Loc.t) -> + (Ast.PaSem (_loc, p1, (Ast.PaAny _loc)) : + 'label_patt_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (label_patt : 'label_patt Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Skeyword "_" ], + (Gram.Action.mk + (fun _ _ (p1 : 'label_patt) (_loc : Gram.Loc.t) + -> + (Ast.PaSem (_loc, p1, (Ast.PaAny _loc)) : + 'label_patt_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (label_patt : 'label_patt Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Sself ], + (Gram.Action.mk + (fun (p2 : 'label_patt_list) _ + (p1 : 'label_patt) (_loc : Gram.Loc.t) -> + (Ast.PaSem (_loc, p1, p2) : 'label_patt_list)))) ]) ])) + ()); + Gram.extend (label_patt : 'label_patt Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (label_longident : + 'label_longident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'label_longident) (_loc : Gram.Loc.t) + -> + (Ast.PaEq (_loc, i, + (Ast.PaId (_loc, + (Ast.IdLid (_loc, (lid_of_ident i)))))) : + 'label_patt)))); + ([ Gram.Snterm + (Gram.Entry.obj + (label_longident : + 'label_longident Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p : 'patt) _ (i : 'label_longident) + (_loc : Gram.Loc.t) -> + (Ast.PaEq (_loc, i, p) : 'label_patt)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.PaAnt (_loc, + (mk_anti ~c: "patt;" n s)) : + 'label_patt) + | _ -> assert false))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.patt_tag : + 'label_patt) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "pat" | "anti"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"pat\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "pat" | "anti" as n)), s) + -> + (Ast.PaAnt (_loc, + (mk_anti ~c: "patt" n s)) : + 'label_patt) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (ipatt : 'ipatt Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "_" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.PaAny _loc : 'ipatt)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_LIDENT) (_loc : Gram.Loc.t) -> + (Ast.PaId (_loc, (Ast.IdLid (_loc, s))) : + 'ipatt)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ","; + Gram.Snterm + (Gram.Entry.obj + (comma_ipatt : 'comma_ipatt Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (pl : 'comma_ipatt) _ (p : 'ipatt) _ + (_loc : Gram.Loc.t) -> + (Ast.PaTup (_loc, (Ast.PaCom (_loc, p, pl))) : + 'ipatt)))); + ([ Gram.Skeyword "("; Gram.Sself; + Gram.Skeyword "as"; Gram.Sself; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (p2 : 'ipatt) _ (p : 'ipatt) _ + (_loc : Gram.Loc.t) -> + (Ast.PaAli (_loc, p, p2) : 'ipatt)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (t : 'ctyp) _ (p : 'ipatt) _ + (_loc : Gram.Loc.t) -> + (Ast.PaTyc (_loc, p, t) : 'ipatt)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (p : 'ipatt) _ (_loc : Gram.Loc.t) -> + (p : 'ipatt)))); + ([ Gram.Skeyword "("; Gram.Skeyword "module"; + Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (package_type : 'package_type Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (pt : 'package_type) _ (m : 'a_UIDENT) _ + _ (_loc : Gram.Loc.t) -> + (Ast.PaTyc (_loc, (Ast.PaMod (_loc, m)), + (Ast.TyPkg (_loc, pt))) : + 'ipatt)))); + ([ Gram.Skeyword "("; Gram.Skeyword "module"; + Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (m : 'a_UIDENT) _ _ (_loc : Gram.Loc.t) + -> (Ast.PaMod (_loc, m) : 'ipatt)))); + ([ Gram.Skeyword "("; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (Ast.PaId (_loc, (Ast.IdUid (_loc, "()"))) : + 'ipatt)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.patt_tag : + 'ipatt) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("tup", _) -> true + | _ -> false), + "ANTIQUOT (\"tup\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("tup" as n)), s) -> + (Ast.PaTup (_loc, + (Ast.PaAnt (_loc, + (mk_anti ~c: "patt" n s)))) : + 'ipatt) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "pat" | "anti"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"pat\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "pat" | "anti" as n)), s) + -> + (Ast.PaAnt (_loc, + (mk_anti ~c: "patt" n s)) : + 'ipatt) + | _ -> assert false))); + ([ Gram.Skeyword "{"; + Gram.Snterm + (Gram.Entry.obj + (label_ipatt_list : + 'label_ipatt_list Gram.Entry.t)); + Gram.Skeyword "}" ], + (Gram.Action.mk + (fun _ (pl : 'label_ipatt_list) _ + (_loc : Gram.Loc.t) -> + (Ast.PaRec (_loc, pl) : 'ipatt)))) ]) ])) + ()); + Gram.extend (labeled_ipatt : 'labeled_ipatt Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (ipatt : 'ipatt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p : 'ipatt) (_loc : Gram.Loc.t) -> + (p : 'labeled_ipatt)))) ]) ])) + ()); + Gram.extend (comma_ipatt : 'comma_ipatt Gram.Entry.t) + ((fun () -> + (None, + [ (None, (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Snterm + (Gram.Entry.obj (ipatt : 'ipatt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p : 'ipatt) (_loc : Gram.Loc.t) -> + (p : 'comma_ipatt)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.PaAnt (_loc, + (mk_anti ~c: "patt," n s)) : + 'comma_ipatt) + | _ -> assert false))); + ([ Gram.Sself; Gram.Skeyword ","; Gram.Sself ], + (Gram.Action.mk + (fun (p2 : 'comma_ipatt) _ (p1 : 'comma_ipatt) + (_loc : Gram.Loc.t) -> + (Ast.PaCom (_loc, p1, p2) : 'comma_ipatt)))) ]) ])) + ()); + Gram.extend (label_ipatt_list : 'label_ipatt_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (label_ipatt : 'label_ipatt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p1 : 'label_ipatt) (_loc : Gram.Loc.t) -> + (p1 : 'label_ipatt_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (label_ipatt : 'label_ipatt Gram.Entry.t)); + Gram.Skeyword ";" ], + (Gram.Action.mk + (fun _ (p1 : 'label_ipatt) (_loc : Gram.Loc.t) + -> (p1 : 'label_ipatt_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (label_ipatt : 'label_ipatt Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Sself ], + (Gram.Action.mk + (fun (p2 : 'label_ipatt_list) _ + (p1 : 'label_ipatt) (_loc : Gram.Loc.t) -> + (Ast.PaSem (_loc, p1, p2) : + 'label_ipatt_list)))) ]) ])) + ()); + Gram.extend (label_ipatt : 'label_ipatt Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (label_longident : + 'label_longident Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (ipatt : 'ipatt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p : 'ipatt) _ (i : 'label_longident) + (_loc : Gram.Loc.t) -> + (Ast.PaEq (_loc, i, p) : 'label_ipatt)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.patt_tag : + 'label_ipatt) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.PaAnt (_loc, + (mk_anti ~c: "patt;" n s)) : + 'label_ipatt) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "pat" | "anti"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"pat\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "pat" | "anti" as n)), s) + -> + (Ast.PaAnt (_loc, + (mk_anti ~c: "patt" n s)) : + 'label_ipatt) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (type_declaration : 'type_declaration Gram.Entry.t) + ((fun () -> + (None, + [ (None, (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Snterm + (Gram.Entry.obj + (type_ident_and_parameters : + 'type_ident_and_parameters Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_eq_ctyp : 'opt_eq_ctyp Gram.Entry.t)); + Gram.Slist0 + (Gram.Snterm + (Gram.Entry.obj + (constrain : 'constrain Gram.Entry.t))) ], + (Gram.Action.mk + (fun (cl : 'constrain list) (tk : 'opt_eq_ctyp) + ((n, tpl) : 'type_ident_and_parameters) + (_loc : Gram.Loc.t) -> + (Ast.TyDcl (_loc, n, tpl, tk, cl) : + 'type_declaration)))); + ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'type_declaration) _ + (t1 : 'type_declaration) (_loc : Gram.Loc.t) + -> + (Ast.TyAnd (_loc, t1, t2) : + 'type_declaration)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.ctyp_tag : + 'type_declaration) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctypand" n s)) : + 'type_declaration) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "typ" | "anti"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"typ\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "typ" | "anti" as n)), s) + -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp" n s)) : + 'type_declaration) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (constrain : 'constrain Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "constraint"; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t2 : 'ctyp) _ (t1 : 'ctyp) _ + (_loc : Gram.Loc.t) -> + ((t1, t2) : 'constrain)))) ]) ])) + ()); + Gram.extend (opt_eq_ctyp : 'opt_eq_ctyp Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.TyNil _loc : 'opt_eq_ctyp)))); + ([ Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (type_kind : 'type_kind Gram.Entry.t)) ], + (Gram.Action.mk + (fun (tk : 'type_kind) _ (_loc : Gram.Loc.t) -> + (tk : 'opt_eq_ctyp)))) ]) ])) + ()); + Gram.extend (type_kind : 'type_kind Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'ctyp) (_loc : Gram.Loc.t) -> + (t : 'type_kind)))) ]) ])) + ()); + Gram.extend + (type_ident_and_parameters : + 'type_ident_and_parameters Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Slist0 + (Gram.Snterm + (Gram.Entry.obj + (type_parameter : + 'type_parameter Gram.Entry.t))) ], + (Gram.Action.mk + (fun (tpl : 'type_parameter list) + (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> + ((i, tpl) : 'type_ident_and_parameters)))) ]) ])) + ()); + Gram.extend + (type_longident_and_parameters : + 'type_longident_and_parameters Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (type_longident : + 'type_longident Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (type_parameters : + 'type_parameters Gram.Entry.t)) ], + (Gram.Action.mk + (fun (tpl : 'type_parameters) + (i : 'type_longident) (_loc : Gram.Loc.t) -> + (tpl (Ast.TyId (_loc, i)) : + 'type_longident_and_parameters)))) ]) ])) + ()); + Gram.extend (type_parameters : 'type_parameters Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (fun t -> t : 'type_parameters)))); + ([ Gram.Snterm + (Gram.Entry.obj + (type_parameter : + 'type_parameter Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'type_parameter) (_loc : Gram.Loc.t) + -> + (fun acc -> Ast.TyApp (_loc, acc, t) : + 'type_parameters)))); + ([ Gram.Snterm + (Gram.Entry.obj + (type_parameter : + 'type_parameter Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'type_parameters) + (t1 : 'type_parameter) (_loc : Gram.Loc.t) -> + (fun acc -> t2 (Ast.TyApp (_loc, acc, t1)) : + 'type_parameters)))) ]) ])) + ()); + Gram.extend (type_parameter : 'type_parameter Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "-"; Gram.Skeyword "'"; + Gram.Snterm + (Gram.Entry.obj + (a_ident : 'a_ident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_ident) _ _ (_loc : Gram.Loc.t) -> + (Ast.TyQuM (_loc, i) : 'type_parameter)))); + ([ Gram.Skeyword "+"; Gram.Skeyword "'"; + Gram.Snterm + (Gram.Entry.obj + (a_ident : 'a_ident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_ident) _ _ (_loc : Gram.Loc.t) -> + (Ast.TyQuP (_loc, i) : 'type_parameter)))); + ([ Gram.Skeyword "'"; + Gram.Snterm + (Gram.Entry.obj + (a_ident : 'a_ident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_ident) _ (_loc : Gram.Loc.t) -> + (Ast.TyQuo (_loc, i) : 'type_parameter)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.ctyp_tag : + 'type_parameter) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "typ" | "anti"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"typ\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "typ" | "anti" as n)), s) + -> + (Ast.TyAnt (_loc, (mk_anti n s)) : + 'type_parameter) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (ctyp : 'ctyp Gram.Entry.t) + ((fun () -> + (None, + [ ((Some "=="), (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Sself; Gram.Skeyword "=="; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'ctyp) _ (t1 : 'ctyp) + (_loc : Gram.Loc.t) -> + (Ast.TyMan (_loc, t1, t2) : 'ctyp)))) ]); + ((Some "private"), (Some Camlp4.Sig.Grammar.NonA), + [ ([ Gram.Skeyword "private"; + Gram.Snterml + ((Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)), + "alias") ], + (Gram.Action.mk + (fun (t : 'ctyp) _ (_loc : Gram.Loc.t) -> + (Ast.TyPrv (_loc, t) : 'ctyp)))) ]); + ((Some "alias"), (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Sself; Gram.Skeyword "as"; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'ctyp) _ (t1 : 'ctyp) + (_loc : Gram.Loc.t) -> + (Ast.TyAli (_loc, t1, t2) : 'ctyp)))) ]); + ((Some "forall"), (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Skeyword "!"; + Gram.Snterm + (Gram.Entry.obj + (typevars : 'typevars Gram.Entry.t)); + Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'ctyp) _ (t1 : 'typevars) _ + (_loc : Gram.Loc.t) -> + (Ast.TyPol (_loc, t1, t2) : 'ctyp)))) ]); + ((Some "arrow"), (Some Camlp4.Sig.Grammar.RightA), + [ ([ Gram.Sself; Gram.Skeyword "->"; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'ctyp) _ (t1 : 'ctyp) + (_loc : Gram.Loc.t) -> + (Ast.TyArr (_loc, t1, t2) : 'ctyp)))) ]); + ((Some "label"), (Some Camlp4.Sig.Grammar.NonA), + [ ([ Gram.Snterm + (Gram.Entry.obj + (a_OPTLABEL : 'a_OPTLABEL Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (t : 'ctyp) (i : 'a_OPTLABEL) + (_loc : Gram.Loc.t) -> + (Ast.TyOlb (_loc, i, t) : 'ctyp)))); + ([ Gram.Skeyword "?"; + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Skeyword ":"; Gram.Sself ], + (Gram.Action.mk + (fun (t : 'ctyp) _ (i : 'a_LIDENT) _ + (_loc : Gram.Loc.t) -> + (Ast.TyOlb (_loc, i, t) : 'ctyp)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_LABEL : 'a_LABEL Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (t : 'ctyp) (i : 'a_LABEL) + (_loc : Gram.Loc.t) -> + (Ast.TyLab (_loc, i, t) : 'ctyp)))); + ([ Gram.Skeyword "~"; + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Skeyword ":"; Gram.Sself ], + (Gram.Action.mk + (fun (t : 'ctyp) _ (i : 'a_LIDENT) _ + (_loc : Gram.Loc.t) -> + (Ast.TyLab (_loc, i, t) : 'ctyp)))) ]); + ((Some "apply"), (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Sself; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'ctyp) (t1 : 'ctyp) + (_loc : Gram.Loc.t) -> + (let t = Ast.TyApp (_loc, t1, t2) + in + try Ast.TyId (_loc, (Ast.ident_of_ctyp t)) + with | Invalid_argument _ -> t : + 'ctyp)))) ]); + ((Some "."), (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Sself; Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'ctyp) _ (t1 : 'ctyp) + (_loc : Gram.Loc.t) -> + (try + Ast.TyId (_loc, + (Ast.IdAcc (_loc, + (Ast.ident_of_ctyp t1), + (Ast.ident_of_ctyp t2)))) + with + | Invalid_argument s -> + raise (Stream.Error s) : + 'ctyp)))) ]); + ((Some "simple"), None, + [ ([ Gram.Skeyword "("; Gram.Skeyword "module"; + Gram.Snterm + (Gram.Entry.obj + (package_type : 'package_type Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (p : 'package_type) _ _ + (_loc : Gram.Loc.t) -> + (Ast.TyPkg (_loc, p) : 'ctyp)))); + ([ Gram.Skeyword "<"; + Gram.Snterm + (Gram.Entry.obj + (opt_meth_list : + 'opt_meth_list Gram.Entry.t)); + Gram.Skeyword ">" ], + (Gram.Action.mk + (fun _ (t : 'opt_meth_list) _ + (_loc : Gram.Loc.t) -> (t : 'ctyp)))); + ([ Gram.Skeyword "#"; + Gram.Snterm + (Gram.Entry.obj + (class_longident : + 'class_longident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'class_longident) _ + (_loc : Gram.Loc.t) -> + (Ast.TyCls (_loc, i) : 'ctyp)))); + ([ Gram.Skeyword "{"; + Gram.Snterm + (Gram.Entry.obj + (label_declaration_list : + 'label_declaration_list Gram.Entry.t)); + Gram.Skeyword "}" ], + (Gram.Action.mk + (fun _ (t : 'label_declaration_list) _ + (_loc : Gram.Loc.t) -> + (Ast.TyRec (_loc, t) : 'ctyp)))); + ([ Gram.Skeyword "[<"; + Gram.Snterm + (Gram.Entry.obj + (row_field : 'row_field Gram.Entry.t)); + Gram.Skeyword ">"; + Gram.Snterm + (Gram.Entry.obj + (name_tags : 'name_tags Gram.Entry.t)); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (ntl : 'name_tags) _ (rfl : 'row_field) _ + (_loc : Gram.Loc.t) -> + (Ast.TyVrnInfSup (_loc, rfl, ntl) : 'ctyp)))); + ([ Gram.Skeyword "[<"; + Gram.Snterm + (Gram.Entry.obj + (row_field : 'row_field Gram.Entry.t)); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (rfl : 'row_field) _ (_loc : Gram.Loc.t) + -> (Ast.TyVrnInf (_loc, rfl) : 'ctyp)))); + ([ Gram.Skeyword "["; Gram.Skeyword "<"; + Gram.Snterm + (Gram.Entry.obj + (row_field : 'row_field Gram.Entry.t)); + Gram.Skeyword ">"; + Gram.Snterm + (Gram.Entry.obj + (name_tags : 'name_tags Gram.Entry.t)); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (ntl : 'name_tags) _ (rfl : 'row_field) _ + _ (_loc : Gram.Loc.t) -> + (Ast.TyVrnInfSup (_loc, rfl, ntl) : 'ctyp)))); + ([ Gram.Skeyword "["; Gram.Skeyword "<"; + Gram.Snterm + (Gram.Entry.obj + (row_field : 'row_field Gram.Entry.t)); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (rfl : 'row_field) _ _ + (_loc : Gram.Loc.t) -> + (Ast.TyVrnInf (_loc, rfl) : 'ctyp)))); + ([ Gram.Skeyword "["; Gram.Skeyword ">"; + Gram.Snterm + (Gram.Entry.obj + (row_field : 'row_field Gram.Entry.t)); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (rfl : 'row_field) _ _ + (_loc : Gram.Loc.t) -> + (Ast.TyVrnSup (_loc, rfl) : 'ctyp)))); + ([ Gram.Skeyword "["; Gram.Skeyword ">"; + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ _ _ (_loc : Gram.Loc.t) -> + (Ast.TyVrnSup (_loc, (Ast.TyNil _loc)) : + 'ctyp)))); + ([ Gram.Skeyword "["; Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (row_field : 'row_field Gram.Entry.t)); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (rfl : 'row_field) _ _ + (_loc : Gram.Loc.t) -> + (Ast.TyVrnEq (_loc, rfl) : 'ctyp)))); + ([ Gram.Skeyword "["; + Gram.Snterm + (Gram.Entry.obj + (constructor_declarations : + 'constructor_declarations Gram.Entry.t)); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (t : 'constructor_declarations) _ + (_loc : Gram.Loc.t) -> + (Ast.TySum (_loc, t) : 'ctyp)))); + ([ Gram.Skeyword "["; Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (Ast.TySum (_loc, (Ast.TyNil _loc)) : 'ctyp)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (t : 'ctyp) _ (_loc : Gram.Loc.t) -> + (t : 'ctyp)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword "*"; + Gram.Snterm + (Gram.Entry.obj + (star_ctyp : 'star_ctyp Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (tl : 'star_ctyp) _ (t : 'ctyp) _ + (_loc : Gram.Loc.t) -> + (Ast.TyTup (_loc, (Ast.TySta (_loc, t, tl))) : + 'ctyp)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_UIDENT) (_loc : Gram.Loc.t) -> + (Ast.TyId (_loc, (Ast.IdUid (_loc, i))) : + 'ctyp)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> + (Ast.TyId (_loc, (Ast.IdLid (_loc, i))) : + 'ctyp)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.ctyp_tag : + 'ctyp) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("id", _) -> true + | _ -> false), + "ANTIQUOT (\"id\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("id" as n)), s) -> + (Ast.TyId (_loc, + (Ast.IdAnt (_loc, + (mk_anti ~c: "ident" n s)))) : + 'ctyp) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("tup", _) -> true + | _ -> false), + "ANTIQUOT (\"tup\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("tup" as n)), s) -> + (Ast.TyTup (_loc, + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp" n s)))) : + 'ctyp) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "typ" | "anti"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"typ\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "typ" | "anti" as n)), s) + -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp" n s)) : + 'ctyp) + | _ -> assert false))); + ([ Gram.Skeyword "_" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.TyAny _loc : 'ctyp)))); + ([ Gram.Skeyword "'"; + Gram.Snterm + (Gram.Entry.obj + (a_ident : 'a_ident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_ident) _ (_loc : Gram.Loc.t) -> + (Ast.TyQuo (_loc, i) : 'ctyp)))) ]) ])) + ()); + Gram.extend (star_ctyp : 'star_ctyp Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'ctyp) (_loc : Gram.Loc.t) -> + (t : 'star_ctyp)))); + ([ Gram.Sself; Gram.Skeyword "*"; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'star_ctyp) _ (t1 : 'star_ctyp) + (_loc : Gram.Loc.t) -> + (Ast.TySta (_loc, t1, t2) : 'star_ctyp)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp*" n s)) : + 'star_ctyp) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "typ"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"typ\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "typ" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp" n s)) : + 'star_ctyp) + | _ -> assert false))) ]) ])) + ()); + Gram.extend + (constructor_declarations : + 'constructor_declarations Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_UIDENT) (_loc : Gram.Loc.t) -> + (Ast.TyId (_loc, (Ast.IdUid (_loc, s))) : + 'constructor_declarations)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword "of"; + Gram.Snterm + (Gram.Entry.obj + (constructor_arg_list : + 'constructor_arg_list Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'constructor_arg_list) _ + (s : 'a_UIDENT) (_loc : Gram.Loc.t) -> + (Ast.TyOf (_loc, + (Ast.TyId (_loc, (Ast.IdUid (_loc, s)))), + t) : + 'constructor_declarations)))); + ([ Gram.Sself; Gram.Skeyword "|"; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'constructor_declarations) _ + (t1 : 'constructor_declarations) + (_loc : Gram.Loc.t) -> + (Ast.TyOr (_loc, t1, t2) : + 'constructor_declarations)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.ctyp_tag : + 'constructor_declarations) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp|" n s)) : + 'constructor_declarations) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "typ"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"typ\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "typ" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp" n s)) : + 'constructor_declarations) + | _ -> assert false))) ]) ])) + ()); + Gram.extend + (constructor_declaration : + 'constructor_declaration Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'a_UIDENT) (_loc : Gram.Loc.t) -> + (Ast.TyId (_loc, (Ast.IdUid (_loc, s))) : + 'constructor_declaration)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword "of"; + Gram.Snterm + (Gram.Entry.obj + (constructor_arg_list : + 'constructor_arg_list Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'constructor_arg_list) _ + (s : 'a_UIDENT) (_loc : Gram.Loc.t) -> + (Ast.TyOf (_loc, + (Ast.TyId (_loc, (Ast.IdUid (_loc, s)))), + t) : + 'constructor_declaration)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.ctyp_tag : + 'constructor_declaration) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "typ"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"typ\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "typ" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp" n s)) : + 'constructor_declaration) + | _ -> assert false))) ]) ])) + ()); + Gram.extend + (constructor_arg_list : 'constructor_arg_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'ctyp) (_loc : Gram.Loc.t) -> + (t : 'constructor_arg_list)))); + ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'constructor_arg_list) _ + (t1 : 'constructor_arg_list) + (_loc : Gram.Loc.t) -> + (Ast.TyAnd (_loc, t1, t2) : + 'constructor_arg_list)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctypand" n s)) : + 'constructor_arg_list) + | _ -> assert false))) ]) ])) + ()); + Gram.extend + (label_declaration_list : + 'label_declaration_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (label_declaration : + 'label_declaration Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t1 : 'label_declaration) + (_loc : Gram.Loc.t) -> + (t1 : 'label_declaration_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (label_declaration : + 'label_declaration Gram.Entry.t)); + Gram.Skeyword ";" ], + (Gram.Action.mk + (fun _ (t1 : 'label_declaration) + (_loc : Gram.Loc.t) -> + (t1 : 'label_declaration_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (label_declaration : + 'label_declaration Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'label_declaration_list) _ + (t1 : 'label_declaration) (_loc : Gram.Loc.t) + -> + (Ast.TySem (_loc, t1, t2) : + 'label_declaration_list)))) ]) ])) + ()); + Gram.extend + (label_declaration : 'label_declaration Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Skeyword ":"; Gram.Skeyword "mutable"; + Gram.Snterm + (Gram.Entry.obj + (poly_type : 'poly_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'poly_type) _ _ (s : 'a_LIDENT) + (_loc : Gram.Loc.t) -> + (Ast.TyCol (_loc, + (Ast.TyId (_loc, (Ast.IdLid (_loc, s)))), + (Ast.TyMut (_loc, t))) : + 'label_declaration)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (poly_type : 'poly_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'poly_type) _ (s : 'a_LIDENT) + (_loc : Gram.Loc.t) -> + (Ast.TyCol (_loc, + (Ast.TyId (_loc, (Ast.IdLid (_loc, s)))), + t) : + 'label_declaration)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.ctyp_tag : + 'label_declaration) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp;" n s)) : + 'label_declaration) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "typ"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"typ\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "typ" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp" n s)) : + 'label_declaration) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (a_ident : 'a_ident Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_UIDENT) (_loc : Gram.Loc.t) -> + (i : 'a_ident)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> + (i : 'a_ident)))) ]) ])) + ()); + Gram.extend (ident : 'ident Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (j : 'ident) _ (i : 'a_UIDENT) + (_loc : Gram.Loc.t) -> + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, i)), j) : + 'ident)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "id" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")); + Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (i : 'ident) _ (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "id" | "anti" | "list" as n)), s) + -> + (Ast.IdAcc (_loc, + (Ast.IdAnt (_loc, + (mk_anti ~c: "ident" n s))), + i) : + 'ident) + | _ -> assert false))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> + (Ast.IdLid (_loc, i) : 'ident)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_UIDENT) (_loc : Gram.Loc.t) -> + (Ast.IdUid (_loc, i) : 'ident)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "id" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "id" | "anti" | "list" as n)), s) + -> + (Ast.IdAnt (_loc, + (mk_anti ~c: "ident" n s)) : + 'ident) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (module_longident : 'module_longident Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_UIDENT) (_loc : Gram.Loc.t) -> + (Ast.IdUid (_loc, i) : 'module_longident)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (l : 'module_longident) _ (m : 'a_UIDENT) + (_loc : Gram.Loc.t) -> + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, m)), l) : + 'module_longident)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "id" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "id" | "anti" | "list" as n)), s) + -> + (Ast.IdAnt (_loc, + (mk_anti ~c: "ident" n s)) : + 'module_longident) + | _ -> assert false))) ]) ])) + ()); + Gram.extend + (module_longident_with_app : + 'module_longident_with_app Gram.Entry.t) + ((fun () -> + (None, + [ ((Some "apply"), None, + [ ([ Gram.Sself; Gram.Sself ], + (Gram.Action.mk + (fun (j : 'module_longident_with_app) + (i : 'module_longident_with_app) + (_loc : Gram.Loc.t) -> + (Ast.IdApp (_loc, i, j) : + 'module_longident_with_app)))) ]); + ((Some "."), None, + [ ([ Gram.Sself; Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (j : 'module_longident_with_app) _ + (i : 'module_longident_with_app) + (_loc : Gram.Loc.t) -> + (Ast.IdAcc (_loc, i, j) : + 'module_longident_with_app)))) ]); + ((Some "simple"), None, + [ ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (i : 'module_longident_with_app) _ + (_loc : Gram.Loc.t) -> + (i : 'module_longident_with_app)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_UIDENT) (_loc : Gram.Loc.t) -> + (Ast.IdUid (_loc, i) : + 'module_longident_with_app)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "id" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "id" | "anti" | "list" as n)), s) + -> + (Ast.IdAnt (_loc, + (mk_anti ~c: "ident" n s)) : + 'module_longident_with_app) + | _ -> assert false))) ]) ])) + ()); + Gram.extend + (module_longident_dot_lparen : + 'module_longident_dot_lparen Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword "."; Gram.Skeyword "(" ], + (Gram.Action.mk + (fun _ _ (i : 'a_UIDENT) (_loc : Gram.Loc.t) -> + (Ast.IdUid (_loc, i) : + 'module_longident_dot_lparen)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (l : 'module_longident_dot_lparen) _ + (m : 'a_UIDENT) (_loc : Gram.Loc.t) -> + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, m)), l) : + 'module_longident_dot_lparen)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "id" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")); + Gram.Skeyword "."; Gram.Skeyword "(" ], + (Gram.Action.mk + (fun _ _ (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "id" | "anti" | "list" as n)), s) + -> + (Ast.IdAnt (_loc, + (mk_anti ~c: "ident" n s)) : + 'module_longident_dot_lparen) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (type_longident : 'type_longident Gram.Entry.t) + ((fun () -> + (None, + [ ((Some "apply"), None, + [ ([ Gram.Sself; Gram.Sself ], + (Gram.Action.mk + (fun (j : 'type_longident) (i : 'type_longident) + (_loc : Gram.Loc.t) -> + (Ast.IdApp (_loc, i, j) : 'type_longident)))) ]); + ((Some "."), None, + [ ([ Gram.Sself; Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (j : 'type_longident) _ + (i : 'type_longident) (_loc : Gram.Loc.t) -> + (Ast.IdAcc (_loc, i, j) : 'type_longident)))) ]); + ((Some "simple"), None, + [ ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (i : 'type_longident) _ + (_loc : Gram.Loc.t) -> (i : 'type_longident)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_UIDENT) (_loc : Gram.Loc.t) -> + (Ast.IdUid (_loc, i) : 'type_longident)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> + (Ast.IdLid (_loc, i) : 'type_longident)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "id" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "id" | "anti" | "list" as n)), s) + -> + (Ast.IdAnt (_loc, + (mk_anti ~c: "ident" n s)) : + 'type_longident) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (label_longident : 'label_longident Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> + (Ast.IdLid (_loc, i) : 'label_longident)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (l : 'label_longident) _ (m : 'a_UIDENT) + (_loc : Gram.Loc.t) -> + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, m)), l) : + 'label_longident)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "id" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "id" | "anti" | "list" as n)), s) + -> + (Ast.IdAnt (_loc, + (mk_anti ~c: "ident" n s)) : + 'label_longident) + | _ -> assert false))) ]) ])) + ()); + Gram.extend + (class_type_longident : 'class_type_longident Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (type_longident : + 'type_longident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'type_longident) (_loc : Gram.Loc.t) + -> (x : 'class_type_longident)))) ]) ])) + ()); + Gram.extend (val_longident : 'val_longident Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (ident : 'ident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'ident) (_loc : Gram.Loc.t) -> + (x : 'val_longident)))) ]) ])) + ()); + Gram.extend (class_longident : 'class_longident Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (label_longident : + 'label_longident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'label_longident) (_loc : Gram.Loc.t) + -> (x : 'class_longident)))) ]) ])) + ()); + Gram.extend + (class_declaration : 'class_declaration Gram.Entry.t) + ((fun () -> + (None, + [ (None, (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Snterm + (Gram.Entry.obj + (class_info_for_class_expr : + 'class_info_for_class_expr Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (class_fun_binding : + 'class_fun_binding Gram.Entry.t)) ], + (Gram.Action.mk + (fun (ce : 'class_fun_binding) + (ci : 'class_info_for_class_expr) + (_loc : Gram.Loc.t) -> + (Ast.CeEq (_loc, ci, ce) : + 'class_declaration)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.class_expr_tag : + 'class_declaration) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "cdcl" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"cdcl\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "cdcl" | "anti" | "list" as n)), + s) -> + (Ast.CeAnt (_loc, + (mk_anti ~c: "class_expr" n s)) : + 'class_declaration) + | _ -> assert false))); + ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], + (Gram.Action.mk + (fun (c2 : 'class_declaration) _ + (c1 : 'class_declaration) (_loc : Gram.Loc.t) + -> + (Ast.CeAnd (_loc, c1, c2) : + 'class_declaration)))) ]) ])) + ()); + Gram.extend + (class_fun_binding : 'class_fun_binding Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (labeled_ipatt : + 'labeled_ipatt Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (cfb : 'class_fun_binding) + (p : 'labeled_ipatt) (_loc : Gram.Loc.t) -> + (Ast.CeFun (_loc, p, cfb) : + 'class_fun_binding)))); + ([ Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (class_type_plus : + 'class_type_plus Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (class_expr : 'class_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (ce : 'class_expr) _ + (ct : 'class_type_plus) _ (_loc : Gram.Loc.t) + -> + (Ast.CeTyc (_loc, ce, ct) : + 'class_fun_binding)))); + ([ Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (class_expr : 'class_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (ce : 'class_expr) _ (_loc : Gram.Loc.t) -> + (ce : 'class_fun_binding)))) ]) ])) + ()); + Gram.extend + (class_info_for_class_type : + 'class_info_for_class_type Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (opt_virtual : 'opt_virtual Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (class_name_and_param : + 'class_name_and_param Gram.Entry.t)) ], + (Gram.Action.mk + (fun ((i, ot) : 'class_name_and_param) + (mv : 'opt_virtual) (_loc : Gram.Loc.t) -> + (Ast.CtCon (_loc, mv, (Ast.IdLid (_loc, i)), + ot) : + 'class_info_for_class_type)))) ]) ])) + ()); + Gram.extend + (class_info_for_class_expr : + 'class_info_for_class_expr Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (opt_virtual : 'opt_virtual Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (class_name_and_param : + 'class_name_and_param Gram.Entry.t)) ], + (Gram.Action.mk + (fun ((i, ot) : 'class_name_and_param) + (mv : 'opt_virtual) (_loc : Gram.Loc.t) -> + (Ast.CeCon (_loc, mv, (Ast.IdLid (_loc, i)), + ot) : + 'class_info_for_class_expr)))) ]) ])) + ()); + Gram.extend + (class_name_and_param : 'class_name_and_param Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> + ((i, (Ast.TyNil _loc)) : + 'class_name_and_param)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Skeyword "["; + Gram.Snterm + (Gram.Entry.obj + (comma_type_parameter : + 'comma_type_parameter Gram.Entry.t)); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (x : 'comma_type_parameter) _ + (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> + ((i, x) : 'class_name_and_param)))) ]) ])) + ()); + Gram.extend + (comma_type_parameter : 'comma_type_parameter Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (type_parameter : + 'type_parameter Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'type_parameter) (_loc : Gram.Loc.t) + -> (t : 'comma_type_parameter)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp," n s)) : + 'comma_type_parameter) + | _ -> assert false))); + ([ Gram.Sself; Gram.Skeyword ","; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'comma_type_parameter) _ + (t1 : 'comma_type_parameter) + (_loc : Gram.Loc.t) -> + (Ast.TyCom (_loc, t1, t2) : + 'comma_type_parameter)))) ]) ])) + ()); + Gram.extend (opt_comma_ctyp : 'opt_comma_ctyp Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.TyNil _loc : 'opt_comma_ctyp)))); + ([ Gram.Skeyword "["; + Gram.Snterm + (Gram.Entry.obj + (comma_ctyp : 'comma_ctyp Gram.Entry.t)); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (x : 'comma_ctyp) _ (_loc : Gram.Loc.t) + -> (x : 'opt_comma_ctyp)))) ]) ])) + ()); + Gram.extend (comma_ctyp : 'comma_ctyp Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'ctyp) (_loc : Gram.Loc.t) -> + (t : 'comma_ctyp)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp," n s)) : + 'comma_ctyp) + | _ -> assert false))); + ([ Gram.Sself; Gram.Skeyword ","; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'comma_ctyp) _ (t1 : 'comma_ctyp) + (_loc : Gram.Loc.t) -> + (Ast.TyCom (_loc, t1, t2) : 'comma_ctyp)))) ]) ])) + ()); + Gram.extend (class_fun_def : 'class_fun_def Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "->"; + Gram.Snterm + (Gram.Entry.obj + (class_expr : 'class_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (ce : 'class_expr) _ (_loc : Gram.Loc.t) -> + (ce : 'class_fun_def)))); + ([ Gram.Snterm + (Gram.Entry.obj + (labeled_ipatt : + 'labeled_ipatt Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (ce : 'class_fun_def) (p : 'labeled_ipatt) + (_loc : Gram.Loc.t) -> + (Ast.CeFun (_loc, p, ce) : 'class_fun_def)))) ]) ])) + ()); + Gram.extend (class_expr : 'class_expr Gram.Entry.t) + ((fun () -> + (None, + [ ((Some "top"), None, + [ ([ Gram.Skeyword "let"; + Gram.Snterm + (Gram.Entry.obj + (opt_rec : 'opt_rec Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (binding : 'binding Gram.Entry.t)); + Gram.Skeyword "in"; Gram.Sself ], + (Gram.Action.mk + (fun (ce : 'class_expr) _ (bi : 'binding) + (rf : 'opt_rec) _ (_loc : Gram.Loc.t) -> + (Ast.CeLet (_loc, rf, bi, ce) : 'class_expr)))); + ([ Gram.Skeyword "fun"; + Gram.Snterm + (Gram.Entry.obj + (labeled_ipatt : + 'labeled_ipatt Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (class_fun_def : + 'class_fun_def Gram.Entry.t)) ], + (Gram.Action.mk + (fun (ce : 'class_fun_def) (p : 'labeled_ipatt) + _ (_loc : Gram.Loc.t) -> + (Ast.CeFun (_loc, p, ce) : 'class_expr)))) ]); + ((Some "apply"), (Some Camlp4.Sig.Grammar.NonA), + [ ([ Gram.Sself; + Gram.Snterml + ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), + "label") ], + (Gram.Action.mk + (fun (e : 'expr) (ce : 'class_expr) + (_loc : Gram.Loc.t) -> + (Ast.CeApp (_loc, ce, e) : 'class_expr)))) ]); + ((Some "simple"), None, + [ ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (ce : 'class_expr) _ (_loc : Gram.Loc.t) + -> (ce : 'class_expr)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (class_type : 'class_type Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (ct : 'class_type) _ (ce : 'class_expr) _ + (_loc : Gram.Loc.t) -> + (Ast.CeTyc (_loc, ce, ct) : 'class_expr)))); + ([ Gram.Skeyword "object"; + Gram.Snterm + (Gram.Entry.obj + (opt_class_self_patt : + 'opt_class_self_patt Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (class_structure : + 'class_structure Gram.Entry.t)); + Gram.Skeyword "end" ], + (Gram.Action.mk + (fun _ (cst : 'class_structure) + (csp : 'opt_class_self_patt) _ + (_loc : Gram.Loc.t) -> + (Ast.CeStr (_loc, csp, cst) : 'class_expr)))); + ([ Gram.Snterm + (Gram.Entry.obj + (class_longident_and_param : + 'class_longident_and_param Gram.Entry.t)) ], + (Gram.Action.mk + (fun (ce : 'class_longident_and_param) + (_loc : Gram.Loc.t) -> (ce : 'class_expr)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.class_expr_tag : + 'class_expr) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "cexp" | "anti"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"cexp\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "cexp" | "anti" as n)), s) + -> + (Ast.CeAnt (_loc, + (mk_anti ~c: "class_expr" n s)) : + 'class_expr) + | _ -> assert false))) ]) ])) + ()); + Gram.extend + (class_longident_and_param : + 'class_longident_and_param Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (class_longident : + 'class_longident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (ci : 'class_longident) (_loc : Gram.Loc.t) + -> + (Ast.CeCon (_loc, Ast.ViNil, ci, + (Ast.TyNil _loc)) : + 'class_longident_and_param)))); + ([ Gram.Snterm + (Gram.Entry.obj + (class_longident : + 'class_longident Gram.Entry.t)); + Gram.Skeyword "["; + Gram.Snterm + (Gram.Entry.obj + (comma_ctyp : 'comma_ctyp Gram.Entry.t)); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (t : 'comma_ctyp) _ + (ci : 'class_longident) (_loc : Gram.Loc.t) + -> + (Ast.CeCon (_loc, Ast.ViNil, ci, t) : + 'class_longident_and_param)))) ]) ])) + ()); + Gram.extend (class_structure : 'class_structure Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Slist0 + (Gram.srules class_structure + [ ([ Gram.Snterm + (Gram.Entry.obj + (class_str_item : + 'class_str_item Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (cst : 'class_str_item) + (_loc : Gram.Loc.t) -> + (cst : 'e__10)))) ]) ], + (Gram.Action.mk + (fun (l : 'e__10 list) (_loc : Gram.Loc.t) -> + (Ast.crSem_of_list l : 'class_structure)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "cst" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"cst\" | \"anti\" | \"list\"), _)")); + Gram.Snterm + (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (cst : 'class_structure) _ + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "cst" | "anti" | "list" as n)), + s) -> + (Ast.CrSem (_loc, + (Ast.CrAnt (_loc, + (mk_anti ~c: "class_str_item" n s))), + cst) : + 'class_structure) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "cst" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"cst\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "cst" | "anti" | "list" as n)), + s) -> + (Ast.CrAnt (_loc, + (mk_anti ~c: "class_str_item" n s)) : + 'class_structure) + | _ -> assert false))) ]) ])) + ()); + Gram.extend + (opt_class_self_patt : 'opt_class_self_patt Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.PaNil _loc : 'opt_class_self_patt)))); + ([ Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (t : 'ctyp) _ (p : 'patt) _ + (_loc : Gram.Loc.t) -> + (Ast.PaTyc (_loc, p, t) : + 'opt_class_self_patt)))); + ([ Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (p : 'patt) _ (_loc : Gram.Loc.t) -> + (p : 'opt_class_self_patt)))) ]) ])) + ()); + Gram.extend (class_str_item : 'class_str_item Gram.Entry.t) + ((fun () -> + (None, + [ (None, (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Skeyword "initializer"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (se : 'expr) _ (_loc : Gram.Loc.t) -> + (Ast.CrIni (_loc, se) : 'class_str_item)))); + ([ Gram.Snterm + (Gram.Entry.obj + (type_constraint : + 'type_constraint Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t2 : 'ctyp) _ (t1 : 'ctyp) _ + (_loc : Gram.Loc.t) -> + (Ast.CrCtr (_loc, t1, t2) : 'class_str_item)))); + ([ Gram.Snterm + (Gram.Entry.obj + (method_opt_override : + 'method_opt_override Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_private : 'opt_private Gram.Entry.t)); + Gram.Skeyword "virtual"; + Gram.Snterm + (Gram.Entry.obj (label : 'label Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (poly_type : 'poly_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'poly_type) _ (l : 'label) _ + (pf : 'opt_private) + (o : 'method_opt_override) + (_loc : Gram.Loc.t) -> + (if o <> Ast.OvNil + then + raise + (Stream.Error + "override (!) is incompatible with virtual") + else Ast.CrVir (_loc, l, pf, t) : + 'class_str_item)))); + ([ Gram.Snterm + (Gram.Entry.obj + (method_opt_override : + 'method_opt_override Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_private : 'opt_private Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (label : 'label Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_polyt : 'opt_polyt Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (fun_binding : 'fun_binding Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'fun_binding) (topt : 'opt_polyt) + (l : 'label) (pf : 'opt_private) + (o : 'method_opt_override) + (_loc : Gram.Loc.t) -> + (Ast.CrMth (_loc, l, o, pf, e, topt) : + 'class_str_item)))); + ([ Gram.Snterm + (Gram.Entry.obj + (method_opt_override : + 'method_opt_override Gram.Entry.t)); + Gram.Skeyword "virtual"; + Gram.Snterm + (Gram.Entry.obj + (opt_private : 'opt_private Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (label : 'label Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (poly_type : 'poly_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'poly_type) _ (l : 'label) + (pf : 'opt_private) _ + (o : 'method_opt_override) + (_loc : Gram.Loc.t) -> + (if o <> Ast.OvNil + then + raise + (Stream.Error + "override (!) is incompatible with virtual") + else Ast.CrVir (_loc, l, pf, t) : + 'class_str_item)))); + ([ Gram.Snterm + (Gram.Entry.obj + (value_val_opt_override : + 'value_val_opt_override Gram.Entry.t)); + Gram.Skeyword "virtual"; + Gram.Snterm + (Gram.Entry.obj + (opt_mutable : 'opt_mutable Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (label : 'label Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (poly_type : 'poly_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'poly_type) _ (l : 'label) + (mf : 'opt_mutable) _ + (o : 'value_val_opt_override) + (_loc : Gram.Loc.t) -> + (if o <> Ast.OvNil + then + raise + (Stream.Error + "override (!) is incompatible with virtual") + else Ast.CrVvr (_loc, l, mf, t) : + 'class_str_item)))); + ([ Gram.Snterm + (Gram.Entry.obj + (value_val_opt_override : + 'value_val_opt_override Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_mutable : 'opt_mutable Gram.Entry.t)); + Gram.Skeyword "virtual"; + Gram.Snterm + (Gram.Entry.obj (label : 'label Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (poly_type : 'poly_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'poly_type) _ (l : 'label) _ + (mf : 'opt_mutable) + (o : 'value_val_opt_override) + (_loc : Gram.Loc.t) -> + (if o <> Ast.OvNil + then + raise + (Stream.Error + "override (!) is incompatible with virtual") + else Ast.CrVvr (_loc, l, mf, t) : + 'class_str_item)))); + ([ Gram.Snterm + (Gram.Entry.obj + (value_val_opt_override : + 'value_val_opt_override Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_mutable : 'opt_mutable Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (label : 'label Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (cvalue_binding : + 'cvalue_binding Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'cvalue_binding) (lab : 'label) + (mf : 'opt_mutable) + (o : 'value_val_opt_override) + (_loc : Gram.Loc.t) -> + (Ast.CrVal (_loc, lab, o, mf, e) : + 'class_str_item)))); + ([ Gram.Skeyword "inherit"; + Gram.Snterm + (Gram.Entry.obj + (opt_override : 'opt_override Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (class_expr : 'class_expr Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_as_lident : + 'opt_as_lident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (pb : 'opt_as_lident) (ce : 'class_expr) + (o : 'opt_override) _ (_loc : Gram.Loc.t) -> + (Ast.CrInh (_loc, o, ce, pb) : + 'class_str_item)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.class_str_item_tag : + 'class_str_item) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "cst" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"cst\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "cst" | "anti" | "list" as n)), + s) -> + (Ast.CrAnt (_loc, + (mk_anti ~c: "class_str_item" n s)) : + 'class_str_item) + | _ -> assert false))) ]) ])) + ()); + Gram.extend + (method_opt_override : 'method_opt_override Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "method" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.OvNil : 'method_opt_override)))); + ([ Gram.Skeyword "method"; + Gram.Stoken + (((function + | ANTIQUOT (("!" | "override" | "anti"), _) + -> true + | _ -> false), + "ANTIQUOT ((\"!\" | \"override\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("!" | "override" | "anti" as n)), s) + -> + (Ast.OvAnt (mk_anti n s) : + 'method_opt_override) + | _ -> assert false))); + ([ Gram.Skeyword "method"; Gram.Skeyword "!" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (Ast.OvOverride : 'method_opt_override)))) ]) ])) + ()); + Gram.extend + (value_val_opt_override : + 'value_val_opt_override Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (value_val : 'value_val Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.OvNil : 'value_val_opt_override)))); + ([ Gram.Snterm + (Gram.Entry.obj + (value_val : 'value_val Gram.Entry.t)); + Gram.Stoken + (((function + | ANTIQUOT (("!" | "override" | "anti"), _) + -> true + | _ -> false), + "ANTIQUOT ((\"!\" | \"override\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("!" | "override" | "anti" as n)), s) + -> + (Ast.OvAnt (mk_anti n s) : + 'value_val_opt_override) + | _ -> assert false))); + ([ Gram.Snterm + (Gram.Entry.obj + (value_val : 'value_val Gram.Entry.t)); + Gram.Skeyword "!" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (Ast.OvOverride : 'value_val_opt_override)))) ]) ])) + ()); + Gram.extend (opt_as_lident : 'opt_as_lident Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + ("" : 'opt_as_lident)))); + ([ Gram.Skeyword "as"; + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> + (i : 'opt_as_lident)))) ]) ])) + ()); + Gram.extend (opt_polyt : 'opt_polyt Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.TyNil _loc : 'opt_polyt)))); + ([ Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (poly_type : 'poly_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'poly_type) _ (_loc : Gram.Loc.t) -> + (t : 'opt_polyt)))) ]) ])) + ()); + Gram.extend (cvalue_binding : 'cvalue_binding Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword ":>"; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (t : 'ctyp) _ + (_loc : Gram.Loc.t) -> + (Ast.ExCoe (_loc, e, (Ast.TyNil _loc), t) : + 'cvalue_binding)))); + ([ Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (poly_type : 'poly_type Gram.Entry.t)); + Gram.Skeyword ":>"; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (t2 : 'ctyp) _ + (t : 'poly_type) _ (_loc : Gram.Loc.t) -> + (match t with + | Ast.TyPol (_, _, _) -> + raise + (Stream.Error + "unexpected polytype here") + | _ -> Ast.ExCoe (_loc, e, t, t2) : + 'cvalue_binding)))); + ([ Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (poly_type : 'poly_type Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (t : 'poly_type) _ + (_loc : Gram.Loc.t) -> + (Ast.ExTyc (_loc, e, t) : 'cvalue_binding)))); + ([ Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> + (e : 'cvalue_binding)))) ]) ])) + ()); + Gram.extend (label : 'label Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> + (i : 'label)))) ]) ])) + ()); + Gram.extend (class_type : 'class_type Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "object"; + Gram.Snterm + (Gram.Entry.obj + (opt_class_self_type : + 'opt_class_self_type Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (class_signature : + 'class_signature Gram.Entry.t)); + Gram.Skeyword "end" ], + (Gram.Action.mk + (fun _ (csg : 'class_signature) + (cst : 'opt_class_self_type) _ + (_loc : Gram.Loc.t) -> + (Ast.CtSig (_loc, cst, csg) : 'class_type)))); + ([ Gram.Snterm + (Gram.Entry.obj + (class_type_longident_and_param : + 'class_type_longident_and_param Gram. + Entry.t)) ], + (Gram.Action.mk + (fun (ct : 'class_type_longident_and_param) + (_loc : Gram.Loc.t) -> (ct : 'class_type)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.class_type_tag : + 'class_type) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "ctyp" | "anti"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"ctyp\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "ctyp" | "anti" as n)), s) + -> + (Ast.CtAnt (_loc, + (mk_anti ~c: "class_type" n s)) : + 'class_type) + | _ -> assert false))) ]) ])) + ()); + Gram.extend + (class_type_longident_and_param : + 'class_type_longident_and_param Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (class_type_longident : + 'class_type_longident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'class_type_longident) + (_loc : Gram.Loc.t) -> + (Ast.CtCon (_loc, Ast.ViNil, i, + (Ast.TyNil _loc)) : + 'class_type_longident_and_param)))); + ([ Gram.Snterm + (Gram.Entry.obj + (class_type_longident : + 'class_type_longident Gram.Entry.t)); + Gram.Skeyword "["; + Gram.Snterm + (Gram.Entry.obj + (comma_ctyp : 'comma_ctyp Gram.Entry.t)); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (t : 'comma_ctyp) _ + (i : 'class_type_longident) + (_loc : Gram.Loc.t) -> + (Ast.CtCon (_loc, Ast.ViNil, i, t) : + 'class_type_longident_and_param)))) ]) ])) + ()); + Gram.extend (class_type_plus : 'class_type_plus Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (class_type : 'class_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (ct : 'class_type) (_loc : Gram.Loc.t) -> + (ct : 'class_type_plus)))); + ([ Gram.Skeyword "["; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); + Gram.Skeyword "]"; Gram.Skeyword "->"; Gram.Sself ], + (Gram.Action.mk + (fun (ct : 'class_type_plus) _ _ (t : 'ctyp) _ + (_loc : Gram.Loc.t) -> + (Ast.CtFun (_loc, t, ct) : 'class_type_plus)))) ]) ])) + ()); + Gram.extend + (opt_class_self_type : 'opt_class_self_type Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.TyNil _loc : 'opt_class_self_type)))); + ([ Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (t : 'ctyp) _ (_loc : Gram.Loc.t) -> + (t : 'opt_class_self_type)))) ]) ])) + ()); + Gram.extend (class_signature : 'class_signature Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Slist0 + (Gram.srules class_signature + [ ([ Gram.Snterm + (Gram.Entry.obj + (class_sig_item : + 'class_sig_item Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (csg : 'class_sig_item) + (_loc : Gram.Loc.t) -> + (csg : 'e__11)))) ]) ], + (Gram.Action.mk + (fun (l : 'e__11 list) (_loc : Gram.Loc.t) -> + (Ast.cgSem_of_list l : 'class_signature)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "csg" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"csg\" | \"anti\" | \"list\"), _)")); + Gram.Snterm + (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (csg : 'class_signature) _ + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "csg" | "anti" | "list" as n)), + s) -> + (Ast.CgSem (_loc, + (Ast.CgAnt (_loc, + (mk_anti ~c: "class_sig_item" n s))), + csg) : + 'class_signature) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "csg" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"csg\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "csg" | "anti" | "list" as n)), + s) -> + (Ast.CgAnt (_loc, + (mk_anti ~c: "class_sig_item" n s)) : + 'class_signature) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (class_sig_item : 'class_sig_item Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (type_constraint : + 'type_constraint Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t2 : 'ctyp) _ (t1 : 'ctyp) _ + (_loc : Gram.Loc.t) -> + (Ast.CgCtr (_loc, t1, t2) : 'class_sig_item)))); + ([ Gram.Skeyword "method"; + Gram.Snterm + (Gram.Entry.obj + (opt_private : 'opt_private Gram.Entry.t)); + Gram.Skeyword "virtual"; + Gram.Snterm + (Gram.Entry.obj (label : 'label Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (poly_type : 'poly_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'poly_type) _ (l : 'label) _ + (pf : 'opt_private) _ (_loc : Gram.Loc.t) -> + (Ast.CgVir (_loc, l, pf, t) : + 'class_sig_item)))); + ([ Gram.Skeyword "method"; + Gram.Snterm + (Gram.Entry.obj + (opt_private : 'opt_private Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (label : 'label Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (poly_type : 'poly_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'poly_type) _ (l : 'label) + (pf : 'opt_private) _ (_loc : Gram.Loc.t) -> + (Ast.CgMth (_loc, l, pf, t) : + 'class_sig_item)))); + ([ Gram.Skeyword "method"; Gram.Skeyword "virtual"; + Gram.Snterm + (Gram.Entry.obj + (opt_private : 'opt_private Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (label : 'label Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (poly_type : 'poly_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'poly_type) _ (l : 'label) + (pf : 'opt_private) _ _ (_loc : Gram.Loc.t) + -> + (Ast.CgVir (_loc, l, pf, t) : + 'class_sig_item)))); + ([ Gram.Snterm + (Gram.Entry.obj + (value_val : 'value_val Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_mutable : 'opt_mutable Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_virtual : 'opt_virtual Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (label : 'label Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'ctyp) _ (l : 'label) + (mv : 'opt_virtual) (mf : 'opt_mutable) _ + (_loc : Gram.Loc.t) -> + (Ast.CgVal (_loc, l, mf, mv, t) : + 'class_sig_item)))); + ([ Gram.Skeyword "inherit"; + Gram.Snterm + (Gram.Entry.obj + (class_type : 'class_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (cs : 'class_type) _ (_loc : Gram.Loc.t) -> + (Ast.CgInh (_loc, cs) : 'class_sig_item)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.class_sig_item_tag : + 'class_sig_item) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "csg" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"csg\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "csg" | "anti" | "list" as n)), + s) -> + (Ast.CgAnt (_loc, + (mk_anti ~c: "class_sig_item" n s)) : + 'class_sig_item) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (type_constraint : 'type_constraint Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "constraint" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (() : 'type_constraint)))); + ([ Gram.Skeyword "type" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (() : 'type_constraint)))) ]) ])) + ()); + Gram.extend + (class_description : 'class_description Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (class_info_for_class_type : + 'class_info_for_class_type Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (class_type_plus : + 'class_type_plus Gram.Entry.t)) ], + (Gram.Action.mk + (fun (ct : 'class_type_plus) _ + (ci : 'class_info_for_class_type) + (_loc : Gram.Loc.t) -> + (Ast.CtCol (_loc, ci, ct) : + 'class_description)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.class_type_tag : + 'class_description) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "typ" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"typ\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "typ" | "anti" | "list" as n)), + s) -> + (Ast.CtAnt (_loc, + (mk_anti ~c: "class_type" n s)) : + 'class_description) + | _ -> assert false))); + ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], + (Gram.Action.mk + (fun (cd2 : 'class_description) _ + (cd1 : 'class_description) + (_loc : Gram.Loc.t) -> + (Ast.CtAnd (_loc, cd1, cd2) : + 'class_description)))) ]) ])) + ()); + Gram.extend + (class_type_declaration : + 'class_type_declaration Gram.Entry.t) + ((fun () -> + (None, + [ (None, (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Snterm + (Gram.Entry.obj + (class_info_for_class_type : + 'class_info_for_class_type Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (class_type : 'class_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (ct : 'class_type) _ + (ci : 'class_info_for_class_type) + (_loc : Gram.Loc.t) -> + (Ast.CtEq (_loc, ci, ct) : + 'class_type_declaration)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.class_type_tag : + 'class_type_declaration) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "typ" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"typ\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "typ" | "anti" | "list" as n)), + s) -> + (Ast.CtAnt (_loc, + (mk_anti ~c: "class_type" n s)) : + 'class_type_declaration) + | _ -> assert false))); + ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], + (Gram.Action.mk + (fun (cd2 : 'class_type_declaration) _ + (cd1 : 'class_type_declaration) + (_loc : Gram.Loc.t) -> + (Ast.CtAnd (_loc, cd1, cd2) : + 'class_type_declaration)))) ]) ])) + ()); + Gram.extend (field_expr_list : 'field_expr_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (field_expr : 'field_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (b1 : 'field_expr) (_loc : Gram.Loc.t) -> + (b1 : 'field_expr_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (field_expr : 'field_expr Gram.Entry.t)); + Gram.Skeyword ";" ], + (Gram.Action.mk + (fun _ (b1 : 'field_expr) (_loc : Gram.Loc.t) -> + (b1 : 'field_expr_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (field_expr : 'field_expr Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Sself ], + (Gram.Action.mk + (fun (b2 : 'field_expr_list) _ + (b1 : 'field_expr) (_loc : Gram.Loc.t) -> + (Ast.RbSem (_loc, b1, b2) : 'field_expr_list)))) ]) ])) + ()); + Gram.extend (field_expr : 'field_expr Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (label : 'label Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (l : 'label) + (_loc : Gram.Loc.t) -> + (Ast.RbEq (_loc, (Ast.IdLid (_loc, l)), e) : + 'field_expr)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.RbAnt (_loc, + (mk_anti ~c: "rec_binding" n s)) : + 'field_expr) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "bi" | "anti"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"bi\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "bi" | "anti" as n)), s) + -> + (Ast.RbAnt (_loc, + (mk_anti ~c: "rec_binding" n s)) : + 'field_expr) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (meth_list : 'meth_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (meth_decl : 'meth_decl Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_dot_dot : 'opt_dot_dot Gram.Entry.t)) ], + (Gram.Action.mk + (fun (v : 'opt_dot_dot) (m : 'meth_decl) + (_loc : Gram.Loc.t) -> ((m, v) : 'meth_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (meth_decl : 'meth_decl Gram.Entry.t)); + Gram.Skeyword ";"; + Gram.Snterm + (Gram.Entry.obj + (opt_dot_dot : 'opt_dot_dot Gram.Entry.t)) ], + (Gram.Action.mk + (fun (v : 'opt_dot_dot) _ (m : 'meth_decl) + (_loc : Gram.Loc.t) -> ((m, v) : 'meth_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (meth_decl : 'meth_decl Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Sself ], + (Gram.Action.mk + (fun ((ml, v) : 'meth_list) _ (m : 'meth_decl) + (_loc : Gram.Loc.t) -> + (((Ast.TySem (_loc, m, ml)), v) : 'meth_list)))) ]) ])) + ()); + Gram.extend (meth_decl : 'meth_decl Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (poly_type : 'poly_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'poly_type) _ (lab : 'a_LIDENT) + (_loc : Gram.Loc.t) -> + (Ast.TyCol (_loc, + (Ast.TyId (_loc, (Ast.IdLid (_loc, lab)))), + t) : + 'meth_decl)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.ctyp_tag : + 'meth_decl) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp;" n s)) : + 'meth_decl) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "typ"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"typ\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "typ" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp" n s)) : + 'meth_decl) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (opt_meth_list : 'opt_meth_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (opt_dot_dot : 'opt_dot_dot Gram.Entry.t)) ], + (Gram.Action.mk + (fun (v : 'opt_dot_dot) (_loc : Gram.Loc.t) -> + (Ast.TyObj (_loc, (Ast.TyNil _loc), v) : + 'opt_meth_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (meth_list : 'meth_list Gram.Entry.t)) ], + (Gram.Action.mk + (fun ((ml, v) : 'meth_list) (_loc : Gram.Loc.t) + -> (Ast.TyObj (_loc, ml, v) : 'opt_meth_list)))) ]) ])) + ()); + Gram.extend (poly_type : 'poly_type Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'ctyp) (_loc : Gram.Loc.t) -> + (t : 'poly_type)))) ]) ])) + ()); + Gram.extend (package_type : 'package_type Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p : 'module_type) (_loc : Gram.Loc.t) -> + (p : 'package_type)))) ]) ])) + ()); + Gram.extend (typevars : 'typevars Gram.Entry.t) + ((fun () -> + (None, + [ (None, (Some Camlp4.Sig.Grammar.LeftA), + [ ([ Gram.Skeyword "'"; + Gram.Snterm + (Gram.Entry.obj + (a_ident : 'a_ident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_ident) _ (_loc : Gram.Loc.t) -> + (Ast.TyQuo (_loc, i) : 'typevars)))); + ([ Gram.Stoken + (((function | QUOTATION _ -> true | _ -> false), + "QUOTATION _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | QUOTATION x -> + (Quotation.expand _loc x Quotation. + DynAst.ctyp_tag : + 'typevars) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "typ"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"typ\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "typ" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp" n s)) : + 'typevars) + | _ -> assert false))); + ([ Gram.Sself; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'typevars) (t1 : 'typevars) + (_loc : Gram.Loc.t) -> + (Ast.TyApp (_loc, t1, t2) : 'typevars)))) ]) ])) + ()); + Gram.extend (row_field : 'row_field Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'ctyp) (_loc : Gram.Loc.t) -> + (t : 'row_field)))); + ([ Gram.Skeyword "`"; + Gram.Snterm + (Gram.Entry.obj + (a_ident : 'a_ident Gram.Entry.t)); + Gram.Skeyword "of"; + Gram.Snterm + (Gram.Entry.obj + (amp_ctyp : 'amp_ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'amp_ctyp) _ (i : 'a_ident) _ + (_loc : Gram.Loc.t) -> + (Ast.TyOf (_loc, (Ast.TyVrn (_loc, i)), t) : + 'row_field)))); + ([ Gram.Skeyword "`"; + Gram.Snterm + (Gram.Entry.obj + (a_ident : 'a_ident Gram.Entry.t)); + Gram.Skeyword "of"; Gram.Skeyword "&"; + Gram.Snterm + (Gram.Entry.obj + (amp_ctyp : 'amp_ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'amp_ctyp) _ _ (i : 'a_ident) _ + (_loc : Gram.Loc.t) -> + (Ast.TyOfAmp (_loc, (Ast.TyVrn (_loc, i)), t) : + 'row_field)))); + ([ Gram.Skeyword "`"; + Gram.Snterm + (Gram.Entry.obj + (a_ident : 'a_ident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_ident) _ (_loc : Gram.Loc.t) -> + (Ast.TyVrn (_loc, i) : 'row_field)))); + ([ Gram.Sself; Gram.Skeyword "|"; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'row_field) _ (t1 : 'row_field) + (_loc : Gram.Loc.t) -> + (Ast.TyOr (_loc, t1, t2) : 'row_field)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp|" n s)) : + 'row_field) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "typ"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"typ\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "typ" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp" n s)) : + 'row_field) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (amp_ctyp : 'amp_ctyp Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'ctyp) (_loc : Gram.Loc.t) -> + (t : 'amp_ctyp)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("list", _) -> true + | _ -> false), + "ANTIQUOT (\"list\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("list" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp&" n s)) : + 'amp_ctyp) + | _ -> assert false))); + ([ Gram.Sself; Gram.Skeyword "&"; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'amp_ctyp) _ (t1 : 'amp_ctyp) + (_loc : Gram.Loc.t) -> + (Ast.TyAmp (_loc, t1, t2) : 'amp_ctyp)))) ]) ])) + ()); + Gram.extend (name_tags : 'name_tags Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "`"; + Gram.Snterm + (Gram.Entry.obj + (a_ident : 'a_ident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_ident) _ (_loc : Gram.Loc.t) -> + (Ast.TyVrn (_loc, i) : 'name_tags)))); + ([ Gram.Sself; Gram.Sself ], + (Gram.Action.mk + (fun (t2 : 'name_tags) (t1 : 'name_tags) + (_loc : Gram.Loc.t) -> + (Ast.TyApp (_loc, t1, t2) : 'name_tags)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "typ"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"typ\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "typ" as n)), s) -> + (Ast.TyAnt (_loc, + (mk_anti ~c: "ctyp" n s)) : + 'name_tags) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (eq_expr : 'eq_expr Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (fun i p -> Ast.PaOlb (_loc, i, p) : + 'eq_expr)))); + ([ Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> + (fun i p -> Ast.PaOlbi (_loc, i, p, e) : + 'eq_expr)))) ]) ])) + ()); + Gram.extend (patt_tcon : 'patt_tcon Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p : 'patt) (_loc : Gram.Loc.t) -> + (p : 'patt_tcon)))); + ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'ctyp) _ (p : 'patt) + (_loc : Gram.Loc.t) -> + (Ast.PaTyc (_loc, p, t) : 'patt_tcon)))) ]) ])) + ()); + Gram.extend (ipatt : 'ipatt Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "?"; Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj + (ipatt_tcon : 'ipatt_tcon Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (e : 'expr) _ (p : 'ipatt_tcon) _ _ + (_loc : Gram.Loc.t) -> + (Ast.PaOlbi (_loc, "", p, e) : 'ipatt)))); + ([ Gram.Skeyword "?"; Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj + (ipatt_tcon : 'ipatt_tcon Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (p : 'ipatt_tcon) _ _ (_loc : Gram.Loc.t) + -> (Ast.PaOlb (_loc, "", p) : 'ipatt)))); + ([ Gram.Skeyword "?"; + Gram.Stoken + (((function + | ANTIQUOT (("" | "lid"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"lid\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "lid" as n)), i) -> + (Ast.PaOlb (_loc, (mk_anti n i), + (Ast.PaNil _loc)) : + 'ipatt) + | _ -> assert false))); + ([ Gram.Skeyword "?"; + Gram.Stoken + (((function | LIDENT _ -> true | _ -> false), + "LIDENT _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LIDENT i -> + (Ast.PaOlb (_loc, i, (Ast.PaNil _loc)) : + 'ipatt) + | _ -> assert false))); + ([ Gram.Skeyword "?"; + Gram.Stoken + (((function + | ANTIQUOT (("" | "lid"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"lid\"), _)")); + Gram.Skeyword ":"; Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj + (ipatt_tcon : 'ipatt_tcon Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (eq_expr : 'eq_expr Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (f : 'eq_expr) (p : 'ipatt_tcon) _ _ + (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "lid" as n)), i) -> + (f (mk_anti n i) p : 'ipatt) + | _ -> assert false))); + ([ Gram.Stoken + (((function | OPTLABEL _ -> true | _ -> false), + "OPTLABEL _")); + Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj + (ipatt_tcon : 'ipatt_tcon Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (eq_expr : 'eq_expr Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (f : 'eq_expr) (p : 'ipatt_tcon) _ + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | OPTLABEL i -> (f i p : 'ipatt) + | _ -> assert false))); + ([ Gram.Skeyword "~"; + Gram.Stoken + (((function | LIDENT _ -> true | _ -> false), + "LIDENT _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LIDENT i -> + (Ast.PaLab (_loc, i, (Ast.PaNil _loc)) : + 'ipatt) + | _ -> assert false))); + ([ Gram.Skeyword "~"; + Gram.Stoken + (((function + | ANTIQUOT (("" | "lid"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"lid\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "lid" as n)), i) -> + (Ast.PaLab (_loc, (mk_anti n i), + (Ast.PaNil _loc)) : + 'ipatt) + | _ -> assert false))); + ([ Gram.Skeyword "~"; + Gram.Stoken + (((function + | ANTIQUOT (("" | "lid"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"lid\"), _)")); + Gram.Skeyword ":"; Gram.Sself ], + (Gram.Action.mk + (fun (p : 'ipatt) _ (__camlp4_0 : Gram.Token.t) + _ (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "lid" as n)), i) -> + (Ast.PaLab (_loc, (mk_anti n i), p) : + 'ipatt) + | _ -> assert false))); + ([ Gram.Stoken + (((function | LABEL _ -> true | _ -> false), + "LABEL _")); + Gram.Sself ], + (Gram.Action.mk + (fun (p : 'ipatt) (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LABEL i -> + (Ast.PaLab (_loc, i, p) : 'ipatt) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (ipatt_tcon : 'ipatt_tcon Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (ipatt : 'ipatt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p : 'ipatt) (_loc : Gram.Loc.t) -> + (p : 'ipatt_tcon)))); + ([ Gram.Snterm + (Gram.Entry.obj (ipatt : 'ipatt Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'ctyp) _ (p : 'ipatt) + (_loc : Gram.Loc.t) -> + (Ast.PaTyc (_loc, p, t) : 'ipatt_tcon)))) ]) ])) + ()); + Gram.extend (direction_flag : 'direction_flag Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function + | ANTIQUOT (("to" | "anti"), _) -> true + | _ -> false), + "ANTIQUOT ((\"to\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("to" | "anti" as n)), s) -> + (Ast.DiAnt (mk_anti n s) : + 'direction_flag) + | _ -> assert false))); + ([ Gram.Skeyword "downto" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.DiDownto : 'direction_flag)))); + ([ Gram.Skeyword "to" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.DiTo : 'direction_flag)))) ]) ])) + ()); + Gram.extend (opt_private : 'opt_private Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.PrNil : 'opt_private)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("private" | "anti"), _) -> true + | _ -> false), + "ANTIQUOT ((\"private\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("private" | "anti" as n)), s) + -> + (Ast.PrAnt (mk_anti n s) : 'opt_private) + | _ -> assert false))); + ([ Gram.Skeyword "private" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.PrPrivate : 'opt_private)))) ]) ])) + ()); + Gram.extend (opt_mutable : 'opt_mutable Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.MuNil : 'opt_mutable)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("mutable" | "anti"), _) -> true + | _ -> false), + "ANTIQUOT ((\"mutable\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("mutable" | "anti" as n)), s) + -> + (Ast.MuAnt (mk_anti n s) : 'opt_mutable) + | _ -> assert false))); + ([ Gram.Skeyword "mutable" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.MuMutable : 'opt_mutable)))) ]) ])) + ()); + Gram.extend (opt_virtual : 'opt_virtual Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.ViNil : 'opt_virtual)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("virtual" | "anti"), _) -> true + | _ -> false), + "ANTIQUOT ((\"virtual\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("virtual" | "anti" as n)), s) + -> + (Ast.ViAnt (mk_anti n s) : 'opt_virtual) + | _ -> assert false))); + ([ Gram.Skeyword "virtual" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.ViVirtual : 'opt_virtual)))) ]) ])) + ()); + Gram.extend (opt_dot_dot : 'opt_dot_dot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.RvNil : 'opt_dot_dot)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ((".." | "anti"), _) -> true + | _ -> false), + "ANTIQUOT ((\"..\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT (((".." | "anti" as n)), s) -> + (Ast.RvAnt (mk_anti n s) : 'opt_dot_dot) + | _ -> assert false))); + ([ Gram.Skeyword ".." ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.RvRowVar : 'opt_dot_dot)))) ]) ])) + ()); + Gram.extend (opt_rec : 'opt_rec Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.ReNil : 'opt_rec)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("rec" | "anti"), _) -> true + | _ -> false), + "ANTIQUOT ((\"rec\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("rec" | "anti" as n)), s) -> + (Ast.ReAnt (mk_anti n s) : 'opt_rec) + | _ -> assert false))); + ([ Gram.Skeyword "rec" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.ReRecursive : 'opt_rec)))) ]) ])) + ()); + Gram.extend (opt_override : 'opt_override Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.OvNil : 'opt_override)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("!" | "override" | "anti"), _) + -> true + | _ -> false), + "ANTIQUOT ((\"!\" | \"override\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("!" | "override" | "anti" as n)), s) + -> + (Ast.OvAnt (mk_anti n s) : 'opt_override) + | _ -> assert false))); + ([ Gram.Skeyword "!" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.OvOverride : 'opt_override)))) ]) ])) + ()); + Gram.extend (opt_expr : 'opt_expr Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.ExNil _loc : 'opt_expr)))); + ([ Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) (_loc : Gram.Loc.t) -> + (e : 'opt_expr)))) ]) ])) + ()); + Gram.extend (interf : 'interf Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function | EOI -> true | _ -> false), "EOI")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | EOI -> (([], None) : 'interf) + | _ -> assert false))); + ([ Gram.Snterm + (Gram.Entry.obj + (sig_item : 'sig_item Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun ((sil, stopped) : 'interf) _ + (si : 'sig_item) (_loc : Gram.Loc.t) -> + (((si :: sil), stopped) : 'interf)))); + ([ Gram.Skeyword "#"; + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_expr : 'opt_expr Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (dp : 'opt_expr) (n : 'a_LIDENT) _ + (_loc : Gram.Loc.t) -> + (([ Ast.SgDir (_loc, n, dp) ], + (stopped_at _loc)) : 'interf)))) ]) ])) + ()); + Gram.extend (sig_items : 'sig_items Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Slist0 + (Gram.srules sig_items + [ ([ Gram.Snterm + (Gram.Entry.obj + (sig_item : + 'sig_item Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (sg : 'sig_item) + (_loc : Gram.Loc.t) -> + (sg : 'e__12)))) ]) ], + (Gram.Action.mk + (fun (l : 'e__12 list) (_loc : Gram.Loc.t) -> + (Ast.sgSem_of_list l : 'sig_items)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "sigi" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"sigi\" | \"anti\" | \"list\"), _)")); + Gram.Snterm + (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (sg : 'sig_items) _ + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "sigi" | "anti" | "list" as n)), + s) -> + (Ast.SgSem (_loc, + (Ast.SgAnt (_loc, + (mk_anti n ~c: "sig_item" s))), + sg) : + 'sig_items) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "sigi" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"sigi\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "sigi" | "anti" | "list" as n)), + s) -> + (Ast.SgAnt (_loc, + (mk_anti n ~c: "sig_item" s)) : + 'sig_items) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (implem : 'implem Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function | EOI -> true | _ -> false), "EOI")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | EOI -> (([], None) : 'implem) + | _ -> assert false))); + ([ Gram.Snterm + (Gram.Entry.obj + (str_item : 'str_item Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun ((sil, stopped) : 'implem) _ + (si : 'str_item) (_loc : Gram.Loc.t) -> + (((si :: sil), stopped) : 'implem)))); + ([ Gram.Skeyword "#"; + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_expr : 'opt_expr Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (dp : 'opt_expr) (n : 'a_LIDENT) _ + (_loc : Gram.Loc.t) -> + (([ Ast.StDir (_loc, n, dp) ], + (stopped_at _loc)) : 'implem)))) ]) ])) + ()); + Gram.extend (str_items : 'str_items Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Slist0 + (Gram.srules str_items + [ ([ Gram.Snterm + (Gram.Entry.obj + (str_item : + 'str_item Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (st : 'str_item) + (_loc : Gram.Loc.t) -> + (st : 'e__13)))) ]) ], + (Gram.Action.mk + (fun (l : 'e__13 list) (_loc : Gram.Loc.t) -> + (Ast.stSem_of_list l : 'str_items)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "stri" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"stri\" | \"anti\" | \"list\"), _)")); + Gram.Snterm + (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (st : 'str_items) _ + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "stri" | "anti" | "list" as n)), + s) -> + (Ast.StSem (_loc, + (Ast.StAnt (_loc, + (mk_anti n ~c: "str_item" s))), + st) : + 'str_items) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "stri" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"stri\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "stri" | "anti" | "list" as n)), + s) -> + (Ast.StAnt (_loc, + (mk_anti n ~c: "str_item" s)) : + 'str_items) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (top_phrase : 'top_phrase Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function | EOI -> true | _ -> false), "EOI")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | EOI -> (None : 'top_phrase) + | _ -> assert false))); + ([ Gram.Snterm + (Gram.Entry.obj (phrase : 'phrase Gram.Entry.t)) ], + (Gram.Action.mk + (fun (ph : 'phrase) (_loc : Gram.Loc.t) -> + (Some ph : 'top_phrase)))) ]) ])) + ()); + Gram.extend (use_file : 'use_file Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function | EOI -> true | _ -> false), "EOI")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | EOI -> (([], None) : 'use_file) + | _ -> assert false))); + ([ Gram.Snterm + (Gram.Entry.obj + (str_item : 'str_item Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun ((sil, stopped) : 'use_file) _ + (si : 'str_item) (_loc : Gram.Loc.t) -> + (((si :: sil), stopped) : 'use_file)))); + ([ Gram.Skeyword "#"; + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_expr : 'opt_expr Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (dp : 'opt_expr) (n : 'a_LIDENT) _ + (_loc : Gram.Loc.t) -> + (([ Ast.StDir (_loc, n, dp) ], + (stopped_at _loc)) : 'use_file)))) ]) ])) + ()); + Gram.extend (phrase : 'phrase Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (str_item : 'str_item Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (st : 'str_item) (_loc : Gram.Loc.t) -> + (st : 'phrase)))); + ([ Gram.Skeyword "#"; + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_expr : 'opt_expr Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (dp : 'opt_expr) (n : 'a_LIDENT) _ + (_loc : Gram.Loc.t) -> + (Ast.StDir (_loc, n, dp) : 'phrase)))) ]) ])) + ()); + Gram.extend (a_INT : 'a_INT Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function | INT (_, _) -> true | _ -> false), + "INT (_, _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | INT (_, s) -> (s : 'a_INT) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "int" | "`int"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"int\" | \"`int\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "int" | "`int" as n)), s) + -> (mk_anti n s : 'a_INT) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (a_INT32 : 'a_INT32 Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function | INT32 (_, _) -> true | _ -> false), + "INT32 (_, _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | INT32 (_, s) -> (s : 'a_INT32) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "int32" | "`int32"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"int32\" | \"`int32\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "int32" | "`int32" as n)), + s) -> (mk_anti n s : 'a_INT32) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (a_INT64 : 'a_INT64 Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function | INT64 (_, _) -> true | _ -> false), + "INT64 (_, _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | INT64 (_, s) -> (s : 'a_INT64) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "int64" | "`int64"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"int64\" | \"`int64\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "int64" | "`int64" as n)), + s) -> (mk_anti n s : 'a_INT64) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (a_NATIVEINT : 'a_NATIVEINT Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function + | NATIVEINT (_, _) -> true + | _ -> false), + "NATIVEINT (_, _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | NATIVEINT (_, s) -> (s : 'a_NATIVEINT) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT + (("" | "nativeint" | "`nativeint"), _) + -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"nativeint\" | \"`nativeint\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "nativeint" | "`nativeint" as n)), + s) -> (mk_anti n s : 'a_NATIVEINT) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (a_FLOAT : 'a_FLOAT Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function | FLOAT (_, _) -> true | _ -> false), + "FLOAT (_, _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | FLOAT (_, s) -> (s : 'a_FLOAT) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "flo" | "`flo"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"flo\" | \"`flo\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "flo" | "`flo" as n)), s) + -> (mk_anti n s : 'a_FLOAT) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (a_CHAR : 'a_CHAR Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function | CHAR (_, _) -> true | _ -> false), + "CHAR (_, _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | CHAR (_, s) -> (s : 'a_CHAR) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "chr" | "`chr"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"chr\" | \"`chr\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "chr" | "`chr" as n)), s) + -> (mk_anti n s : 'a_CHAR) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (a_UIDENT : 'a_UIDENT Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function | UIDENT _ -> true | _ -> false), + "UIDENT _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT s -> (s : 'a_UIDENT) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "uid"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"uid\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "uid" as n)), s) -> + (mk_anti n s : 'a_UIDENT) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (a_LIDENT : 'a_LIDENT Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function | LIDENT _ -> true | _ -> false), + "LIDENT _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LIDENT s -> (s : 'a_LIDENT) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "lid"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"lid\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "lid" as n)), s) -> + (mk_anti n s : 'a_LIDENT) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (a_LABEL : 'a_LABEL Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function | LABEL _ -> true | _ -> false), + "LABEL _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LABEL s -> (s : 'a_LABEL) + | _ -> assert false))); + ([ Gram.Skeyword "~"; + Gram.Stoken + (((function + | ANTIQUOT ("", _) -> true + | _ -> false), + "ANTIQUOT (\"\", _)")); + Gram.Skeyword ":" ], + (Gram.Action.mk + (fun _ (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" as n)), s) -> + (mk_anti n s : 'a_LABEL) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (a_OPTLABEL : 'a_OPTLABEL Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function | OPTLABEL _ -> true | _ -> false), + "OPTLABEL _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | OPTLABEL s -> (s : 'a_OPTLABEL) + | _ -> assert false))); + ([ Gram.Skeyword "?"; + Gram.Stoken + (((function + | ANTIQUOT ("", _) -> true + | _ -> false), + "ANTIQUOT (\"\", _)")); + Gram.Skeyword ":" ], + (Gram.Action.mk + (fun _ (__camlp4_0 : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" as n)), s) -> + (mk_anti n s : 'a_OPTLABEL) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (a_STRING : 'a_STRING Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function + | STRING (_, _) -> true + | _ -> false), + "STRING (_, _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | STRING (_, s) -> (s : 'a_STRING) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "str" | "`str"), _) -> + true + | _ -> false), + "ANTIQUOT ((\"\" | \"str\" | \"`str\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" | "str" | "`str" as n)), s) + -> (mk_anti n s : 'a_STRING) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (string_list : 'string_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function + | STRING (_, _) -> true + | _ -> false), + "STRING (_, _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | STRING (_, x) -> + (Ast.LCons (x, Ast.LNil) : 'string_list) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | STRING (_, _) -> true + | _ -> false), + "STRING (_, _)")); + Gram.Sself ], + (Gram.Action.mk + (fun (xs : 'string_list) + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | STRING (_, x) -> + (Ast.LCons (x, xs) : 'string_list) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "str_list"), _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"str_list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT (("" | "str_list"), s) -> + (Ast.LAnt (mk_anti "str_list" s) : + 'string_list) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (value_let : 'value_let Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "value" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> (() : 'value_let)))) ]) ])) + ()); + Gram.extend (value_val : 'value_val Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "value" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> (() : 'value_val)))) ]) ])) + ()); + Gram.extend (semi : 'semi Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword ";" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> (() : 'semi)))) ]) ])) + ()); + Gram.extend (expr_quot : 'expr_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.ExNil _loc : 'expr_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) (_loc : Gram.Loc.t) -> + (e : 'expr_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Skeyword ";"; + Gram.Snterm + (Gram.Entry.obj + (sem_expr : 'sem_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e2 : 'sem_expr) _ (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExSem (_loc, e1, e2) : 'expr_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Skeyword ","; + Gram.Snterm + (Gram.Entry.obj + (comma_expr : 'comma_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e2 : 'comma_expr) _ (e1 : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExCom (_loc, e1, e2) : 'expr_quot)))) ]) ])) + ()); + Gram.extend (patt_quot : 'patt_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.PaNil _loc : 'patt_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'patt) (_loc : Gram.Loc.t) -> + (x : 'patt_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (y : 'patt) _ (x : 'patt) + (_loc : Gram.Loc.t) -> + (let i = + match x with + | Ast.PaAnt (loc, s) -> Ast.IdAnt (loc, s) + | p -> Ast.ident_of_patt p + in Ast.PaEq (_loc, i, y) : 'patt_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); + Gram.Skeyword ";"; + Gram.Snterm + (Gram.Entry.obj + (sem_patt : 'sem_patt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (y : 'sem_patt) _ (x : 'patt) + (_loc : Gram.Loc.t) -> + (Ast.PaSem (_loc, x, y) : 'patt_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); + Gram.Skeyword ","; + Gram.Snterm + (Gram.Entry.obj + (comma_patt : 'comma_patt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (y : 'comma_patt) _ (x : 'patt) + (_loc : Gram.Loc.t) -> + (Ast.PaCom (_loc, x, y) : 'patt_quot)))) ]) ])) + ()); + Gram.extend (ctyp_quot : 'ctyp_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.TyNil _loc : 'ctyp_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (more_ctyp : 'more_ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'more_ctyp) (_loc : Gram.Loc.t) -> + (x : 'ctyp_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (more_ctyp : 'more_ctyp Gram.Entry.t)); + Gram.Skeyword "and"; + Gram.Snterm + (Gram.Entry.obj + (constructor_arg_list : + 'constructor_arg_list Gram.Entry.t)) ], + (Gram.Action.mk + (fun (y : 'constructor_arg_list) _ + (x : 'more_ctyp) (_loc : Gram.Loc.t) -> + (Ast.TyAnd (_loc, x, y) : 'ctyp_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (more_ctyp : 'more_ctyp Gram.Entry.t)); + Gram.Skeyword "&"; + Gram.Snterm + (Gram.Entry.obj + (amp_ctyp : 'amp_ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (y : 'amp_ctyp) _ (x : 'more_ctyp) + (_loc : Gram.Loc.t) -> + (Ast.TyAmp (_loc, x, y) : 'ctyp_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (more_ctyp : 'more_ctyp Gram.Entry.t)); + Gram.Skeyword "*"; + Gram.Snterm + (Gram.Entry.obj + (star_ctyp : 'star_ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (y : 'star_ctyp) _ (x : 'more_ctyp) + (_loc : Gram.Loc.t) -> + (Ast.TySta (_loc, x, y) : 'ctyp_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (more_ctyp : 'more_ctyp Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (more_ctyp : 'more_ctyp Gram.Entry.t)); + Gram.Skeyword ";"; + Gram.Snterm + (Gram.Entry.obj + (label_declaration_list : + 'label_declaration_list Gram.Entry.t)) ], + (Gram.Action.mk + (fun (z : 'label_declaration_list) _ + (y : 'more_ctyp) _ (x : 'more_ctyp) + (_loc : Gram.Loc.t) -> + (Ast.TySem (_loc, (Ast.TyCol (_loc, x, y)), + z) : + 'ctyp_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (more_ctyp : 'more_ctyp Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (more_ctyp : 'more_ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (y : 'more_ctyp) _ (x : 'more_ctyp) + (_loc : Gram.Loc.t) -> + (Ast.TyCol (_loc, x, y) : 'ctyp_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (more_ctyp : 'more_ctyp Gram.Entry.t)); + Gram.Skeyword "of"; Gram.Skeyword "&"; + Gram.Snterm + (Gram.Entry.obj + (amp_ctyp : 'amp_ctyp Gram.Entry.t)); + Gram.Skeyword "|"; + Gram.Snterm + (Gram.Entry.obj + (row_field : 'row_field Gram.Entry.t)) ], + (Gram.Action.mk + (fun (z : 'row_field) _ (y : 'amp_ctyp) _ _ + (x : 'more_ctyp) (_loc : Gram.Loc.t) -> + (Ast.TyOr (_loc, (Ast.TyOfAmp (_loc, x, y)), + z) : + 'ctyp_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (more_ctyp : 'more_ctyp Gram.Entry.t)); + Gram.Skeyword "of"; Gram.Skeyword "&"; + Gram.Snterm + (Gram.Entry.obj + (amp_ctyp : 'amp_ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (y : 'amp_ctyp) _ _ (x : 'more_ctyp) + (_loc : Gram.Loc.t) -> + (Ast.TyOfAmp (_loc, x, y) : 'ctyp_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (more_ctyp : 'more_ctyp Gram.Entry.t)); + Gram.Skeyword "of"; + Gram.Snterm + (Gram.Entry.obj + (constructor_arg_list : + 'constructor_arg_list Gram.Entry.t)); + Gram.Skeyword "|"; + Gram.Snterm + (Gram.Entry.obj + (constructor_declarations : + 'constructor_declarations Gram.Entry.t)) ], + (Gram.Action.mk + (fun (z : 'constructor_declarations) _ + (y : 'constructor_arg_list) _ + (x : 'more_ctyp) (_loc : Gram.Loc.t) -> + (Ast.TyOr (_loc, (Ast.TyOf (_loc, x, y)), z) : + 'ctyp_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (more_ctyp : 'more_ctyp Gram.Entry.t)); + Gram.Skeyword "of"; + Gram.Snterm + (Gram.Entry.obj + (constructor_arg_list : + 'constructor_arg_list Gram.Entry.t)) ], + (Gram.Action.mk + (fun (y : 'constructor_arg_list) _ + (x : 'more_ctyp) (_loc : Gram.Loc.t) -> + (Ast.TyOf (_loc, x, y) : 'ctyp_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (more_ctyp : 'more_ctyp Gram.Entry.t)); + Gram.Skeyword "|"; + Gram.Snterm + (Gram.Entry.obj + (constructor_declarations : + 'constructor_declarations Gram.Entry.t)) ], + (Gram.Action.mk + (fun (y : 'constructor_declarations) _ + (x : 'more_ctyp) (_loc : Gram.Loc.t) -> + (Ast.TyOr (_loc, x, y) : 'ctyp_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (more_ctyp : 'more_ctyp Gram.Entry.t)); + Gram.Skeyword ";"; + Gram.Snterm + (Gram.Entry.obj + (label_declaration_list : + 'label_declaration_list Gram.Entry.t)) ], + (Gram.Action.mk + (fun (y : 'label_declaration_list) _ + (x : 'more_ctyp) (_loc : Gram.Loc.t) -> + (Ast.TySem (_loc, x, y) : 'ctyp_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (more_ctyp : 'more_ctyp Gram.Entry.t)); + Gram.Skeyword ","; + Gram.Snterm + (Gram.Entry.obj + (comma_ctyp : 'comma_ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (y : 'comma_ctyp) _ (x : 'more_ctyp) + (_loc : Gram.Loc.t) -> + (Ast.TyCom (_loc, x, y) : 'ctyp_quot)))) ]) ])) + ()); + Gram.extend (more_ctyp : 'more_ctyp Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (type_parameter : + 'type_parameter Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'type_parameter) (_loc : Gram.Loc.t) + -> (x : 'more_ctyp)))); + ([ Gram.Snterm + (Gram.Entry.obj + (type_kind : 'type_kind Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'type_kind) (_loc : Gram.Loc.t) -> + (x : 'more_ctyp)))); + ([ Gram.Skeyword "`"; + Gram.Snterm + (Gram.Entry.obj + (a_ident : 'a_ident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'a_ident) _ (_loc : Gram.Loc.t) -> + (Ast.TyVrn (_loc, x) : 'more_ctyp)))); + ([ Gram.Skeyword "mutable"; Gram.Sself ], + (Gram.Action.mk + (fun (x : 'more_ctyp) _ (_loc : Gram.Loc.t) -> + (Ast.TyMut (_loc, x) : 'more_ctyp)))) ]) ])) + ()); + Gram.extend (str_item_quot : 'str_item_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.StNil _loc : 'str_item_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (str_item : 'str_item Gram.Entry.t)) ], + (Gram.Action.mk + (fun (st : 'str_item) (_loc : Gram.Loc.t) -> + (st : 'str_item_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (str_item : 'str_item Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (st2 : 'str_item_quot) _ (st1 : 'str_item) + (_loc : Gram.Loc.t) -> + (Ast.StSem (_loc, st1, st2) : 'str_item_quot)))); + ([ Gram.Skeyword "#"; + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_expr : 'opt_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (dp : 'opt_expr) (n : 'a_LIDENT) _ + (_loc : Gram.Loc.t) -> + (Ast.StDir (_loc, n, dp) : 'str_item_quot)))) ]) ])) + ()); + Gram.extend (sig_item_quot : 'sig_item_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.SgNil _loc : 'sig_item_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (sig_item : 'sig_item Gram.Entry.t)) ], + (Gram.Action.mk + (fun (sg : 'sig_item) (_loc : Gram.Loc.t) -> + (sg : 'sig_item_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (sig_item : 'sig_item Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (sg2 : 'sig_item_quot) _ (sg1 : 'sig_item) + (_loc : Gram.Loc.t) -> + (Ast.SgSem (_loc, sg1, sg2) : 'sig_item_quot)))); + ([ Gram.Skeyword "#"; + Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_expr : 'opt_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (dp : 'opt_expr) (n : 'a_LIDENT) _ + (_loc : Gram.Loc.t) -> + (Ast.SgDir (_loc, n, dp) : 'sig_item_quot)))) ]) ])) + ()); + Gram.extend (module_type_quot : 'module_type_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.MtNil _loc : 'module_type_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'module_type) (_loc : Gram.Loc.t) -> + (x : 'module_type_quot)))) ]) ])) + ()); + Gram.extend (module_expr_quot : 'module_expr_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.MeNil _loc : 'module_expr_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (module_expr : 'module_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'module_expr) (_loc : Gram.Loc.t) -> + (x : 'module_expr_quot)))) ]) ])) + ()); + Gram.extend (match_case_quot : 'match_case_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.McNil _loc : 'match_case_quot)))); + ([ Gram.Slist0sep + ((Gram.Snterm + (Gram.Entry.obj + (match_case0 : + 'match_case0 Gram.Entry.t))), + (Gram.Skeyword "|")) ], + (Gram.Action.mk + (fun (x : 'match_case0 list) (_loc : Gram.Loc.t) + -> (Ast.mcOr_of_list x : 'match_case_quot)))) ]) ])) + ()); + Gram.extend (binding_quot : 'binding_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.BiNil _loc : 'binding_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (binding : 'binding Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'binding) (_loc : Gram.Loc.t) -> + (x : 'binding_quot)))) ]) ])) + ()); + Gram.extend (rec_binding_quot : 'rec_binding_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.RbNil _loc : 'rec_binding_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (label_expr_list : + 'label_expr_list Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'label_expr_list) (_loc : Gram.Loc.t) + -> (x : 'rec_binding_quot)))) ]) ])) + ()); + Gram.extend + (module_binding_quot : 'module_binding_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.MbNil _loc : 'module_binding_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (module_expr : 'module_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (me : 'module_expr) _ (mt : 'module_type) _ + (m : 'a_UIDENT) (_loc : Gram.Loc.t) -> + (Ast.MbColEq (_loc, m, mt, me) : + 'module_binding_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (mt : 'module_type) _ (m : 'a_UIDENT) + (_loc : Gram.Loc.t) -> + (Ast.MbCol (_loc, m, mt) : + 'module_binding_quot)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("", _) -> true + | _ -> false), + "ANTIQUOT (\"\", _)")); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (module_expr : 'module_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (me : 'module_expr) _ (mt : 'module_type) _ + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" as n)), m) -> + (Ast.MbColEq (_loc, (mk_anti n m), mt, + me) : + 'module_binding_quot) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("", _) -> true + | _ -> false), + "ANTIQUOT (\"\", _)")); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (module_type : 'module_type Gram.Entry.t)) ], + (Gram.Action.mk + (fun (mt : 'module_type) _ + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" as n)), m) -> + (Ast.MbCol (_loc, (mk_anti n m), mt) : + 'module_binding_quot) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("", _) -> true + | _ -> false), + "ANTIQUOT (\"\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("" as n)), s) -> + (Ast.MbAnt (_loc, + (mk_anti ~c: "module_binding" n s)) : + 'module_binding_quot) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("module_binding" | "anti"), _) + -> true + | _ -> false), + "ANTIQUOT ((\"module_binding\" | \"anti\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("module_binding" | "anti" as n)), s) + -> + (Ast.MbAnt (_loc, + (mk_anti ~c: "module_binding" n s)) : + 'module_binding_quot) + | _ -> assert false))); + ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], + (Gram.Action.mk + (fun (b2 : 'module_binding_quot) _ + (b1 : 'module_binding_quot) + (_loc : Gram.Loc.t) -> + (Ast.MbAnd (_loc, b1, b2) : + 'module_binding_quot)))) ]) ])) + ()); + Gram.extend (ident_quot : 'ident_quot Gram.Entry.t) + ((fun () -> + (None, + [ ((Some "apply"), None, + [ ([ Gram.Sself; Gram.Sself ], + (Gram.Action.mk + (fun (j : 'ident_quot) (i : 'ident_quot) + (_loc : Gram.Loc.t) -> + (Ast.IdApp (_loc, i, j) : 'ident_quot)))) ]); + ((Some "."), None, + [ ([ Gram.Sself; Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (j : 'ident_quot) _ (i : 'ident_quot) + (_loc : Gram.Loc.t) -> + (Ast.IdAcc (_loc, i, j) : 'ident_quot)))) ]); + ((Some "simple"), None, + [ ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (i : 'ident_quot) _ (_loc : Gram.Loc.t) + -> (i : 'ident_quot)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "id" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")); + Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (i : 'ident_quot) _ + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "id" | "anti" | "list" as n)), s) + -> + (Ast.IdAcc (_loc, + (Ast.IdAnt (_loc, + (mk_anti ~c: "ident" n s))), + i) : + 'ident_quot) + | _ -> assert false))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> + (Ast.IdLid (_loc, i) : 'ident_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_UIDENT) (_loc : Gram.Loc.t) -> + (Ast.IdUid (_loc, i) : 'ident_quot)))); + ([ Gram.Stoken + (((function + | ANTIQUOT (("" | "id" | "anti" | "list"), + _) -> true + | _ -> false), + "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT + ((("" | "id" | "anti" | "list" as n)), s) + -> + (Ast.IdAnt (_loc, + (mk_anti ~c: "ident" n s)) : + 'ident_quot) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (class_expr_quot : 'class_expr_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.CeNil _loc : 'class_expr_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (class_expr : 'class_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'class_expr) (_loc : Gram.Loc.t) -> + (x : 'class_expr_quot)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("virtual", _) -> true + | _ -> false), + "ANTIQUOT (\"virtual\", _)")); + Gram.Snterm + (Gram.Entry.obj (ident : 'ident Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_comma_ctyp : + 'opt_comma_ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (ot : 'opt_comma_ctyp) (i : 'ident) + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("virtual" as n)), s) -> + (let anti = + Ast.ViAnt + (mk_anti ~c: "class_expr" n s) + in Ast.CeCon (_loc, anti, i, ot) : + 'class_expr_quot) + | _ -> assert false))); + ([ Gram.Skeyword "virtual"; + Gram.Snterm + (Gram.Entry.obj + (class_name_and_param : + 'class_name_and_param Gram.Entry.t)) ], + (Gram.Action.mk + (fun ((i, ot) : 'class_name_and_param) _ + (_loc : Gram.Loc.t) -> + (Ast.CeCon (_loc, Ast.ViVirtual, + (Ast.IdLid (_loc, i)), ot) : + 'class_expr_quot)))); + ([ Gram.Sself; Gram.Skeyword "="; Gram.Sself ], + (Gram.Action.mk + (fun (ce2 : 'class_expr_quot) _ + (ce1 : 'class_expr_quot) (_loc : Gram.Loc.t) + -> + (Ast.CeEq (_loc, ce1, ce2) : + 'class_expr_quot)))); + ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], + (Gram.Action.mk + (fun (ce2 : 'class_expr_quot) _ + (ce1 : 'class_expr_quot) (_loc : Gram.Loc.t) + -> + (Ast.CeAnd (_loc, ce1, ce2) : + 'class_expr_quot)))) ]) ])) + ()); + Gram.extend (class_type_quot : 'class_type_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.CtNil _loc : 'class_type_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (class_type_plus : + 'class_type_plus Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'class_type_plus) (_loc : Gram.Loc.t) + -> (x : 'class_type_quot)))); + ([ Gram.Stoken + (((function + | ANTIQUOT ("virtual", _) -> true + | _ -> false), + "ANTIQUOT (\"virtual\", _)")); + Gram.Snterm + (Gram.Entry.obj (ident : 'ident Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_comma_ctyp : + 'opt_comma_ctyp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (ot : 'opt_comma_ctyp) (i : 'ident) + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ((("virtual" as n)), s) -> + (let anti = + Ast.ViAnt + (mk_anti ~c: "class_type" n s) + in Ast.CtCon (_loc, anti, i, ot) : + 'class_type_quot) + | _ -> assert false))); + ([ Gram.Skeyword "virtual"; + Gram.Snterm + (Gram.Entry.obj + (class_name_and_param : + 'class_name_and_param Gram.Entry.t)) ], + (Gram.Action.mk + (fun ((i, ot) : 'class_name_and_param) _ + (_loc : Gram.Loc.t) -> + (Ast.CtCon (_loc, Ast.ViVirtual, + (Ast.IdLid (_loc, i)), ot) : + 'class_type_quot)))); + ([ Gram.Sself; Gram.Skeyword ":"; Gram.Sself ], + (Gram.Action.mk + (fun (ct2 : 'class_type_quot) _ + (ct1 : 'class_type_quot) (_loc : Gram.Loc.t) + -> + (Ast.CtCol (_loc, ct1, ct2) : + 'class_type_quot)))); + ([ Gram.Sself; Gram.Skeyword "="; Gram.Sself ], + (Gram.Action.mk + (fun (ct2 : 'class_type_quot) _ + (ct1 : 'class_type_quot) (_loc : Gram.Loc.t) + -> + (Ast.CtEq (_loc, ct1, ct2) : + 'class_type_quot)))); + ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], + (Gram.Action.mk + (fun (ct2 : 'class_type_quot) _ + (ct1 : 'class_type_quot) (_loc : Gram.Loc.t) + -> + (Ast.CtAnd (_loc, ct1, ct2) : + 'class_type_quot)))) ]) ])) + ()); + Gram.extend + (class_str_item_quot : 'class_str_item_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.CrNil _loc : 'class_str_item_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (class_str_item : + 'class_str_item Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'class_str_item) (_loc : Gram.Loc.t) + -> (x : 'class_str_item_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (class_str_item : + 'class_str_item Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (x2 : 'class_str_item_quot) _ + (x1 : 'class_str_item) (_loc : Gram.Loc.t) -> + (Ast.CrSem (_loc, x1, x2) : + 'class_str_item_quot)))) ]) ])) + ()); + Gram.extend + (class_sig_item_quot : 'class_sig_item_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.CgNil _loc : 'class_sig_item_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (class_sig_item : + 'class_sig_item Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'class_sig_item) (_loc : Gram.Loc.t) + -> (x : 'class_sig_item_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (class_sig_item : + 'class_sig_item Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (x2 : 'class_sig_item_quot) _ + (x1 : 'class_sig_item) (_loc : Gram.Loc.t) -> + (Ast.CgSem (_loc, x1, x2) : + 'class_sig_item_quot)))) ]) ])) + ()); + Gram.extend (with_constr_quot : 'with_constr_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (Ast.WcNil _loc : 'with_constr_quot)))); + ([ Gram.Snterm + (Gram.Entry.obj + (with_constr : 'with_constr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'with_constr) (_loc : Gram.Loc.t) -> + (x : 'with_constr_quot)))) ]) ])) + ()); + Gram.extend (rec_flag_quot : 'rec_flag_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (opt_rec : 'opt_rec Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'opt_rec) (_loc : Gram.Loc.t) -> + (x : 'rec_flag_quot)))) ]) ])) + ()); + Gram.extend + (direction_flag_quot : 'direction_flag_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (direction_flag : + 'direction_flag Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'direction_flag) (_loc : Gram.Loc.t) + -> (x : 'direction_flag_quot)))) ]) ])) + ()); + Gram.extend + (mutable_flag_quot : 'mutable_flag_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (opt_mutable : 'opt_mutable Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'opt_mutable) (_loc : Gram.Loc.t) -> + (x : 'mutable_flag_quot)))) ]) ])) + ()); + Gram.extend + (private_flag_quot : 'private_flag_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (opt_private : 'opt_private Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'opt_private) (_loc : Gram.Loc.t) -> + (x : 'private_flag_quot)))) ]) ])) + ()); + Gram.extend + (virtual_flag_quot : 'virtual_flag_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (opt_virtual : 'opt_virtual Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'opt_virtual) (_loc : Gram.Loc.t) -> + (x : 'virtual_flag_quot)))) ]) ])) + ()); + Gram.extend + (row_var_flag_quot : 'row_var_flag_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (opt_dot_dot : 'opt_dot_dot Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'opt_dot_dot) (_loc : Gram.Loc.t) -> + (x : 'row_var_flag_quot)))) ]) ])) + ()); + Gram.extend + (override_flag_quot : 'override_flag_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (opt_override : 'opt_override Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'opt_override) (_loc : Gram.Loc.t) -> + (x : 'override_flag_quot)))) ]) ])) + ()); + Gram.extend (patt_eoi : 'patt_eoi Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); + Gram.Stoken + (((function | EOI -> true | _ -> false), "EOI")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) (x : 'patt) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | EOI -> (x : 'patt_eoi) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (expr_eoi : 'expr_eoi Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Stoken + (((function | EOI -> true | _ -> false), "EOI")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) (x : 'expr) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | EOI -> (x : 'expr_eoi) + | _ -> assert false))) ]) ])) + ())) + + end + + let _ = let module M = Register.OCamlSyntaxExtension(Id)(Make) in () + + end + +module Camlp4QuotationCommon = + struct + open Camlp4 + + (* -*- camlp4r -*- *) + (****************************************************************************) + (* *) + (* Objective Caml *) + (* *) + (* INRIA Rocquencourt *) + (* *) + (* Copyright 2002-2006 Institut National de Recherche en Informatique et *) + (* en Automatique. All rights reserved. This file is distributed under *) + (* the terms of the GNU Library General Public License, with the special *) + (* exception on linking described in LICENSE at the top of the Objective *) + (* Caml source tree. *) + (* *) + (****************************************************************************) + (* Authors: + * - Nicolas Pouillard: initial version + *) + module Id = + struct + let name = "Camlp4QuotationCommon" + + let version = Sys.ocaml_version + + end + + module Make + (Syntax : Sig.Camlp4Syntax) + (TheAntiquotSyntax : Sig.Parser(Syntax.Ast).SIMPLE) = + struct + open Sig + + include Syntax + + (* Be careful an AntiquotSyntax module appears here *) + module MetaLocHere = Ast.Meta.MetaLoc + + module MetaLoc = + struct + module Ast = Ast + + let loc_name = ref None + + let meta_loc_expr _loc loc = + match !loc_name with + | None -> Ast.ExId (_loc, (Ast.IdLid (_loc, !Loc.name))) + | Some "here" -> MetaLocHere.meta_loc_expr _loc loc + | Some x -> Ast.ExId (_loc, (Ast.IdLid (_loc, x))) + + let meta_loc_patt _loc _ = Ast.PaAny _loc + + end + + module MetaAst = Ast.Meta.Make(MetaLoc) + + module ME = MetaAst.Expr + + module MP = MetaAst.Patt + + let is_antiquot s = + let len = String.length s + in (len > 2) && ((s.[0] = '\\') && (s.[1] = '$')) + + let handle_antiquot_in_string s term parse loc decorate = + if is_antiquot s + then + (let pos = String.index s ':' in + let name = String.sub s 2 (pos - 2) + and code = + String.sub s (pos + 1) (((String.length s) - pos) - 1) + in decorate name (parse loc code)) + else term + + let antiquot_expander = + object + inherit Ast.map as super + + method patt = + function + | (Ast.PaAnt (_loc, s) | Ast.PaStr (_loc, s) as p) -> + let mloc _loc = MetaLoc.meta_loc_patt _loc _loc + in + handle_antiquot_in_string s p TheAntiquotSyntax. + parse_patt _loc + (fun n p -> + match n with + | "antisig_item" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "SgAnt")))))), + (mloc _loc))), + p) + | "antistr_item" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "StAnt")))))), + (mloc _loc))), + p) + | "antictyp" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "TyAnt")))))), + (mloc _loc))), + p) + | "antipatt" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "PaAnt")))))), + (mloc _loc))), + p) + | "antiexpr" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "ExAnt")))))), + (mloc _loc))), + p) + | "antimodule_type" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "MtAnt")))))), + (mloc _loc))), + p) + | "antimodule_expr" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "MeAnt")))))), + (mloc _loc))), + p) + | "anticlass_type" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "CtAnt")))))), + (mloc _loc))), + p) + | "anticlass_expr" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "CeAnt")))))), + (mloc _loc))), + p) + | "anticlass_sig_item" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "CgAnt")))))), + (mloc _loc))), + p) + | "anticlass_str_item" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "CrAnt")))))), + (mloc _loc))), + p) + | "antiwith_constr" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "WcAnt")))))), + (mloc _loc))), + p) + | "antibinding" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "BiAnt")))))), + (mloc _loc))), + p) + | "antirec_binding" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "RbAnt")))))), + (mloc _loc))), + p) + | "antimatch_case" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "McAnt")))))), + (mloc _loc))), + p) + | "antimodule_binding" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "MbAnt")))))), + (mloc _loc))), + p) + | "antiident" -> + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "IdAnt")))))), + (mloc _loc))), + p) + | _ -> p) + | p -> super#patt p + + method expr = + function + | (Ast.ExAnt (_loc, s) | Ast.ExStr (_loc, s) as e) -> + let mloc _loc = MetaLoc.meta_loc_expr _loc _loc + in + handle_antiquot_in_string s e TheAntiquotSyntax. + parse_expr _loc + (fun n e -> + match n with + | "`int" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdLid (_loc, "string_of_int")))), + e) + | "`int32" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Int32")), + (Ast.IdLid (_loc, "to_string")))))), + e) + | "`int64" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Int64")), + (Ast.IdLid (_loc, "to_string")))))), + e) + | "`nativeint" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Nativeint")), + (Ast.IdLid (_loc, "to_string")))))), + e) + | "`flo" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdLid (_loc, "string_of_float")))), + e) + | "`str" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "safe_string_escaped")))))), + e) + | "`chr" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Char")), + (Ast.IdLid (_loc, "escaped")))))), + e) + | "`bool" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "IdUid")))))), + (mloc _loc))), + (Ast.ExIfe (_loc, e, + (Ast.ExStr (_loc, "True")), + (Ast.ExStr (_loc, "False"))))) + | "liststr_item" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "stSem_of_list")))))), + e) + | "listsig_item" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "sgSem_of_list")))))), + e) + | "listclass_sig_item" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "cgSem_of_list")))))), + e) + | "listclass_str_item" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "crSem_of_list")))))), + e) + | "listmodule_expr" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "meApp_of_list")))))), + e) + | "listmodule_type" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "mtApp_of_list")))))), + e) + | "listmodule_binding" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "mbAnd_of_list")))))), + e) + | "listbinding" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "biAnd_of_list")))))), + e) + | "listbinding;" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "biSem_of_list")))))), + e) + | "listrec_binding" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "rbSem_of_list")))))), + e) + | "listclass_type" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "ctAnd_of_list")))))), + e) + | "listclass_expr" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "ceAnd_of_list")))))), + e) + | "listident" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "idAcc_of_list")))))), + e) + | "listctypand" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "tyAnd_of_list")))))), + e) + | "listctyp;" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "tySem_of_list")))))), + e) + | "listctyp*" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "tySta_of_list")))))), + e) + | "listctyp|" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "tyOr_of_list")))))), + e) + | "listctyp," -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "tyCom_of_list")))))), + e) + | "listctyp&" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "tyAmp_of_list")))))), + e) + | "listwith_constr" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "wcAnd_of_list")))))), + e) + | "listmatch_case" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "mcOr_of_list")))))), + e) + | "listpatt," -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "paCom_of_list")))))), + e) + | "listpatt;" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "paSem_of_list")))))), + e) + | "listexpr," -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "exCom_of_list")))))), + e) + | "listexpr;" -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdLid (_loc, "exSem_of_list")))))), + e) + | "antisig_item" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "SgAnt")))))), + (mloc _loc))), + e) + | "antistr_item" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "StAnt")))))), + (mloc _loc))), + e) + | "antictyp" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "TyAnt")))))), + (mloc _loc))), + e) + | "antipatt" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "PaAnt")))))), + (mloc _loc))), + e) + | "antiexpr" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "ExAnt")))))), + (mloc _loc))), + e) + | "antimodule_type" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "MtAnt")))))), + (mloc _loc))), + e) + | "antimodule_expr" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "MeAnt")))))), + (mloc _loc))), + e) + | "anticlass_type" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "CtAnt")))))), + (mloc _loc))), + e) + | "anticlass_expr" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "CeAnt")))))), + (mloc _loc))), + e) + | "anticlass_sig_item" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "CgAnt")))))), + (mloc _loc))), + e) + | "anticlass_str_item" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "CrAnt")))))), + (mloc _loc))), + e) + | "antiwith_constr" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "WcAnt")))))), + (mloc _loc))), + e) + | "antibinding" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "BiAnt")))))), + (mloc _loc))), + e) + | "antirec_binding" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "RbAnt")))))), + (mloc _loc))), + e) + | "antimatch_case" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "McAnt")))))), + (mloc _loc))), + e) + | "antimodule_binding" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "MbAnt")))))), + (mloc _loc))), + e) + | "antiident" -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "IdAnt")))))), + (mloc _loc))), + e) + | _ -> e) + | e -> super#expr e + + end + + let add_quotation name entry mexpr mpatt = + let entry_eoi = Gram.Entry.mk (Gram.Entry.name entry) in + let parse_quot_string entry loc s = + let q = !Camlp4_config.antiquotations in + let () = Camlp4_config.antiquotations := true in + let res = Gram.parse_string entry loc s in + let () = Camlp4_config.antiquotations := q in res in + let expand_expr loc loc_name_opt s = + let ast = parse_quot_string entry_eoi loc s in + let () = MetaLoc.loc_name := loc_name_opt in + let meta_ast = mexpr loc ast in + let exp_ast = antiquot_expander#expr meta_ast in exp_ast in + let expand_str_item loc loc_name_opt s = + let exp_ast = expand_expr loc loc_name_opt s + in Ast.StExp (loc, exp_ast) in + let expand_patt _loc loc_name_opt s = + let ast = parse_quot_string entry_eoi _loc s in + let meta_ast = mpatt _loc ast in + let exp_ast = antiquot_expander#patt meta_ast + in + match loc_name_opt with + | None -> exp_ast + | Some name -> + let rec subst_first_loc = + (function + | Ast.PaApp (_loc, + (Ast.PaId (_, + (Ast.IdAcc (_, (Ast.IdUid (_, "Ast")), + (Ast.IdUid (_, u)))))), + _) -> + Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, u)))))), + (Ast.PaId (_loc, (Ast.IdLid (_loc, name))))) + | Ast.PaApp (_loc, a, b) -> + Ast.PaApp (_loc, (subst_first_loc a), b) + | p -> p) + in subst_first_loc exp_ast + in + (Gram.extend (entry_eoi : 'entry_eoi Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (entry : 'entry Gram.Entry.t)); + Gram.Stoken + (((function | EOI -> true | _ -> false), "EOI")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) (x : 'entry) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | EOI -> (x : 'entry_eoi) + | _ -> assert false))) ]) ])) + ()); + Quotation.add name Quotation.DynAst.expr_tag expand_expr; + Quotation.add name Quotation.DynAst.patt_tag expand_patt; + Quotation.add name Quotation.DynAst.str_item_tag expand_str_item) + + let _ = + add_quotation "sig_item" sig_item_quot ME.meta_sig_item MP. + meta_sig_item + + let _ = + add_quotation "str_item" str_item_quot ME.meta_str_item MP. + meta_str_item + + let _ = add_quotation "ctyp" ctyp_quot ME.meta_ctyp MP.meta_ctyp + + let _ = add_quotation "patt" patt_quot ME.meta_patt MP.meta_patt + + let _ = add_quotation "expr" expr_quot ME.meta_expr MP.meta_expr + + let _ = + add_quotation "module_type" module_type_quot ME.meta_module_type + MP.meta_module_type + + let _ = + add_quotation "module_expr" module_expr_quot ME.meta_module_expr + MP.meta_module_expr + + let _ = + add_quotation "class_type" class_type_quot ME.meta_class_type MP. + meta_class_type + + let _ = + add_quotation "class_expr" class_expr_quot ME.meta_class_expr MP. + meta_class_expr + + let _ = + add_quotation "class_sig_item" class_sig_item_quot ME. + meta_class_sig_item MP.meta_class_sig_item + + let _ = + add_quotation "class_str_item" class_str_item_quot ME. + meta_class_str_item MP.meta_class_str_item + + let _ = + add_quotation "with_constr" with_constr_quot ME.meta_with_constr + MP.meta_with_constr + + let _ = + add_quotation "binding" binding_quot ME.meta_binding MP. + meta_binding + + let _ = + add_quotation "rec_binding" rec_binding_quot ME.meta_rec_binding + MP.meta_rec_binding + + let _ = + add_quotation "match_case" match_case_quot ME.meta_match_case MP. + meta_match_case + + let _ = + add_quotation "module_binding" module_binding_quot ME. + meta_module_binding MP.meta_module_binding + + let _ = add_quotation "ident" ident_quot ME.meta_ident MP.meta_ident + + let _ = + add_quotation "rec_flag" rec_flag_quot ME.meta_rec_flag MP. + meta_rec_flag + + let _ = + add_quotation "private_flag" private_flag_quot ME.meta_private_flag + MP.meta_private_flag + + let _ = + add_quotation "row_var_flag" row_var_flag_quot ME.meta_row_var_flag + MP.meta_row_var_flag + + let _ = + add_quotation "mutable_flag" mutable_flag_quot ME.meta_mutable_flag + MP.meta_mutable_flag + + let _ = + add_quotation "virtual_flag" virtual_flag_quot ME.meta_virtual_flag + MP.meta_virtual_flag + + let _ = + add_quotation "override_flag" override_flag_quot ME. + meta_override_flag MP.meta_override_flag + + let _ = + add_quotation "direction_flag" direction_flag_quot ME. + meta_direction_flag MP.meta_direction_flag + + end + + end + +module Q = + struct + open Camlp4 + + (* -*- camlp4r -*- *) + (****************************************************************************) + (* *) + (* Objective Caml *) + (* *) + (* INRIA Rocquencourt *) + (* *) + (* Copyright 2002-2006 Institut National de Recherche en Informatique et *) + (* en Automatique. All rights reserved. This file is distributed under *) + (* the terms of the GNU Library General Public License, with the special *) + (* exception on linking described in LICENSE at the top of the Objective *) + (* Caml source tree. *) + (* *) + (****************************************************************************) + (* Authors: + * - Daniel de Rauglaudre: initial version + * - Nicolas Pouillard: refactoring + *) + module Id = + struct + let name = "Camlp4QuotationExpander" + + let version = Sys.ocaml_version + + end + + module Make (Syntax : Sig.Camlp4Syntax) = + struct + module M = Camlp4QuotationCommon.Make(Syntax)(Syntax.AntiquotSyntax) + + include M + + end + + let _ = let module M = Register.OCamlSyntaxExtension(Id)(Make) in () + + end + +module Rp = + struct + open Camlp4 + + (* -*- camlp4r -*- *) + (****************************************************************************) + (* *) + (* Objective Caml *) + (* *) + (* INRIA Rocquencourt *) + (* *) + (* Copyright 1998-2006 Institut National de Recherche en Informatique et *) + (* en Automatique. All rights reserved. This file is distributed under *) + (* the terms of the GNU Library General Public License, with the special *) + (* exception on linking described in LICENSE at the top of the Objective *) + (* Caml source tree. *) + (* *) + (****************************************************************************) + (* Authors: + * - Daniel de Rauglaudre: initial version + * - Nicolas Pouillard: refactoring + *) + module Id : Sig.Id = + struct + let name = "Camlp4OCamlRevisedParserParser" + + let version = Sys.ocaml_version + + end + + module Make (Syntax : Sig.Camlp4Syntax) = + struct + open Sig + + include Syntax + + type spat_comp = + | SpTrm of Loc.t * Ast.patt * Ast.expr option + | SpNtr of Loc.t * Ast.patt * Ast.expr + | SpStr of Loc.t * Ast.patt + + type sexp_comp = + | SeTrm of Loc.t * Ast.expr | SeNtr of Loc.t * Ast.expr + + let stream_expr = Gram.Entry.mk "stream_expr" + + let stream_begin = Gram.Entry.mk "stream_begin" + + let stream_end = Gram.Entry.mk "stream_end" + + let stream_quot = Gram.Entry.mk "stream_quot" + + let parser_case = Gram.Entry.mk "parser_case" + + let parser_case_list = Gram.Entry.mk "parser_case_list" + + let strm_n = "__strm" + + let peek_fun _loc = + Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdLid (_loc, "peek"))))) + + let junk_fun _loc = + Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdLid (_loc, "junk"))))) + + (* Parsers. *) + (* In syntax generated, many cases are optimisations. *) + let rec pattern_eq_expression p e = + match (p, e) with + | (Ast.PaId (_, (Ast.IdLid (_, a))), + Ast.ExId (_, (Ast.IdLid (_, b)))) -> a = b + | (Ast.PaId (_, (Ast.IdUid (_, a))), + Ast.ExId (_, (Ast.IdUid (_, b)))) -> a = b + | (Ast.PaApp (_, p1, p2), Ast.ExApp (_, e1, e2)) -> + (pattern_eq_expression p1 e1) && (pattern_eq_expression p2 e2) + | _ -> false + + let is_raise e = + match e with + | Ast.ExApp (_, (Ast.ExId (_, (Ast.IdLid (_, "raise")))), _) -> + true + | _ -> false + + let is_raise_failure e = + match e with + | Ast.ExApp (_, (Ast.ExId (_, (Ast.IdLid (_, "raise")))), + (Ast.ExId (_, + (Ast.IdAcc (_, (Ast.IdUid (_, "Stream")), + (Ast.IdUid (_, "Failure"))))))) + -> true + | _ -> false + + let rec handle_failure e = + match e with + | Ast.ExTry (_, _, + (Ast.McArr (_, + (Ast.PaId (_, + (Ast.IdAcc (_, (Ast.IdUid (_, "Stream")), + (Ast.IdUid (_, "Failure")))))), + (Ast.ExNil _), e))) + -> handle_failure e + | Ast.ExMat (_, me, a) -> + let rec match_case_handle_failure = + (function + | Ast.McOr (_, a1, a2) -> + (match_case_handle_failure a1) && + (match_case_handle_failure a2) + | Ast.McArr (_, _, (Ast.ExNil _), e) -> handle_failure e + | _ -> false) + in (handle_failure me) && (match_case_handle_failure a) + | Ast.ExLet (_, Ast.ReNil, bi, e) -> + let rec binding_handle_failure = + (function + | Ast.BiAnd (_, b1, b2) -> + (binding_handle_failure b1) && + (binding_handle_failure b2) + | Ast.BiEq (_, _, e) -> handle_failure e + | _ -> false) + in (binding_handle_failure bi) && (handle_failure e) + | Ast.ExId (_, (Ast.IdLid (_, _))) | Ast.ExInt (_, _) | + Ast.ExStr (_, _) | Ast.ExChr (_, _) | Ast.ExFun (_, _) | + Ast.ExId (_, (Ast.IdUid (_, _))) -> true + | Ast.ExApp (_, (Ast.ExId (_, (Ast.IdLid (_, "raise")))), e) -> + (match e with + | Ast.ExId (_, + (Ast.IdAcc (_, (Ast.IdUid (_, "Stream")), + (Ast.IdUid (_, "Failure"))))) + -> false + | _ -> true) + | Ast.ExApp (_, f, x) -> + (is_constr_apply f) && + ((handle_failure f) && (handle_failure x)) + | _ -> false + and is_constr_apply = + function + | Ast.ExId (_, (Ast.IdUid (_, _))) -> true + | Ast.ExId (_, (Ast.IdLid (_, _))) -> false + | Ast.ExApp (_, x, _) -> is_constr_apply x + | _ -> false + + let rec subst v e = + let _loc = Ast.loc_of_expr e + in + match e with + | Ast.ExId (_, (Ast.IdLid (_, x))) -> + let x = if x = v then strm_n else x + in Ast.ExId (_loc, (Ast.IdLid (_loc, x))) + | Ast.ExId (_, (Ast.IdUid (_, _))) -> e + | Ast.ExInt (_, _) -> e + | Ast.ExChr (_, _) -> e + | Ast.ExStr (_, _) -> e + | Ast.ExAcc (_, _, _) -> e + | Ast.ExLet (_, rf, bi, e) -> + Ast.ExLet (_loc, rf, (subst_binding v bi), (subst v e)) + | Ast.ExApp (_, e1, e2) -> + Ast.ExApp (_loc, (subst v e1), (subst v e2)) + | Ast.ExTup (_, e) -> Ast.ExTup (_loc, (subst v e)) + | Ast.ExCom (_, e1, e2) -> + Ast.ExCom (_loc, (subst v e1), (subst v e2)) + | _ -> raise Not_found + and subst_binding v = + function + | Ast.BiAnd (_loc, b1, b2) -> + Ast.BiAnd (_loc, (subst_binding v b1), (subst_binding v b2)) + | Ast.BiEq (_loc, (Ast.PaId (_, (Ast.IdLid (_, v')))), e) -> + Ast.BiEq (_loc, (Ast.PaId (_loc, (Ast.IdLid (_loc, v')))), + (if v = v' then e else subst v e)) + | _ -> raise Not_found + + let stream_pattern_component skont ckont = + function + | SpTrm (_loc, p, None) -> + Ast.ExMat (_loc, + (Ast.ExApp (_loc, (peek_fun _loc), + (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))), + (Ast.McOr (_loc, + (Ast.McArr (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, (Ast.IdUid (_loc, "Some")))), p)), + (Ast.ExNil _loc), + (Ast.ExSeq (_loc, + (Ast.ExSem (_loc, + (Ast.ExApp (_loc, (junk_fun _loc), + (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))), + skont)))))), + (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), + ckont))))) + | SpTrm (_loc, p, (Some w)) -> + Ast.ExMat (_loc, + (Ast.ExApp (_loc, (peek_fun _loc), + (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))), + (Ast.McOr (_loc, + (Ast.McArr (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, (Ast.IdUid (_loc, "Some")))), p)), + w, + (Ast.ExSeq (_loc, + (Ast.ExSem (_loc, + (Ast.ExApp (_loc, (junk_fun _loc), + (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))), + skont)))))), + (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), + ckont))))) + | SpNtr (_loc, p, e) -> + let e = + (match e with + | Ast.ExFun (_, + (Ast.McArr (_, + (Ast.PaTyc (_, (Ast.PaId (_, (Ast.IdLid (_, v)))), + (Ast.TyApp (_, + (Ast.TyId (_, + (Ast.IdAcc (_, (Ast.IdUid (_, "Stream")), + (Ast.IdLid (_, "t")))))), + (Ast.TyAny _))))), + (Ast.ExNil _), e))) + when v = strm_n -> e + | _ -> + Ast.ExApp (_loc, e, + (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))) + in + if pattern_eq_expression p skont + then + if is_raise_failure ckont + then e + else + if handle_failure e + then e + else + Ast.ExTry (_loc, e, + (Ast.McArr (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdUid (_loc, "Failure")))))), + (Ast.ExNil _loc), ckont))) + else + if is_raise_failure ckont + then + Ast.ExLet (_loc, Ast.ReNil, (Ast.BiEq (_loc, p, e)), + skont) + else + if + pattern_eq_expression + (Ast.PaApp (_loc, + (Ast.PaId (_loc, (Ast.IdUid (_loc, "Some")))), p)) + skont + then + Ast.ExTry (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdUid (_loc, "Some")))), e)), + (Ast.McArr (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdUid (_loc, "Failure")))))), + (Ast.ExNil _loc), ckont))) + else + if is_raise ckont + then + (let tst = + if handle_failure e + then e + else + Ast.ExTry (_loc, e, + (Ast.McArr (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Stream")), + (Ast.IdUid (_loc, "Failure")))))), + (Ast.ExNil _loc), ckont))) + in + Ast.ExLet (_loc, Ast.ReNil, + (Ast.BiEq (_loc, p, tst)), skont)) + else + Ast.ExMat (_loc, + (Ast.ExTry (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdUid (_loc, "Some")))), + e)), + (Ast.McArr (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Stream")), + (Ast.IdUid (_loc, "Failure")))))), + (Ast.ExNil _loc), + (Ast.ExId (_loc, (Ast.IdUid (_loc, "None")))))))), + (Ast.McOr (_loc, + (Ast.McArr (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdUid (_loc, "Some")))), + p)), + (Ast.ExNil _loc), skont)), + (Ast.McArr (_loc, (Ast.PaAny _loc), + (Ast.ExNil _loc), ckont))))) + | SpStr (_loc, p) -> + (try + match p with + | Ast.PaId (_, (Ast.IdLid (_, v))) -> subst v skont + | _ -> raise Not_found + with + | Not_found -> + Ast.ExLet (_loc, Ast.ReNil, + (Ast.BiEq (_loc, p, + (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))), + skont)) + + let rec stream_pattern _loc epo e ekont = + function + | [] -> + (match epo with + | Some ep -> + Ast.ExLet (_loc, Ast.ReNil, + (Ast.BiEq (_loc, ep, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdLid (_loc, "count")))))), + (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))))), + e) + | _ -> e) + | (spc, err) :: spcl -> + let skont = + let ekont err = + let str = + (match err with + | Some estr -> estr + | _ -> Ast.ExStr (_loc, "")) + in + Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdLid (_loc, "raise")))), + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdUid (_loc, "Error")))))), + str))) + in stream_pattern _loc epo e ekont spcl in + let ckont = ekont err + in stream_pattern_component skont ckont spc + + let stream_patterns_term _loc ekont tspel = + let pel = + List.fold_right + (fun (p, w, _loc, spcl, epo, e) acc -> + let p = + Ast.PaApp (_loc, + (Ast.PaId (_loc, (Ast.IdUid (_loc, "Some")))), p) in + let e = + let ekont err = + let str = + match err with + | Some estr -> estr + | _ -> Ast.ExStr (_loc, "") + in + Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdLid (_loc, "raise")))), + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Stream")), + (Ast.IdUid (_loc, "Error")))))), + str))) in + let skont = stream_pattern _loc epo e ekont spcl + in + Ast.ExSeq (_loc, + (Ast.ExSem (_loc, + (Ast.ExApp (_loc, (junk_fun _loc), + (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))), + skont))) + in + match w with + | Some w -> + Ast.McOr (_loc, (Ast.McArr (_loc, p, w, e)), acc) + | None -> + Ast.McOr (_loc, + (Ast.McArr (_loc, p, (Ast.ExNil _loc), e)), acc)) + tspel (Ast.McNil _loc) + in + Ast.ExMat (_loc, + (Ast.ExApp (_loc, (peek_fun _loc), + (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))), + (Ast.McOr (_loc, pel, + (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), + (ekont ())))))) + + let rec group_terms = + function + | ((SpTrm (_loc, p, w), None) :: spcl, epo, e) :: spel -> + let (tspel, spel) = group_terms spel + in (((p, w, _loc, spcl, epo, e) :: tspel), spel) + | spel -> ([], spel) + + let rec parser_cases _loc = + function + | [] -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdLid (_loc, "raise")))), + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdUid (_loc, "Failure"))))))) + | spel -> + (match group_terms spel with + | ([], (spcl, epo, e) :: spel) -> + stream_pattern _loc epo e + (fun _ -> parser_cases _loc spel) spcl + | (tspel, spel) -> + stream_patterns_term _loc + (fun _ -> parser_cases _loc spel) tspel) + + let cparser _loc bpo pc = + let e = parser_cases _loc pc in + let e = + match bpo with + | Some bp -> + Ast.ExLet (_loc, Ast.ReNil, + (Ast.BiEq (_loc, bp, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdLid (_loc, "count")))))), + (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))))), + e) + | None -> e in + let p = + Ast.PaTyc (_loc, (Ast.PaId (_loc, (Ast.IdLid (_loc, strm_n)))), + (Ast.TyApp (_loc, + (Ast.TyId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdLid (_loc, "t")))))), + (Ast.TyAny _loc)))) + in Ast.ExFun (_loc, (Ast.McArr (_loc, p, (Ast.ExNil _loc), e))) + + let cparser_match _loc me bpo pc = + let pc = parser_cases _loc pc in + let e = + match bpo with + | Some bp -> + Ast.ExLet (_loc, Ast.ReNil, + (Ast.BiEq (_loc, bp, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdLid (_loc, "count")))))), + (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))))), + pc) + | None -> pc in + let me = + match me with + | (Ast.ExSem (_loc, _, _) as e) -> Ast.ExSeq (_loc, e) + | e -> e + in + match me with + | Ast.ExId (_, (Ast.IdLid (_, x))) when x = strm_n -> e + | _ -> + Ast.ExLet (_loc, Ast.ReNil, + (Ast.BiEq (_loc, + (Ast.PaTyc (_loc, + (Ast.PaId (_loc, (Ast.IdLid (_loc, strm_n)))), + (Ast.TyApp (_loc, + (Ast.TyId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdLid (_loc, "t")))))), + (Ast.TyAny _loc))))), + me)), + e) + + (* streams *) + let rec not_computing = + function + | Ast.ExId (_, (Ast.IdLid (_, _))) | + Ast.ExId (_, (Ast.IdUid (_, _))) | Ast.ExInt (_, _) | + Ast.ExFlo (_, _) | Ast.ExChr (_, _) | Ast.ExStr (_, _) -> true + | Ast.ExApp (_, x, y) -> + (is_cons_apply_not_computing x) && (not_computing y) + | _ -> false + and is_cons_apply_not_computing = + function + | Ast.ExId (_, (Ast.IdUid (_, _))) -> true + | Ast.ExId (_, (Ast.IdLid (_, _))) -> false + | Ast.ExApp (_, x, y) -> + (is_cons_apply_not_computing x) && (not_computing y) + | _ -> false + + let slazy _loc e = + match e with + | Ast.ExApp (_, f, (Ast.ExId (_, (Ast.IdUid (_, "()"))))) -> + (match f with + | Ast.ExId (_, (Ast.IdLid (_, _))) -> f + | _ -> + Ast.ExFun (_loc, + (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), e)))) + | _ -> + Ast.ExFun (_loc, + (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), e))) + + let rec cstream gloc = + function + | [] -> + let _loc = gloc + in + Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdLid (_loc, "sempty"))))) + | [ SeTrm (_loc, e) ] -> + if not_computing e + then + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdLid (_loc, "ising")))))), + e) + else + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdLid (_loc, "lsing")))))), + (slazy _loc e)) + | SeTrm (_loc, e) :: secl -> + if not_computing e + then + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdLid (_loc, "icons")))))), + e)), + (cstream gloc secl)) + else + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdLid (_loc, "lcons")))))), + (slazy _loc e))), + (cstream gloc secl)) + | [ SeNtr (_loc, e) ] -> + if not_computing e + then e + else + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdLid (_loc, "slazy")))))), + (slazy _loc e)) + | SeNtr (_loc, e) :: secl -> + if not_computing e + then + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdLid (_loc, "iapp")))))), + e)), + (cstream gloc secl)) + else + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), + (Ast.IdLid (_loc, "lapp")))))), + (slazy _loc e))), + (cstream gloc secl)) + + (* Syntax extensions in Revised Syntax grammar *) + let _ = + let _ = (expr : 'expr Gram.Entry.t) + and _ = (parser_case_list : 'parser_case_list Gram.Entry.t) + and _ = (parser_case : 'parser_case Gram.Entry.t) + and _ = (stream_quot : 'stream_quot Gram.Entry.t) + and _ = (stream_end : 'stream_end Gram.Entry.t) + and _ = (stream_begin : 'stream_begin Gram.Entry.t) + and _ = (stream_expr : 'stream_expr Gram.Entry.t) in + let grammar_entry_create = Gram.Entry.mk in + let stream_patt : 'stream_patt Gram.Entry.t = + grammar_entry_create "stream_patt" + and stream_expr_comp : 'stream_expr_comp Gram.Entry.t = + grammar_entry_create "stream_expr_comp" + and stream_expr_comp_list : 'stream_expr_comp_list Gram.Entry.t = + grammar_entry_create "stream_expr_comp_list" + and parser_ipatt : 'parser_ipatt Gram.Entry.t = + grammar_entry_create "parser_ipatt" + and stream_patt_comp : 'stream_patt_comp Gram.Entry.t = + grammar_entry_create "stream_patt_comp" + and stream_patt_comp_err_list : + 'stream_patt_comp_err_list Gram.Entry.t = + grammar_entry_create "stream_patt_comp_err_list" + and stream_patt_comp_err : 'stream_patt_comp_err Gram.Entry.t = + grammar_entry_create "stream_patt_comp_err" + in + (Gram.extend (expr : 'expr Gram.Entry.t) + ((fun () -> + ((Some (Camlp4.Sig.Grammar.Level "top")), + [ (None, None, + [ ([ Gram.Skeyword "match"; + Gram.Snterm + (Gram.Entry.obj + (sequence : 'sequence Gram.Entry.t)); + Gram.Skeyword "with"; Gram.Skeyword "parser"; + Gram.Sopt + (Gram.Snterm + (Gram.Entry.obj + (parser_ipatt : + 'parser_ipatt Gram.Entry.t))); + Gram.Snterm + (Gram.Entry.obj + (parser_case_list : + 'parser_case_list Gram.Entry.t)) ], + (Gram.Action.mk + (fun (pcl : 'parser_case_list) + (po : 'parser_ipatt option) _ _ + (e : 'sequence) _ (_loc : Gram.Loc.t) -> + (cparser_match _loc e po pcl : 'expr)))); + ([ Gram.Skeyword "parser"; + Gram.Sopt + (Gram.Snterm + (Gram.Entry.obj + (parser_ipatt : + 'parser_ipatt Gram.Entry.t))); + Gram.Snterm + (Gram.Entry.obj + (parser_case_list : + 'parser_case_list Gram.Entry.t)) ], + (Gram.Action.mk + (fun (pcl : 'parser_case_list) + (po : 'parser_ipatt option) _ + (_loc : Gram.Loc.t) -> + (cparser _loc po pcl : 'expr)))) ]) ])) + ()); + Gram.extend (parser_case_list : 'parser_case_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (parser_case : 'parser_case Gram.Entry.t)) ], + (Gram.Action.mk + (fun (pc : 'parser_case) (_loc : Gram.Loc.t) -> + ([ pc ] : 'parser_case_list)))); + ([ Gram.Skeyword "["; + Gram.Slist0sep + ((Gram.Snterm + (Gram.Entry.obj + (parser_case : + 'parser_case Gram.Entry.t))), + (Gram.Skeyword "|")); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (pcl : 'parser_case list) _ + (_loc : Gram.Loc.t) -> + (pcl : 'parser_case_list)))) ]) ])) + ()); + Gram.extend (parser_case : 'parser_case Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (stream_begin : 'stream_begin Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (stream_patt : 'stream_patt Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (stream_end : 'stream_end Gram.Entry.t)); + Gram.Sopt + (Gram.Snterm + (Gram.Entry.obj + (parser_ipatt : + 'parser_ipatt Gram.Entry.t))); + Gram.Skeyword "->"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (po : 'parser_ipatt option) _ + (sp : 'stream_patt) _ (_loc : Gram.Loc.t) -> + ((sp, po, e) : 'parser_case)))) ]) ])) + ()); + Gram.extend (stream_begin : 'stream_begin Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "[:" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (() : 'stream_begin)))) ]) ])) + ()); + Gram.extend (stream_end : 'stream_end Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword ":]" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> (() : 'stream_end)))) ]) ])) + ()); + Gram.extend (stream_quot : 'stream_quot Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "`" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (() : 'stream_quot)))) ]) ])) + ()); + Gram.extend (stream_expr : 'stream_expr Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) (_loc : Gram.Loc.t) -> + (e : 'stream_expr)))) ]) ])) + ()); + Gram.extend (stream_patt : 'stream_patt Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> ([] : 'stream_patt)))); + ([ Gram.Snterm + (Gram.Entry.obj + (stream_patt_comp : + 'stream_patt_comp Gram.Entry.t)); + Gram.Skeyword ";"; + Gram.Snterm + (Gram.Entry.obj + (stream_patt_comp_err_list : + 'stream_patt_comp_err_list Gram.Entry.t)) ], + (Gram.Action.mk + (fun (sp : 'stream_patt_comp_err_list) _ + (spc : 'stream_patt_comp) (_loc : Gram.Loc.t) + -> ((spc, None) :: sp : 'stream_patt)))); + ([ Gram.Snterm + (Gram.Entry.obj + (stream_patt_comp : + 'stream_patt_comp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (spc : 'stream_patt_comp) + (_loc : Gram.Loc.t) -> + ([ (spc, None) ] : 'stream_patt)))) ]) ])) + ()); + Gram.extend + (stream_patt_comp_err : 'stream_patt_comp_err Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (stream_patt_comp : + 'stream_patt_comp Gram.Entry.t)); + Gram.Sopt + (Gram.srules stream_patt_comp_err + [ ([ Gram.Skeyword "??"; + Gram.Snterm + (Gram.Entry.obj + (stream_expr : + 'stream_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'stream_expr) _ + (_loc : Gram.Loc.t) -> (e : 'e__14)))) ]) ], + (Gram.Action.mk + (fun (eo : 'e__14 option) + (spc : 'stream_patt_comp) (_loc : Gram.Loc.t) + -> ((spc, eo) : 'stream_patt_comp_err)))) ]) ])) + ()); + Gram.extend + (stream_patt_comp_err_list : + 'stream_patt_comp_err_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (stream_patt_comp_err : + 'stream_patt_comp_err Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Sself ], + (Gram.Action.mk + (fun (sp : 'stream_patt_comp_err_list) _ + (spc : 'stream_patt_comp_err) + (_loc : Gram.Loc.t) -> + (spc :: sp : 'stream_patt_comp_err_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (stream_patt_comp_err : + 'stream_patt_comp_err Gram.Entry.t)); + Gram.Skeyword ";" ], + (Gram.Action.mk + (fun _ (spc : 'stream_patt_comp_err) + (_loc : Gram.Loc.t) -> + ([ spc ] : 'stream_patt_comp_err_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (stream_patt_comp_err : + 'stream_patt_comp_err Gram.Entry.t)) ], + (Gram.Action.mk + (fun (spc : 'stream_patt_comp_err) + (_loc : Gram.Loc.t) -> + ([ spc ] : 'stream_patt_comp_err_list)))) ]) ])) + ()); + Gram.extend (stream_patt_comp : 'stream_patt_comp Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p : 'patt) (_loc : Gram.Loc.t) -> + (SpStr (_loc, p) : 'stream_patt_comp)))); + ([ Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj + (stream_expr : 'stream_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'stream_expr) _ (p : 'patt) + (_loc : Gram.Loc.t) -> + (SpNtr (_loc, p, e) : 'stream_patt_comp)))); + ([ Gram.Snterm + (Gram.Entry.obj + (stream_quot : 'stream_quot Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); + Gram.Sopt + (Gram.srules stream_patt_comp + [ ([ Gram.Skeyword "when"; + Gram.Snterm + (Gram.Entry.obj + (stream_expr : + 'stream_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'stream_expr) _ + (_loc : Gram.Loc.t) -> (e : 'e__15)))) ]) ], + (Gram.Action.mk + (fun (eo : 'e__15 option) (p : 'patt) _ + (_loc : Gram.Loc.t) -> + (SpTrm (_loc, p, eo) : 'stream_patt_comp)))) ]) ])) + ()); + Gram.extend (parser_ipatt : 'parser_ipatt Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "_" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.PaAny _loc : 'parser_ipatt)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> + (Ast.PaId (_loc, (Ast.IdLid (_loc, i))) : + 'parser_ipatt)))) ]) ])) + ()); + Gram.extend (expr : 'expr Gram.Entry.t) + ((fun () -> + ((Some (Camlp4.Sig.Grammar.Level "simple")), + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (stream_begin : 'stream_begin Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (stream_expr_comp_list : + 'stream_expr_comp_list Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (stream_end : 'stream_end Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (sel : 'stream_expr_comp_list) _ + (_loc : Gram.Loc.t) -> + (cstream _loc sel : 'expr)))); + ([ Gram.Snterm + (Gram.Entry.obj + (stream_begin : 'stream_begin Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (stream_end : 'stream_end Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (cstream _loc [] : 'expr)))) ]) ])) + ()); + Gram.extend + (stream_expr_comp_list : 'stream_expr_comp_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (stream_expr_comp : + 'stream_expr_comp Gram.Entry.t)) ], + (Gram.Action.mk + (fun (se : 'stream_expr_comp) + (_loc : Gram.Loc.t) -> + ([ se ] : 'stream_expr_comp_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (stream_expr_comp : + 'stream_expr_comp Gram.Entry.t)); + Gram.Skeyword ";" ], + (Gram.Action.mk + (fun _ (se : 'stream_expr_comp) + (_loc : Gram.Loc.t) -> + ([ se ] : 'stream_expr_comp_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (stream_expr_comp : + 'stream_expr_comp Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Sself ], + (Gram.Action.mk + (fun (sel : 'stream_expr_comp_list) _ + (se : 'stream_expr_comp) (_loc : Gram.Loc.t) + -> (se :: sel : 'stream_expr_comp_list)))) ]) ])) + ()); + Gram.extend (stream_expr_comp : 'stream_expr_comp Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (stream_expr : 'stream_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'stream_expr) (_loc : Gram.Loc.t) -> + (SeNtr (_loc, e) : 'stream_expr_comp)))); + ([ Gram.Snterm + (Gram.Entry.obj + (stream_quot : 'stream_quot Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (stream_expr : 'stream_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'stream_expr) _ (_loc : Gram.Loc.t) -> + (SeTrm (_loc, e) : 'stream_expr_comp)))) ]) ])) + ())) + + end + + module M = Register.OCamlSyntaxExtension(Id)(Make) + + end + +module G = + struct + open Camlp4 + + (* -*- camlp4r -*- *) + (****************************************************************************) + (* *) + (* Objective Caml *) + (* *) + (* INRIA Rocquencourt *) + (* *) + (* Copyright 2002-2006 Institut National de Recherche en Informatique et *) + (* en Automatique. All rights reserved. This file is distributed under *) + (* the terms of the GNU Library General Public License, with the special *) + (* exception on linking described in LICENSE at the top of the Objective *) + (* Caml source tree. *) + (* *) + (****************************************************************************) + (* Authors: + * - Daniel de Rauglaudre: initial version + * - Nicolas Pouillard: refactoring + *) + module Id = + struct let name = "Camlp4GrammarParser" + let version = Sys.ocaml_version + + end + + module Make (Syntax : Sig.Camlp4Syntax) = + struct + open Sig + + include Syntax + + module MetaLoc = Ast.Meta.MetaGhostLoc + + module MetaAst = Ast.Meta.Make(MetaLoc) + + module PP = Camlp4.Printers.OCaml.Make(Syntax) + + let pp = new PP.printer ~comments: false () + + let string_of_patt patt = + let buf = Buffer.create 42 in + let () = Format.bprintf buf "%a@?" pp#patt patt in + let str = Buffer.contents buf + in if str = "" then assert false else str + + let split_ext = ref false + + type loc = Loc.t + + type 'e name = { expr : 'e; tvar : string; loc : loc } + + type styp = + | STlid of loc * string + | STapp of loc * styp * styp + | STquo of loc * string + | STself of loc * string + | STtok of loc + | STstring_tok of loc + | STtyp of Ast.ctyp + + type ('e, 'p) text = + | TXmeta of loc * string * (('e, 'p) text) list * 'e * styp + | TXlist of loc * bool * ('e, 'p) symbol * (('e, 'p) symbol) option + | TXnext of loc + | TXnterm of loc * 'e name * string option + | TXopt of loc * ('e, 'p) text + | TXtry of loc * ('e, 'p) text + | TXrules of loc * (((('e, 'p) text) list) * 'e) list + | TXself of loc + | TXkwd of loc * string + | TXtok of loc * 'e * string + and (** The first is the match function expr, + the second is the string description. + The description string will be used for + grammar insertion and left factoring. + Keep this string normalized and well comparable. *) + ('e, 'p) entry = + { name : 'e name; pos : 'e option; levels : (('e, 'p) level) list + } + and ('e, 'p) level = + { label : string option; assoc : 'e option; + rules : (('e, 'p) rule) list + } + and ('e, 'p) rule = + { prod : (('e, 'p) symbol) list; action : 'e option + } + and ('e, 'p) symbol = + { used : string list; text : ('e, 'p) text; styp : styp; + pattern : 'p option + } + + type used = | Unused | UsedScanned | UsedNotScanned + + let _loc = Loc.ghost + + let gm = "Camlp4Grammar__" + + let mark_used modif ht n = + try + let rll = Hashtbl.find_all ht n + in + List.iter + (fun (r, _) -> + if !r == Unused + then (r := UsedNotScanned; modif := true) + else ()) + rll + with | Not_found -> () + + let rec mark_symbol modif ht symb = + List.iter (fun e -> mark_used modif ht e) symb.used + + let check_use nl el = + let ht = Hashtbl.create 301 in + let modif = ref false + in + (List.iter + (fun e -> + let u = + match e.name.expr with + | Ast.ExId (_, (Ast.IdLid (_, _))) -> Unused + | _ -> UsedNotScanned + in Hashtbl.add ht e.name.tvar ((ref u), e)) + el; + List.iter + (fun n -> + try + let rll = Hashtbl.find_all ht n.tvar + in List.iter (fun (r, _) -> r := UsedNotScanned) rll + with | _ -> ()) + nl; + modif := true; + while !modif do modif := false; + Hashtbl.iter + (fun _ (r, e) -> + if !r = UsedNotScanned + then + (r := UsedScanned; + List.iter + (fun level -> + let rules = level.rules + in + List.iter + (fun rule -> + List.iter + (fun s -> mark_symbol modif ht s) + rule.prod) + rules) + e.levels) + else ()) + ht + done; + Hashtbl.iter + (fun s (r, e) -> + if !r = Unused + then + print_warning e.name.loc + ("Unused local entry \"" ^ (s ^ "\"")) + else ()) + ht) + + let new_type_var = + let i = ref 0 in fun () -> (incr i; "e__" ^ (string_of_int !i)) + + let used_of_rule_list rl = + List.fold_left + (fun nl r -> List.fold_left (fun nl s -> s.used @ nl) nl r.prod) + [] rl + + let retype_rule_list_without_patterns _loc rl = + try + List.map + (function + | (* ...; [ "foo" ]; ... ==> ...; (x = [ "foo" ] -> Gram.Token.extract_string x); ... *) + { + prod = [ ({ pattern = None; styp = STtok _ } as s) ]; + action = None + } -> + { + prod = + [ { + (s) + with + pattern = + Some (Ast.PaId (_loc, (Ast.IdLid (_loc, "x")))); + } ]; + action = + Some + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Token")), + (Ast.IdLid (_loc, "extract_string")))))))), + (Ast.ExId (_loc, (Ast.IdLid (_loc, "x")))))); + } + | (* ...; [ symb ]; ... ==> ...; (x = [ symb ] -> x); ... *) + { prod = [ ({ pattern = None } as s) ]; action = None } -> + { + prod = + [ { + (s) + with + pattern = + Some (Ast.PaId (_loc, (Ast.IdLid (_loc, "x")))); + } ]; + action = Some (Ast.ExId (_loc, (Ast.IdLid (_loc, "x")))); + } + | (* ...; ([] -> a); ... *) + ({ prod = []; action = Some _ } as r) -> r + | _ -> raise Exit) + rl + with | Exit -> rl + + let meta_action = ref false + + let mklistexp _loc = + let rec loop top = + function + | [] -> Ast.ExId (_loc, (Ast.IdUid (_loc, "[]"))) + | e1 :: el -> + let _loc = + if top then _loc else Loc.merge (Ast.loc_of_expr e1) _loc + in + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdUid (_loc, "::")))), e1)), + (loop false el)) + in loop true + + let mklistpat _loc = + let rec loop top = + function + | [] -> Ast.PaId (_loc, (Ast.IdUid (_loc, "[]"))) + | p1 :: pl -> + let _loc = + if top then _loc else Loc.merge (Ast.loc_of_patt p1) _loc + in + Ast.PaApp (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, (Ast.IdUid (_loc, "::")))), p1)), + (loop false pl)) + in loop true + + let rec expr_fa al = + function + | Ast.ExApp (_, f, a) -> expr_fa (a :: al) f + | f -> (f, al) + + let rec make_ctyp styp tvar = + match styp with + | STlid (_loc, s) -> Ast.TyId (_loc, (Ast.IdLid (_loc, s))) + | STapp (_loc, t1, t2) -> + Ast.TyApp (_loc, (make_ctyp t1 tvar), (make_ctyp t2 tvar)) + | STquo (_loc, s) -> Ast.TyQuo (_loc, s) + | STself (_loc, x) -> + if tvar = "" + then + Loc.raise _loc + (Stream.Error + ("'" ^ (x ^ "' illegal in anonymous entry level"))) + else Ast.TyQuo (_loc, tvar) + | STtok _loc -> + Ast.TyId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Token")))), + (Ast.IdLid (_loc, "t"))))) + | STstring_tok _loc -> + Ast.TyId (_loc, (Ast.IdLid (_loc, "string"))) + | STtyp t -> t + + let make_ctyp_patt styp tvar patt = + let styp = + match styp with | STstring_tok _loc -> STtok _loc | t -> t + in + match make_ctyp styp tvar with + | Ast.TyAny _ -> patt + | t -> + let _loc = Ast.loc_of_patt patt in Ast.PaTyc (_loc, patt, t) + + let make_ctyp_expr styp tvar expr = + match make_ctyp styp tvar with + | Ast.TyAny _ -> expr + | t -> let _loc = Ast.loc_of_expr expr in Ast.ExTyc (_loc, expr, t) + + let text_of_action _loc psl rtvar act tvar = + let locid = Ast.PaId (_loc, (Ast.IdLid (_loc, !Loc.name))) in + let act = + match act with + | Some act -> act + | None -> Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))) in + let (tok_match_pl, act, _) = + List.fold_left + (fun (((tok_match_pl, act, i) as accu)) -> + function + | { pattern = None } -> accu + | { pattern = Some p } when Ast.is_irrefut_patt p -> accu + | { + pattern = + Some + (Ast.PaAli (_, + (Ast.PaApp (_, _, (Ast.PaTup (_, (Ast.PaAny _))))), + (Ast.PaId (_, (Ast.IdLid (_, s)))))) + } -> + (tok_match_pl, + (Ast.ExLet (_loc, Ast.ReNil, + (Ast.BiEq (_loc, + (Ast.PaId (_loc, (Ast.IdLid (_loc, s)))), + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Token")), + (Ast.IdLid (_loc, "extract_string")))))))), + (Ast.ExId (_loc, (Ast.IdLid (_loc, s)))))))), + act)), + i) + | { pattern = Some p; text = TXtok (_, _, _) } -> + let id = "__camlp4_" ^ (string_of_int i) + in + ((Some + (match tok_match_pl with + | None -> + ((Ast.ExId (_loc, (Ast.IdLid (_loc, id)))), + p) + | Some ((tok_pl, match_pl)) -> + ((Ast.ExCom (_loc, + (Ast.ExId (_loc, (Ast.IdLid (_loc, id)))), + tok_pl)), + (Ast.PaCom (_loc, p, match_pl))))), + act, (succ i)) + | _ -> accu) + (None, act, 0) psl in + let e = + let e1 = Ast.ExTyc (_loc, act, (Ast.TyQuo (_loc, rtvar))) in + let e2 = + match tok_match_pl with + | None -> e1 + | Some ((Ast.ExCom (_, t1, t2), Ast.PaCom (_, p1, p2))) -> + Ast.ExMat (_loc, + (Ast.ExTup (_loc, (Ast.ExCom (_loc, t1, t2)))), + (Ast.McOr (_loc, + (Ast.McArr (_loc, + (Ast.PaTup (_loc, (Ast.PaCom (_loc, p1, p2)))), + (Ast.ExNil _loc), e1)), + (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), + (Ast.ExAsf _loc)))))) + | Some ((tok, match_)) -> + Ast.ExMat (_loc, tok, + (Ast.McOr (_loc, + (Ast.McArr (_loc, match_, (Ast.ExNil _loc), e1)), + (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), + (Ast.ExAsf _loc)))))) + in + Ast.ExFun (_loc, + (Ast.McArr (_loc, + (Ast.PaTyc (_loc, locid, + (Ast.TyId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Loc")))), + (Ast.IdLid (_loc, "t")))))))), + (Ast.ExNil _loc), e2))) in + let (txt, _) = + List.fold_left + (fun (txt, i) s -> + match s.pattern with + | None | Some (Ast.PaAny _) -> + ((Ast.ExFun (_loc, + (Ast.McArr (_loc, (Ast.PaAny _loc), + (Ast.ExNil _loc), txt)))), + i) + | Some + (Ast.PaAli (_, + (Ast.PaApp (_, _, (Ast.PaTup (_, (Ast.PaAny _))))), + p)) + -> + let p = make_ctyp_patt s.styp tvar p + in + ((Ast.ExFun (_loc, + (Ast.McArr (_loc, p, (Ast.ExNil _loc), txt)))), + i) + | Some p when Ast.is_irrefut_patt p -> + let p = make_ctyp_patt s.styp tvar p + in + ((Ast.ExFun (_loc, + (Ast.McArr (_loc, p, (Ast.ExNil _loc), txt)))), + i) + | Some _ -> + let p = + make_ctyp_patt s.styp tvar + (Ast.PaId (_loc, + (Ast.IdLid (_loc, + ("__camlp4_" ^ (string_of_int i)))))) + in + ((Ast.ExFun (_loc, + (Ast.McArr (_loc, p, (Ast.ExNil _loc), txt)))), + (succ i))) + (e, 0) psl in + let txt = + if !meta_action + then + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Obj")), + (Ast.IdLid (_loc, "magic")))))), + (MetaAst.Expr.meta_expr _loc txt)) + else txt + in + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Action")), + (Ast.IdLid (_loc, "mk")))))))), + txt) + + let srules loc t rl tvar = + List.map + (fun r -> + let sl = List.map (fun s -> s.text) r.prod in + let ac = text_of_action loc r.prod t r.action tvar in (sl, ac)) + rl + + let rec make_expr entry tvar = + function + | TXmeta (_loc, n, tl, e, t) -> + let el = + List.fold_right + (fun t el -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdUid (_loc, "::")))), + (make_expr entry "" t))), + el)) + tl (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]")))) + in + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Smeta")))))), + (Ast.ExStr (_loc, n)))), + el)), + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Action")), + (Ast.IdLid (_loc, "mk")))))))), + (make_ctyp_expr t tvar e)))) + | TXlist (_loc, min, t, ts) -> + let txt = make_expr entry "" t.text + in + (match (min, ts) with + | (false, None) -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Slist0")))))), + txt) + | (true, None) -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Slist1")))))), + txt) + | (false, Some s) -> + let x = make_expr entry tvar s.text + in + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Slist0sep")))))), + txt)), + x) + | (true, Some s) -> + let x = make_expr entry tvar s.text + in + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Slist1sep")))))), + txt)), + x)) + | TXnext _loc -> + Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Snext"))))) + | TXnterm (_loc, n, lev) -> + (match lev with + | Some lab -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Snterml")))))), + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Entry")), + (Ast.IdLid (_loc, "obj")))))))), + (Ast.ExTyc (_loc, n.expr, + (Ast.TyApp (_loc, + (Ast.TyId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Entry")))), + (Ast.IdLid (_loc, "t")))))), + (Ast.TyQuo (_loc, n.tvar)))))))))), + (Ast.ExStr (_loc, lab))) + | None -> + if n.tvar = tvar + then + Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Sself"))))) + else + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Snterm")))))), + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Entry")), + (Ast.IdLid (_loc, "obj")))))))), + (Ast.ExTyc (_loc, n.expr, + (Ast.TyApp (_loc, + (Ast.TyId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Entry")))), + (Ast.IdLid (_loc, "t")))))), + (Ast.TyQuo (_loc, n.tvar)))))))))) + | TXopt (_loc, t) -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Sopt")))))), + (make_expr entry "" t)) + | TXtry (_loc, t) -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Stry")))))), + (make_expr entry "" t)) + | TXrules (_loc, rl) -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdLid (_loc, "srules")))))), + entry.expr)), + (make_expr_rules _loc entry rl "")) + | TXself _loc -> + Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Sself"))))) + | TXkwd (_loc, kwd) -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Skeyword")))))), + (Ast.ExStr (_loc, kwd))) + | TXtok (_loc, match_fun, descr) -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Stoken")))))), + (Ast.ExTup (_loc, + (Ast.ExCom (_loc, match_fun, + (Ast.ExStr (_loc, (Ast.safe_string_escaped descr)))))))) + and make_expr_rules _loc n rl tvar = + List.fold_left + (fun txt (sl, ac) -> + let sl = + List.fold_right + (fun t txt -> + let x = make_expr n tvar t + in + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdUid (_loc, "::")))), x)), + txt)) + sl (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]")))) + in + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdUid (_loc, "::")))), + (Ast.ExTup (_loc, (Ast.ExCom (_loc, sl, ac)))))), + txt)) + (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]")))) rl + + let expr_of_delete_rule _loc n sl = + let sl = + List.fold_right + (fun s e -> + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdUid (_loc, "::")))), + (make_expr n "" s.text))), + e)) + sl (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]")))) + in ((n.expr), sl) + + let rec tvar_of_ident = + function + | Ast.IdLid (_, x) | Ast.IdUid (_, x) -> x + | Ast.IdAcc (_, (Ast.IdUid (_, x)), xs) -> + x ^ ("__" ^ (tvar_of_ident xs)) + | _ -> failwith "internal error in the Grammar extension" + + let mk_name _loc i = + { expr = Ast.ExId (_loc, i); tvar = tvar_of_ident i; loc = _loc; } + + let slist loc min sep symb = TXlist (loc, min, symb, sep) + + (* + value sstoken _loc s = + let n = mk_name _loc <:ident< $lid:"a_" ^ s$ >> in + TXnterm _loc n None + ; + + value mk_symbol p s t = + {used = []; text = s; styp = t; pattern=Some p}; + + value sslist _loc min sep s = + let rl = + let r1 = + let prod = + let n = mk_name _loc <:ident< a_list >> in + [mk_symbol <:patt< a >> (TXnterm _loc n None) (STquo _loc "a_list")] + in + let act = <:expr< a >> in + {prod = prod; action = Some act} + in + let r2 = + let prod = + [mk_symbol <:patt< a >> (slist _loc min sep s) + (STapp _loc (STlid _loc "list") s.styp)] + in + let act = <:expr< Qast.List a >> in + {prod = prod; action = Some act} + in + [r1; r2] + in + let used = + match sep with + [ Some symb -> symb.used @ s.used + | None -> s.used ] + in + let used = ["a_list" :: used] in + let text = TXrules _loc (srules _loc "a_list" rl "") in + let styp = STquo _loc "a_list" in + {used = used; text = text; styp = styp; pattern = None} + ; + + value ssopt _loc s = + let rl = + let r1 = + let prod = + let n = mk_name _loc <:ident< a_opt >> in + [mk_symbol <:patt< a >> (TXnterm _loc n None) (STquo _loc "a_opt")] + in + let act = <:expr< a >> in + {prod = prod; action = Some act} + in + let r2 = + let s = + match s.text with + [ TXkwd _loc _ | TXtok _loc _ _ -> + let rl = + [{prod = [{ (s) with pattern = Some <:patt< x >> }]; + action = Some <:expr< Qast.Str (Token.extract_string x) >>}] + in + let t = new_type_var () in + {used = []; text = TXrules _loc (srules _loc t rl ""); + styp = STquo _loc t; pattern = None} + | _ -> s ] + in + let prod = + [mk_symbol <:patt< a >> (TXopt _loc s.text) + (STapp _loc (STlid _loc "option") s.styp)] + in + let act = <:expr< Qast.Option a >> in + {prod = prod; action = Some act} + in + [r1; r2] + in + let used = ["a_opt" :: s.used] in + let text = TXrules _loc (srules _loc "a_opt" rl "") in + let styp = STquo _loc "a_opt" in + {used = used; text = text; styp = styp; pattern = None} + ; + *) + let text_of_entry _loc e = + let ent = + let x = e.name in + let _loc = e.name.loc + in + Ast.ExTyc (_loc, x.expr, + (Ast.TyApp (_loc, + (Ast.TyId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Entry")))), + (Ast.IdLid (_loc, "t")))))), + (Ast.TyQuo (_loc, x.tvar))))) in + let pos = + match e.pos with + | Some pos -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdUid (_loc, "Some")))), pos) + | None -> Ast.ExId (_loc, (Ast.IdUid (_loc, "None"))) in + let txt = + List.fold_right + (fun level txt -> + let lab = + match level.label with + | Some lab -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdUid (_loc, "Some")))), + (Ast.ExStr (_loc, lab))) + | None -> Ast.ExId (_loc, (Ast.IdUid (_loc, "None"))) in + let ass = + match level.assoc with + | Some ass -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdUid (_loc, "Some")))), ass) + | None -> Ast.ExId (_loc, (Ast.IdUid (_loc, "None"))) in + let txt = + let rl = + srules _loc e.name.tvar level.rules e.name.tvar in + let e = make_expr_rules _loc e.name rl e.name.tvar + in + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdUid (_loc, "::")))), + (Ast.ExTup (_loc, + (Ast.ExCom (_loc, lab, + (Ast.ExCom (_loc, ass, e)))))))), + txt) + in txt) + e.levels (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]")))) + in (ent, pos, txt) + + let let_in_of_extend _loc gram gl el args = + match gl with + | None -> args + | Some nl -> + (check_use nl el; + let ll = + let same_tvar e n = e.name.tvar = n.tvar + in + List.fold_right + (fun e ll -> + match e.name.expr with + | Ast.ExId (_, (Ast.IdLid (_, _))) -> + if List.exists (same_tvar e) nl + then ll + else + if List.exists (same_tvar e) ll + then ll + else e.name :: ll + | _ -> ll) + el [] in + let local_binding_of_name { expr = e; tvar = x; loc = _loc } = + let i = + (match e with + | Ast.ExId (_, (Ast.IdLid (_, i))) -> i + | _ -> failwith "internal error in the Grammar extension") + in + Ast.BiEq (_loc, (Ast.PaId (_loc, (Ast.IdLid (_loc, i)))), + (Ast.ExTyc (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdLid (_loc, "grammar_entry_create")))), + (Ast.ExStr (_loc, i)))), + (Ast.TyApp (_loc, + (Ast.TyId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Entry")))), + (Ast.IdLid (_loc, "t")))))), + (Ast.TyQuo (_loc, x))))))) in + let expr_of_name { expr = e; tvar = x; loc = _loc } = + Ast.ExTyc (_loc, e, + (Ast.TyApp (_loc, + (Ast.TyId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdUid (_loc, "Entry")))), + (Ast.IdLid (_loc, "t")))))), + (Ast.TyQuo (_loc, x))))) in + let e = + (match ll with + | [] -> args + | x :: xs -> + let locals = + List.fold_right + (fun name acc -> + Ast.BiAnd (_loc, acc, + (local_binding_of_name name))) + xs (local_binding_of_name x) in + let entry_mk = + (match gram with + | Some g -> + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Entry")), + (Ast.IdLid (_loc, "mk")))))))), + (Ast.ExId (_loc, g))) + | None -> + Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Entry")), + (Ast.IdLid (_loc, "mk")))))))) + in + Ast.ExLet (_loc, Ast.ReNil, + (Ast.BiEq (_loc, + (Ast.PaId (_loc, + (Ast.IdLid (_loc, "grammar_entry_create")))), + entry_mk)), + (Ast.ExLet (_loc, Ast.ReNil, locals, args)))) + in + (match nl with + | [] -> e + | x :: xs -> + let globals = + List.fold_right + (fun name acc -> + Ast.BiAnd (_loc, acc, + (Ast.BiEq (_loc, (Ast.PaAny _loc), + (expr_of_name name))))) + xs + (Ast.BiEq (_loc, (Ast.PaAny _loc), + (expr_of_name x))) + in Ast.ExLet (_loc, Ast.ReNil, globals, e))) + + class subst gmod = + object inherit Ast.map as super + + method ident = + function + | Ast.IdUid (_, x) when x = gm -> gmod + | x -> super#ident x + + end + + let subst_gmod ast gmod = (new subst gmod)#expr ast + + let text_of_functorial_extend _loc gmod gram gl el = + let args = + let el = + List.map + (fun e -> + let (ent, pos, txt) = text_of_entry e.name.loc e in + let e = + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdLid (_loc, "extend")))))), + ent)), + (Ast.ExApp (_loc, + (Ast.ExFun (_loc, + (Ast.McArr (_loc, + (Ast.PaId (_loc, (Ast.IdUid (_loc, "()")))), + (Ast.ExNil _loc), + (Ast.ExTup (_loc, + (Ast.ExCom (_loc, pos, txt)))))))), + (Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))))))) + in + if !split_ext + then + Ast.ExLet (_loc, Ast.ReNil, + (Ast.BiEq (_loc, + (Ast.PaId (_loc, (Ast.IdLid (_loc, "aux")))), + (Ast.ExFun (_loc, + (Ast.McArr (_loc, + (Ast.PaId (_loc, (Ast.IdUid (_loc, "()")))), + (Ast.ExNil _loc), e)))))), + (Ast.ExApp (_loc, + (Ast.ExId (_loc, (Ast.IdLid (_loc, "aux")))), + (Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))))))) + else e) + el + in + match el with + | [] -> Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))) + | [ e ] -> e + | e :: el -> + Ast.ExSeq (_loc, + (List.fold_left (fun acc x -> Ast.ExSem (_loc, acc, x)) e + el)) + in subst_gmod (let_in_of_extend _loc gram gl el args) gmod + + let wildcarder = + object (self) + inherit Ast.map as super + + method patt = + function + | Ast.PaId (_loc, (Ast.IdLid (_, _))) -> Ast.PaAny _loc + | Ast.PaAli (_, p, _) -> self#patt p + | p -> super#patt p + + end + + let mk_tok _loc p t = + let p' = wildcarder#patt p in + let match_fun = + if Ast.is_irrefut_patt p' + then + Ast.ExFun (_loc, + (Ast.McArr (_loc, p', (Ast.ExNil _loc), + (Ast.ExId (_loc, (Ast.IdUid (_loc, "True"))))))) + else + Ast.ExFun (_loc, + (Ast.McOr (_loc, + (Ast.McArr (_loc, p', (Ast.ExNil _loc), + (Ast.ExId (_loc, (Ast.IdUid (_loc, "True")))))), + (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), + (Ast.ExId (_loc, (Ast.IdUid (_loc, "False"))))))))) in + let descr = string_of_patt p' in + let text = TXtok (_loc, match_fun, descr) + in { used = []; text = text; styp = t; pattern = Some p; } + + let symbol = Gram.Entry.mk "symbol" + + let check_not_tok s = + match s with + | { text = TXtok (_loc, _, _) } -> + Loc.raise _loc + (Stream.Error + ("Deprecated syntax, use a sub rule. " ^ + "LIST0 STRING becomes LIST0 [ x = STRING -> x ]")) + | _ -> () + + let _ = Camlp4_config.antiquotations := true + + let _ = + let _ = (expr : 'expr Gram.Entry.t) + and _ = (symbol : 'symbol Gram.Entry.t) in + let grammar_entry_create = Gram.Entry.mk in + let extend_header : 'extend_header Gram.Entry.t = + grammar_entry_create "extend_header" + and semi_sep : 'semi_sep Gram.Entry.t = + grammar_entry_create "semi_sep" + and string : 'string Gram.Entry.t = grammar_entry_create "string" + and name : 'name Gram.Entry.t = grammar_entry_create "name" + and comma_patt : 'comma_patt Gram.Entry.t = + grammar_entry_create "comma_patt" + and pattern : 'pattern Gram.Entry.t = + grammar_entry_create "pattern" + and psymbol : 'psymbol Gram.Entry.t = + grammar_entry_create "psymbol" + and rule : 'rule Gram.Entry.t = grammar_entry_create "rule" + and rule_list : 'rule_list Gram.Entry.t = + grammar_entry_create "rule_list" + and assoc : 'assoc Gram.Entry.t = grammar_entry_create "assoc" + and level : 'level Gram.Entry.t = grammar_entry_create "level" + and level_list : 'level_list Gram.Entry.t = + grammar_entry_create "level_list" + and position : 'position Gram.Entry.t = + grammar_entry_create "position" + and entry : 'entry Gram.Entry.t = grammar_entry_create "entry" + and global : 'global Gram.Entry.t = grammar_entry_create "global" + and t_qualid : 't_qualid Gram.Entry.t = + grammar_entry_create "t_qualid" + and qualid : 'qualid Gram.Entry.t = grammar_entry_create "qualid" + and qualuid : 'qualuid Gram.Entry.t = + grammar_entry_create "qualuid" + and delete_rule_body : 'delete_rule_body Gram.Entry.t = + grammar_entry_create "delete_rule_body" + and extend_body : 'extend_body Gram.Entry.t = + grammar_entry_create "extend_body" + in + (Gram.extend (expr : 'expr Gram.Entry.t) + ((fun () -> + ((Some (Camlp4.Sig.Grammar.After "top")), + [ (None, None, + [ ([ Gram.Skeyword "GEXTEND" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Loc.raise _loc + (Stream.Error + "Deprecated syntax, use EXTEND MyGramModule ... END instead") : + 'expr)))); + ([ Gram.Skeyword "GDELETE_RULE" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Loc.raise _loc + (Stream.Error + "Deprecated syntax, use DELETE_RULE MyGramModule ... END instead") : + 'expr)))); + ([ Gram.Skeyword "DELETE_RULE"; + Gram.Snterm + (Gram.Entry.obj + (delete_rule_body : + 'delete_rule_body Gram.Entry.t)); + Gram.Skeyword "END" ], + (Gram.Action.mk + (fun _ (e : 'delete_rule_body) _ + (_loc : Gram.Loc.t) -> (e : 'expr)))); + ([ Gram.Skeyword "EXTEND"; + Gram.Snterm + (Gram.Entry.obj + (extend_body : 'extend_body Gram.Entry.t)); + Gram.Skeyword "END" ], + (Gram.Action.mk + (fun _ (e : 'extend_body) _ (_loc : Gram.Loc.t) + -> (e : 'expr)))) ]) ])) + ()); + Gram.extend (extend_header : 'extend_header Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (qualuid : 'qualuid Gram.Entry.t)) ], + (Gram.Action.mk + (fun (g : 'qualuid) (_loc : Gram.Loc.t) -> + ((None, g) : 'extend_header)))); + ([ Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj (qualid : 'qualid Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Snterm + (Gram.Entry.obj + (t_qualid : 't_qualid Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (t : 't_qualid) _ (i : 'qualid) _ + (_loc : Gram.Loc.t) -> + (((Some i), t) : 'extend_header)))) ]) ])) + ()); + Gram.extend (extend_body : 'extend_body Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (extend_header : + 'extend_header Gram.Entry.t)); + Gram.Sopt + (Gram.Snterm + (Gram.Entry.obj + (global : 'global Gram.Entry.t))); + Gram.Slist1 + (Gram.srules extend_body + [ ([ Gram.Snterm + (Gram.Entry.obj + (entry : 'entry Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (semi_sep : + 'semi_sep Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (e : 'entry) + (_loc : Gram.Loc.t) -> (e : 'e__16)))) ]) ], + (Gram.Action.mk + (fun (el : 'e__16 list) + (global_list : 'global option) + ((gram, g) : 'extend_header) + (_loc : Gram.Loc.t) -> + (text_of_functorial_extend _loc g gram + global_list el : + 'extend_body)))) ]) ])) + ()); + Gram.extend (delete_rule_body : 'delete_rule_body Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (qualuid : 'qualuid Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (name : 'name Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Slist0sep + ((Gram.Snterm + (Gram.Entry.obj + (symbol : 'symbol Gram.Entry.t))), + (Gram.Snterm + (Gram.Entry.obj + (semi_sep : 'semi_sep Gram.Entry.t)))) ], + (Gram.Action.mk + (fun (sl : 'symbol list) _ (n : 'name) + (g : 'qualuid) (_loc : Gram.Loc.t) -> + (let (e, b) = expr_of_delete_rule _loc n sl + in + subst_gmod + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, gm)), + (Ast.IdLid (_loc, + "delete_rule")))))), + e)), + b)) + g : + 'delete_rule_body)))) ]) ])) + ()); + Gram.extend (qualuid : 'qualuid Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.srules qualuid + [ ([ Gram.Stoken + (((function + | UIDENT "GLOBAL" -> true + | _ -> false), + "UIDENT \"GLOBAL\"")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "GLOBAL" -> (() : 'e__17) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | LIDENT ((_)) -> true + | _ -> false), + "LIDENT ((_))")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LIDENT ((_)) -> (() : 'e__17) + | _ -> assert false))) ] ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Loc.raise _loc + (Stream.Error + "Deprecated syntax, the grammar module is expected") : + 'qualuid)))) ]); + (None, None, + [ ([ Gram.Stoken + (((function | UIDENT ((_)) -> true | _ -> false), + "UIDENT _")) ], + (Gram.Action.mk + (fun (i : Gram.Token.t) (_loc : Gram.Loc.t) -> + (let i = Gram.Token.extract_string i + in Ast.IdUid (_loc, i) : 'qualuid)))); + ([ Gram.Stoken + (((function | UIDENT ((_)) -> true | _ -> false), + "UIDENT _")); + Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (xs : 'qualuid) _ (x : Gram.Token.t) + (_loc : Gram.Loc.t) -> + (let x = Gram.Token.extract_string x + in + Ast.IdAcc (_loc, (Ast.IdUid (_loc, x)), + xs) : + 'qualuid)))) ]) ])) + ()); + Gram.extend (qualuid : 'qualuid Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.srules qualuid + [ ([ Gram.Stoken + (((function + | UIDENT "GLOBAL" -> true + | _ -> false), + "UIDENT \"GLOBAL\"")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "GLOBAL" -> (() : 'e__18) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | LIDENT ((_)) -> true + | _ -> false), + "LIDENT ((_))")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LIDENT ((_)) -> (() : 'e__18) + | _ -> assert false))) ] ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Loc.raise _loc + (Stream.Error + "Deprecated syntax, the grammar module is expected") : + 'qualuid)))) ]); + (None, None, + [ ([ Gram.Stoken + (((function | UIDENT ((_)) -> true | _ -> false), + "UIDENT _")) ], + (Gram.Action.mk + (fun (i : Gram.Token.t) (_loc : Gram.Loc.t) -> + (let i = Gram.Token.extract_string i + in Ast.IdUid (_loc, i) : 'qualuid)))); + ([ Gram.Stoken + (((function | UIDENT ((_)) -> true | _ -> false), + "UIDENT _")); + Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (xs : 'qualuid) _ (x : Gram.Token.t) + (_loc : Gram.Loc.t) -> + (let x = Gram.Token.extract_string x + in + Ast.IdAcc (_loc, (Ast.IdUid (_loc, x)), + xs) : + 'qualuid)))) ]) ])) + ()); + Gram.extend (qualid : 'qualid Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function | LIDENT ((_)) -> true | _ -> false), + "LIDENT _")) ], + (Gram.Action.mk + (fun (i : Gram.Token.t) (_loc : Gram.Loc.t) -> + (let i = Gram.Token.extract_string i + in Ast.IdLid (_loc, i) : 'qualid)))); + ([ Gram.Stoken + (((function | UIDENT ((_)) -> true | _ -> false), + "UIDENT _")) ], + (Gram.Action.mk + (fun (i : Gram.Token.t) (_loc : Gram.Loc.t) -> + (let i = Gram.Token.extract_string i + in Ast.IdUid (_loc, i) : 'qualid)))); + ([ Gram.Stoken + (((function | UIDENT ((_)) -> true | _ -> false), + "UIDENT _")); + Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (xs : 'qualid) _ (x : Gram.Token.t) + (_loc : Gram.Loc.t) -> + (let x = Gram.Token.extract_string x + in + Ast.IdAcc (_loc, (Ast.IdUid (_loc, x)), + xs) : + 'qualid)))) ]) ])) + ()); + Gram.extend (t_qualid : 't_qualid Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function + | LIDENT _ | UIDENT _ -> true + | _ -> false), + "LIDENT _ | UIDENT _")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LIDENT _ | UIDENT _ -> + (Loc.raise _loc + (Stream.Error + ("Wrong EXTEND header, the grammar type must finish by 't', " + ^ + "like in EXTEND (g : Gram.t) ... END")) : + 't_qualid) + | _ -> assert false))); + ([ Gram.Stoken + (((function | UIDENT ((_)) -> true | _ -> false), + "UIDENT _")); + Gram.Skeyword "."; + Gram.Stoken + (((function | LIDENT "t" -> true | _ -> false), + "LIDENT \"t\"")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) _ + (x : Gram.Token.t) (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LIDENT "t" -> + (let x = Gram.Token.extract_string x + in Ast.IdUid (_loc, x) : 't_qualid) + | _ -> assert false))); + ([ Gram.Stoken + (((function | UIDENT ((_)) -> true | _ -> false), + "UIDENT _")); + Gram.Skeyword "."; Gram.Sself ], + (Gram.Action.mk + (fun (xs : 't_qualid) _ (x : Gram.Token.t) + (_loc : Gram.Loc.t) -> + (let x = Gram.Token.extract_string x + in + Ast.IdAcc (_loc, (Ast.IdUid (_loc, x)), + xs) : + 't_qualid)))) ]) ])) + ()); + Gram.extend (global : 'global Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function + | UIDENT "GLOBAL" -> true + | _ -> false), + "UIDENT \"GLOBAL\"")); + Gram.Skeyword ":"; + Gram.Slist1 + (Gram.Snterm + (Gram.Entry.obj (name : 'name Gram.Entry.t))); + Gram.Snterm + (Gram.Entry.obj + (semi_sep : 'semi_sep Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (sl : 'name list) _ + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "GLOBAL" -> (sl : 'global) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (entry : 'entry Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (name : 'name Gram.Entry.t)); + Gram.Skeyword ":"; + Gram.Sopt + (Gram.Snterm + (Gram.Entry.obj + (position : 'position Gram.Entry.t))); + Gram.Snterm + (Gram.Entry.obj + (level_list : 'level_list Gram.Entry.t)) ], + (Gram.Action.mk + (fun (ll : 'level_list) (pos : 'position option) + _ (n : 'name) (_loc : Gram.Loc.t) -> + ({ name = n; pos = pos; levels = ll; } : + 'entry)))) ]) ])) + ()); + Gram.extend (position : 'position Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function + | UIDENT "LEVEL" -> true + | _ -> false), + "UIDENT \"LEVEL\"")); + Gram.Snterm + (Gram.Entry.obj (string : 'string Gram.Entry.t)) ], + (Gram.Action.mk + (fun (n : 'string) (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "LEVEL" -> + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Camlp4")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Sig")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, + "Grammar")), + (Ast.IdUid (_loc, "Level")))))))))), + n) : + 'position) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | UIDENT "AFTER" -> true + | _ -> false), + "UIDENT \"AFTER\"")); + Gram.Snterm + (Gram.Entry.obj (string : 'string Gram.Entry.t)) ], + (Gram.Action.mk + (fun (n : 'string) (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "AFTER" -> + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Camlp4")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Sig")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, + "Grammar")), + (Ast.IdUid (_loc, "After")))))))))), + n) : + 'position) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | UIDENT "BEFORE" -> true + | _ -> false), + "UIDENT \"BEFORE\"")); + Gram.Snterm + (Gram.Entry.obj (string : 'string Gram.Entry.t)) ], + (Gram.Action.mk + (fun (n : 'string) (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "BEFORE" -> + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Camlp4")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Sig")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, + "Grammar")), + (Ast.IdUid (_loc, + "Before")))))))))), + n) : + 'position) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | UIDENT "LAST" -> true + | _ -> false), + "UIDENT \"LAST\"")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "LAST" -> + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Camlp4")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Sig")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Grammar")), + (Ast.IdUid (_loc, "Last"))))))))) : + 'position) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | UIDENT "FIRST" -> true + | _ -> false), + "UIDENT \"FIRST\"")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "FIRST" -> + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Camlp4")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Sig")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Grammar")), + (Ast.IdUid (_loc, "First"))))))))) : + 'position) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (level_list : 'level_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "["; + Gram.Slist0sep + ((Gram.Snterm + (Gram.Entry.obj + (level : 'level Gram.Entry.t))), + (Gram.Skeyword "|")); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (ll : 'level list) _ (_loc : Gram.Loc.t) + -> (ll : 'level_list)))) ]) ])) + ()); + Gram.extend (level : 'level Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Sopt + (Gram.srules level + [ ([ Gram.Stoken + (((function + | STRING ((_)) -> true + | _ -> false), + "STRING _")) ], + (Gram.Action.mk + (fun (x : Gram.Token.t) + (_loc : Gram.Loc.t) -> + (let x = + Gram.Token.extract_string x + in x : 'e__19)))) ]); + Gram.Sopt + (Gram.Snterm + (Gram.Entry.obj + (assoc : 'assoc Gram.Entry.t))); + Gram.Snterm + (Gram.Entry.obj + (rule_list : 'rule_list Gram.Entry.t)) ], + (Gram.Action.mk + (fun (rules : 'rule_list) (ass : 'assoc option) + (lab : 'e__19 option) (_loc : Gram.Loc.t) -> + ({ label = lab; assoc = ass; rules = rules; } : + 'level)))) ]) ])) + ()); + Gram.extend (assoc : 'assoc Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function + | UIDENT "NONA" -> true + | _ -> false), + "UIDENT \"NONA\"")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "NONA" -> + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Camlp4")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Sig")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Grammar")), + (Ast.IdUid (_loc, "NonA"))))))))) : + 'assoc) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | UIDENT "RIGHTA" -> true + | _ -> false), + "UIDENT \"RIGHTA\"")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "RIGHTA" -> + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Camlp4")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Sig")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Grammar")), + (Ast.IdUid (_loc, "RightA"))))))))) : + 'assoc) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | UIDENT "LEFTA" -> true + | _ -> false), + "UIDENT \"LEFTA\"")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "LEFTA" -> + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Camlp4")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Sig")), + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Grammar")), + (Ast.IdUid (_loc, "LeftA"))))))))) : + 'assoc) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (rule_list : 'rule_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "["; + Gram.Slist1sep + ((Gram.Snterm + (Gram.Entry.obj (rule : 'rule Gram.Entry.t))), + (Gram.Skeyword "|")); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (rules : 'rule list) _ + (_loc : Gram.Loc.t) -> + (retype_rule_list_without_patterns _loc rules : + 'rule_list)))); + ([ Gram.Skeyword "["; Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + ([] : 'rule_list)))) ]) ])) + ()); + Gram.extend (rule : 'rule Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Slist0sep + ((Gram.Snterm + (Gram.Entry.obj + (psymbol : 'psymbol Gram.Entry.t))), + (Gram.Snterm + (Gram.Entry.obj + (semi_sep : 'semi_sep Gram.Entry.t)))) ], + (Gram.Action.mk + (fun (psl : 'psymbol list) (_loc : Gram.Loc.t) + -> ({ prod = psl; action = None; } : 'rule)))); + ([ Gram.Slist0sep + ((Gram.Snterm + (Gram.Entry.obj + (psymbol : 'psymbol Gram.Entry.t))), + (Gram.Snterm + (Gram.Entry.obj + (semi_sep : 'semi_sep Gram.Entry.t)))); + Gram.Skeyword "->"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (act : 'expr) _ (psl : 'psymbol list) + (_loc : Gram.Loc.t) -> + ({ prod = psl; action = Some act; } : 'rule)))) ]) ])) + ()); + Gram.extend (psymbol : 'psymbol Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (symbol : 'symbol Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'symbol) (_loc : Gram.Loc.t) -> + (s : 'psymbol)))); + ([ Gram.Snterm + (Gram.Entry.obj + (pattern : 'pattern Gram.Entry.t)); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (symbol : 'symbol Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'symbol) _ (p : 'pattern) + (_loc : Gram.Loc.t) -> + (match s.pattern with + | Some + (Ast.PaApp (_, + (Ast.PaId (_, (Ast.IdUid (_, u)))), + (Ast.PaTup (_, (Ast.PaAny _))))) + -> + mk_tok _loc + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdUid (_loc, u)))), + p)) + s.styp + | _ -> { (s) with pattern = Some p; } : + 'psymbol)))); + ([ Gram.Stoken + (((function | LIDENT ((_)) -> true | _ -> false), + "LIDENT _")); + Gram.Sopt + (Gram.srules psymbol + [ ([ Gram.Stoken + (((function + | UIDENT "LEVEL" -> true + | _ -> false), + "UIDENT \"LEVEL\"")); + Gram.Stoken + (((function + | STRING ((_)) -> true + | _ -> false), + "STRING _")) ], + (Gram.Action.mk + (fun (s : Gram.Token.t) + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "LEVEL" -> + (let s = + Gram.Token.extract_string s + in s : 'e__20) + | _ -> assert false))) ]) ], + (Gram.Action.mk + (fun (lev : 'e__20 option) (i : Gram.Token.t) + (_loc : Gram.Loc.t) -> + (let i = Gram.Token.extract_string i in + let name = + mk_name _loc (Ast.IdLid (_loc, i)) in + let text = TXnterm (_loc, name, lev) in + let styp = STquo (_loc, i) + in + { + used = [ i ]; + text = text; + styp = styp; + pattern = None; + } : + 'psymbol)))); + ([ Gram.Stoken + (((function | LIDENT ((_)) -> true | _ -> false), + "LIDENT _")); + Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (symbol : 'symbol Gram.Entry.t)) ], + (Gram.Action.mk + (fun (s : 'symbol) _ (p : Gram.Token.t) + (_loc : Gram.Loc.t) -> + (let p = Gram.Token.extract_string p + in + match s.pattern with + | Some + ((Ast.PaApp (_, + (Ast.PaId (_, (Ast.IdUid (_, u)))), + (Ast.PaTup (_, (Ast.PaAny _)))) + as p')) + -> + let match_fun = + Ast.ExFun (_loc, + (Ast.McOr (_loc, + (Ast.McArr (_loc, p', + (Ast.ExNil _loc), + (Ast.ExId (_loc, + (Ast.IdUid (_loc, "True")))))), + (Ast.McArr (_loc, + (Ast.PaAny _loc), + (Ast.ExNil _loc), + (Ast.ExId (_loc, + (Ast.IdUid (_loc, + "False"))))))))) in + let p' = + Ast.PaAli (_loc, p', + (Ast.PaId (_loc, + (Ast.IdLid (_loc, p))))) in + let descr = u ^ " _" in + let text = + TXtok (_loc, match_fun, descr) + in + { + (s) + with + text = text; + pattern = Some p'; + } + | _ -> + { + (s) + with + pattern = + Some + (Ast.PaId (_loc, + (Ast.IdLid (_loc, p)))); + } : + 'psymbol)))) ]) ])) + ()); + Gram.extend (symbol : 'symbol Gram.Entry.t) + ((fun () -> + (None, + [ ((Some "top"), (Some Camlp4.Sig.Grammar.NonA), + [ ([ Gram.Stoken + (((function | UIDENT "TRY" -> true | _ -> false), + "UIDENT \"TRY\"")); + Gram.Sself ], + (Gram.Action.mk + (fun (s : 'symbol) (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "TRY" -> + (let text = TXtry (_loc, s.text) + in + { + used = s.used; + text = text; + styp = s.styp; + pattern = None; + } : + 'symbol) + | _ -> assert false))); + ([ Gram.Stoken + (((function | UIDENT "OPT" -> true | _ -> false), + "UIDENT \"OPT\"")); + Gram.Sself ], + (Gram.Action.mk + (fun (s : 'symbol) (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "OPT" -> + (let () = check_not_tok s in + let styp = + STapp (_loc, (STlid (_loc, "option")), + s.styp) in + let text = TXopt (_loc, s.text) + in + { + used = s.used; + text = text; + styp = styp; + pattern = None; + } : + 'symbol) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | UIDENT "LIST1" -> true + | _ -> false), + "UIDENT \"LIST1\"")); + Gram.Sself; + Gram.Sopt + (Gram.srules symbol + [ ([ Gram.Stoken + (((function + | UIDENT "SEP" -> true + | _ -> false), + "UIDENT \"SEP\"")); + Gram.Snterm + (Gram.Entry.obj + (symbol : 'symbol Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'symbol) + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "SEP" -> (t : 'e__22) + | _ -> assert false))) ]) ], + (Gram.Action.mk + (fun (sep : 'e__22 option) (s : 'symbol) + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "LIST1" -> + (let () = check_not_tok s in + let used = + (match sep with + | Some symb -> symb.used @ s.used + | None -> s.used) in + let styp = + STapp (_loc, (STlid (_loc, "list")), + s.styp) in + let text = slist _loc true sep s + in + { + used = used; + text = text; + styp = styp; + pattern = None; + } : + 'symbol) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | UIDENT "LIST0" -> true + | _ -> false), + "UIDENT \"LIST0\"")); + Gram.Sself; + Gram.Sopt + (Gram.srules symbol + [ ([ Gram.Stoken + (((function + | UIDENT "SEP" -> true + | _ -> false), + "UIDENT \"SEP\"")); + Gram.Snterm + (Gram.Entry.obj + (symbol : 'symbol Gram.Entry.t)) ], + (Gram.Action.mk + (fun (t : 'symbol) + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "SEP" -> (t : 'e__21) + | _ -> assert false))) ]) ], + (Gram.Action.mk + (fun (sep : 'e__21 option) (s : 'symbol) + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "LIST0" -> + (let () = check_not_tok s in + let used = + (match sep with + | Some symb -> symb.used @ s.used + | None -> s.used) in + let styp = + STapp (_loc, (STlid (_loc, "list")), + s.styp) in + let text = slist _loc false sep s + in + { + used = used; + text = text; + styp = styp; + pattern = None; + } : + 'symbol) + | _ -> assert false))) ]); + (None, None, + [ ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (s_t : 'symbol) _ (_loc : Gram.Loc.t) -> + (s_t : 'symbol)))); + ([ Gram.Snterm + (Gram.Entry.obj (name : 'name Gram.Entry.t)); + Gram.Sopt + (Gram.srules symbol + [ ([ Gram.Stoken + (((function + | UIDENT "LEVEL" -> true + | _ -> false), + "UIDENT \"LEVEL\"")); + Gram.Stoken + (((function + | STRING ((_)) -> true + | _ -> false), + "STRING _")) ], + (Gram.Action.mk + (fun (s : Gram.Token.t) + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "LEVEL" -> + (let s = + Gram.Token.extract_string s + in s : 'e__24) + | _ -> assert false))) ]) ], + (Gram.Action.mk + (fun (lev : 'e__24 option) (n : 'name) + (_loc : Gram.Loc.t) -> + ({ + used = [ n.tvar ]; + text = TXnterm (_loc, n, lev); + styp = STquo (_loc, n.tvar); + pattern = None; + } : 'symbol)))); + ([ Gram.Stoken + (((function | UIDENT ((_)) -> true | _ -> false), + "UIDENT _")); + Gram.Skeyword "."; + Gram.Snterm + (Gram.Entry.obj (qualid : 'qualid Gram.Entry.t)); + Gram.Sopt + (Gram.srules symbol + [ ([ Gram.Stoken + (((function + | UIDENT "LEVEL" -> true + | _ -> false), + "UIDENT \"LEVEL\"")); + Gram.Stoken + (((function + | STRING ((_)) -> true + | _ -> false), + "STRING _")) ], + (Gram.Action.mk + (fun (s : Gram.Token.t) + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "LEVEL" -> + (let s = + Gram.Token.extract_string s + in s : 'e__23) + | _ -> assert false))) ]) ], + (Gram.Action.mk + (fun (lev : 'e__23 option) (il : 'qualid) _ + (i : Gram.Token.t) (_loc : Gram.Loc.t) -> + (let i = Gram.Token.extract_string i in + let n = + mk_name _loc + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, i)), + il)) + in + { + used = [ n.tvar ]; + text = TXnterm (_loc, n, lev); + styp = STquo (_loc, n.tvar); + pattern = None; + } : + 'symbol)))); + ([ Gram.Stoken + (((function | STRING ((_)) -> true | _ -> false), + "STRING _")) ], + (Gram.Action.mk + (fun (s : Gram.Token.t) (_loc : Gram.Loc.t) -> + (let s = Gram.Token.extract_string s + in + { + used = []; + text = TXkwd (_loc, s); + styp = STtok _loc; + pattern = None; + } : + 'symbol)))); + ([ Gram.Stoken + (((function | UIDENT ((_)) -> true | _ -> false), + "UIDENT _")); + Gram.Stoken + (((function + | ANTIQUOT ("", _) -> true + | _ -> false), + "ANTIQUOT (\"\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (x : Gram.Token.t) (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ("", s) -> + (let x = Gram.Token.extract_string x in + let e = + AntiquotSyntax.parse_expr _loc s in + let match_fun = + Ast.ExFun (_loc, + (Ast.McOr (_loc, + (Ast.McArr (_loc, + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdUid (_loc, x)))), + (Ast.PaId (_loc, + (Ast.IdLid (_loc, + "camlp4_x")))))), + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdLid (_loc, + "=")))), + (Ast.ExId (_loc, + (Ast.IdLid (_loc, + "camlp4_x")))))), + e)), + (Ast.ExId (_loc, + (Ast.IdUid (_loc, "True")))))), + (Ast.McArr (_loc, + (Ast.PaAny _loc), + (Ast.ExNil _loc), + (Ast.ExId (_loc, + (Ast.IdUid (_loc, "False"))))))))) in + let descr = "$" ^ (x ^ (" " ^ s)) in + let text = + TXtok (_loc, match_fun, descr) in + let p = + Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdUid (_loc, x)))), + (Ast.PaTup (_loc, (Ast.PaAny _loc)))) + in + { + used = []; + text = text; + styp = STtok _loc; + pattern = Some p; + } : + 'symbol) + | _ -> assert false))); + ([ Gram.Stoken + (((function | UIDENT ((_)) -> true | _ -> false), + "UIDENT _")); + Gram.Stoken + (((function | STRING ((_)) -> true | _ -> false), + "STRING _")) ], + (Gram.Action.mk + (fun (s : Gram.Token.t) (x : Gram.Token.t) + (_loc : Gram.Loc.t) -> + (let s = Gram.Token.extract_string s in + let x = Gram.Token.extract_string x + in + mk_tok _loc + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdUid (_loc, x)))), + (Ast.PaStr (_loc, s)))) + (STtok _loc) : + 'symbol)))); + ([ Gram.Stoken + (((function | UIDENT ((_)) -> true | _ -> false), + "UIDENT _")) ], + (Gram.Action.mk + (fun (x : Gram.Token.t) (_loc : Gram.Loc.t) -> + (let x = Gram.Token.extract_string x + in + mk_tok _loc + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdUid (_loc, x)))), + (Ast.PaTup (_loc, (Ast.PaAny _loc))))) + (STstring_tok _loc) : + 'symbol)))); + ([ Gram.Skeyword "`"; + Gram.Snterm + (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p : 'patt) _ (_loc : Gram.Loc.t) -> + (mk_tok _loc p (STtok _loc) : 'symbol)))); + ([ Gram.Skeyword "["; + Gram.Slist0sep + ((Gram.Snterm + (Gram.Entry.obj (rule : 'rule Gram.Entry.t))), + (Gram.Skeyword "|")); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (rl : 'rule list) _ (_loc : Gram.Loc.t) + -> + (let rl = + retype_rule_list_without_patterns _loc rl in + let t = new_type_var () + in + { + used = used_of_rule_list rl; + text = + TXrules (_loc, (srules _loc t rl "")); + styp = STquo (_loc, t); + pattern = None; + } : + 'symbol)))); + ([ Gram.Stoken + (((function + | UIDENT "NEXT" -> true + | _ -> false), + "UIDENT \"NEXT\"")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "NEXT" -> + ({ + used = []; + text = TXnext _loc; + styp = STself (_loc, "NEXT"); + pattern = None; + } : 'symbol) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | UIDENT "SELF" -> true + | _ -> false), + "UIDENT \"SELF\"")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "SELF" -> + ({ + used = []; + text = TXself _loc; + styp = STself (_loc, "SELF"); + pattern = None; + } : 'symbol) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (pattern : 'pattern Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ","; + Gram.Snterm + (Gram.Entry.obj + (comma_patt : 'comma_patt Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (p2 : 'comma_patt) _ (p1 : 'pattern) _ + (_loc : Gram.Loc.t) -> + (Ast.PaTup (_loc, (Ast.PaCom (_loc, p1, p2))) : + 'pattern)))); + ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (p : 'pattern) _ (_loc : Gram.Loc.t) -> + (p : 'pattern)))); + ([ Gram.Skeyword "_" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.PaAny _loc : 'pattern)))); + ([ Gram.Stoken + (((function | LIDENT ((_)) -> true | _ -> false), + "LIDENT _")) ], + (Gram.Action.mk + (fun (i : Gram.Token.t) (_loc : Gram.Loc.t) -> + (let i = Gram.Token.extract_string i + in Ast.PaId (_loc, (Ast.IdLid (_loc, i))) : + 'pattern)))) ]) ])) + ()); + Gram.extend (comma_patt : 'comma_patt Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (pattern : 'pattern Gram.Entry.t)) ], + (Gram.Action.mk + (fun (p : 'pattern) (_loc : Gram.Loc.t) -> + (p : 'comma_patt)))); + ([ Gram.Sself; Gram.Skeyword ","; Gram.Sself ], + (Gram.Action.mk + (fun (p2 : 'comma_patt) _ (p1 : 'comma_patt) + (_loc : Gram.Loc.t) -> + (Ast.PaCom (_loc, p1, p2) : 'comma_patt)))) ]) ])) + ()); + Gram.extend (name : 'name Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (qualid : 'qualid Gram.Entry.t)) ], + (Gram.Action.mk + (fun (il : 'qualid) (_loc : Gram.Loc.t) -> + (mk_name _loc il : 'name)))) ]) ])) + ()); + Gram.extend (string : 'string Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function + | ANTIQUOT ("", _) -> true + | _ -> false), + "ANTIQUOT (\"\", _)")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | ANTIQUOT ("", s) -> + (AntiquotSyntax.parse_expr _loc s : + 'string) + | _ -> assert false))); + ([ Gram.Stoken + (((function | STRING ((_)) -> true | _ -> false), + "STRING _")) ], + (Gram.Action.mk + (fun (s : Gram.Token.t) (_loc : Gram.Loc.t) -> + (let s = Gram.Token.extract_string s + in Ast.ExStr (_loc, s) : 'string)))) ]) ])) + ()); + Gram.extend (semi_sep : 'semi_sep Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword ";" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> (() : 'semi_sep)))) ]) ])) + ())) + + (* + EXTEND Gram + symbol: LEVEL "top" + [ NONA + [ min = [ UIDENT "SLIST0" -> False | UIDENT "SLIST1" -> True ]; + s = SELF; sep = OPT [ UIDENT "SEP"; t = symbol -> t ] -> + sslist _loc min sep s + | UIDENT "SOPT"; s = SELF -> + ssopt _loc s ] ] + ; + END; + *) + let sfold _loc n foldfun f e s = + let styp = STquo (_loc, (new_type_var ())) in + let e = + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdLid (_loc, foldfun)))))), + f)), + e) in + let t = + STapp (_loc, + (STapp (_loc, + (STtyp + (Ast.TyApp (_loc, + (Ast.TyId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdLid (_loc, "fold")))))), + (Ast.TyAny _loc)))), + s.styp)), + styp) + in + { + used = s.used; + text = TXmeta (_loc, n, [ s.text ], e, t); + styp = styp; + pattern = None; + } + + let sfoldsep _loc n foldfun f e s sep = + let styp = STquo (_loc, (new_type_var ())) in + let e = + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdLid (_loc, foldfun)))))), + f)), + e) in + let t = + STapp (_loc, + (STapp (_loc, + (STtyp + (Ast.TyApp (_loc, + (Ast.TyId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), + (Ast.IdLid (_loc, "foldsep")))))), + (Ast.TyAny _loc)))), + s.styp)), + styp) + in + { + used = s.used @ sep.used; + text = TXmeta (_loc, n, [ s.text; sep.text ], e, t); + styp = styp; + pattern = None; + } + + let _ = + let _ = (symbol : 'symbol Gram.Entry.t) in + let grammar_entry_create = Gram.Entry.mk in + let simple_expr : 'simple_expr Gram.Entry.t = + grammar_entry_create "simple_expr" + in + (Gram.extend (symbol : 'symbol Gram.Entry.t) + ((fun () -> + ((Some (Camlp4.Sig.Grammar.Level "top")), + [ (None, None, + [ ([ Gram.Stoken + (((function + | UIDENT "FOLD1" -> true + | _ -> false), + "UIDENT \"FOLD1\"")); + Gram.Snterm + (Gram.Entry.obj + (simple_expr : 'simple_expr Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (simple_expr : 'simple_expr Gram.Entry.t)); + Gram.Sself; + Gram.Stoken + (((function | UIDENT "SEP" -> true | _ -> false), + "UIDENT \"SEP\"")); + Gram.Sself ], + (Gram.Action.mk + (fun (sep : 'symbol) (__camlp4_1 : Gram.Token.t) + (s : 'symbol) (e : 'simple_expr) + (f : 'simple_expr) + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match (__camlp4_1, __camlp4_0) with + | (UIDENT "SEP", UIDENT "FOLD1") -> + (sfoldsep _loc "FOLD1 SEP" "sfold1sep" f + e s sep : + 'symbol) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | UIDENT "FOLD0" -> true + | _ -> false), + "UIDENT \"FOLD0\"")); + Gram.Snterm + (Gram.Entry.obj + (simple_expr : 'simple_expr Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (simple_expr : 'simple_expr Gram.Entry.t)); + Gram.Sself; + Gram.Stoken + (((function | UIDENT "SEP" -> true | _ -> false), + "UIDENT \"SEP\"")); + Gram.Sself ], + (Gram.Action.mk + (fun (sep : 'symbol) (__camlp4_1 : Gram.Token.t) + (s : 'symbol) (e : 'simple_expr) + (f : 'simple_expr) + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match (__camlp4_1, __camlp4_0) with + | (UIDENT "SEP", UIDENT "FOLD0") -> + (sfoldsep _loc "FOLD0 SEP" "sfold0sep" f + e s sep : + 'symbol) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | UIDENT "FOLD1" -> true + | _ -> false), + "UIDENT \"FOLD1\"")); + Gram.Snterm + (Gram.Entry.obj + (simple_expr : 'simple_expr Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (simple_expr : 'simple_expr Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (s : 'symbol) (e : 'simple_expr) + (f : 'simple_expr) + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "FOLD1" -> + (sfold _loc "FOLD1" "sfold1" f e s : + 'symbol) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | UIDENT "FOLD0" -> true + | _ -> false), + "UIDENT \"FOLD0\"")); + Gram.Snterm + (Gram.Entry.obj + (simple_expr : 'simple_expr Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (simple_expr : 'simple_expr Gram.Entry.t)); + Gram.Sself ], + (Gram.Action.mk + (fun (s : 'symbol) (e : 'simple_expr) + (f : 'simple_expr) + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT "FOLD0" -> + (sfold _loc "FOLD0" "sfold0" f e s : + 'symbol) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (simple_expr : 'simple_expr Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "("; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Skeyword ")" ], + (Gram.Action.mk + (fun _ (e : 'expr) _ (_loc : Gram.Loc.t) -> + (e : 'simple_expr)))); + ([ Gram.Snterm + (Gram.Entry.obj + (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> + (Ast.ExId (_loc, (Ast.IdLid (_loc, i))) : + 'simple_expr)))) ]) ])) + ())) + + let _ = + Options.add "-split_ext" (Arg.Set split_ext) + "Split EXTEND by functions to turn around a PowerPC problem." + + let _ = + Options.add "-split_gext" (Arg.Set split_ext) + "Old name for the option -split_ext." + + let _ = + Options.add "-meta_action" (Arg.Set meta_action) "Undocumented" + + end + + (* FIXME *) + module M = Register.OCamlSyntaxExtension(Id)(Make) + + end + +module M = + struct + open Camlp4 + + (* -*- camlp4r -*- *) + (****************************************************************************) + (* *) + (* Objective Caml *) + (* *) + (* INRIA Rocquencourt *) + (* *) + (* Copyright 2006 Institut National de Recherche en Informatique et *) + (* en Automatique. All rights reserved. This file is distributed under *) + (* the terms of the GNU Library General Public License, with the special *) + (* exception on linking described in LICENSE at the top of the Objective *) + (* Caml source tree. *) + (* *) + (****************************************************************************) + (* Authors: + * - Daniel de Rauglaudre: initial version + * - Nicolas Pouillard: refactoring + * - Aleksey Nogin: extra features and bug fixes. + * - Christopher Conway: extra feature (-D<uident>=) + * - Jean-vincent Loddo: definitions inside IFs. + *) + module Id = + struct let name = "Camlp4MacroParser" + let version = Sys.ocaml_version + + end + + (* +Added statements: + + At toplevel (structure item): + + DEFINE <uident> + DEFINE <uident> = <expression> + DEFINE <uident> (<parameters>) = <expression> + IFDEF <uident> THEN <structure_items> [ ELSE <structure_items> ] (END | ENDIF) + IFNDEF <uident> THEN <structure_items> [ ELSE <structure_items> ] (END | ENDIF) + INCLUDE <string> + + At toplevel (signature item): + + DEFINE <uident> + IFDEF <uident> THEN <signature_items> [ ELSE <signature_items> ] (END | ENDIF) + IFNDEF <uident> THEN <signature_items> [ ELSE <signature_items> ] (END | ENDIF) + INCLUDE <string> + + In expressions: + + IFDEF <uident> THEN <expression> [ ELSE <expression> ] (END | ENDIF) + IFNDEF <uident> THEN <expression> [ ELSE <expression> ] (END | ENDIF) + DEFINE <lident> = <expression> IN <expression> + __FILE__ + __LOCATION__ + + In patterns: + + IFDEF <uident> THEN <pattern> ELSE <pattern> (END | ENDIF) + IFNDEF <uident> THEN <pattern> ELSE <pattern> (END | ENDIF) + + As Camlp4 options: + + -D<uident> or -D<uident>=expr define <uident> with optional value <expr> + -U<uident> undefine it + -I<dir> add <dir> to the search path for INCLUDE'd files + + After having used a DEFINE <uident> followed by "= <expression>", you + can use it in expressions *and* in patterns. If the expression defining + the macro cannot be used as a pattern, there is an error message if + it is used in a pattern. + + You can also define a local macro in an expression usigng the DEFINE ... IN form. + Note that local macros have lowercase names and can not take parameters. + + If a macro is defined to = NOTHING, and then used as an argument to a function, + this will be equivalent to function taking one less argument. Similarly, + passing NOTHING as an argument to a macro is equivalent to "erasing" the + corresponding parameter from the macro body. + + The toplevel statement INCLUDE <string> can be used to include a + file containing macro definitions and also any other toplevel items. + The included files are looked up in directories passed in via the -I + option, falling back to the current directory. + + The expression __FILE__ returns the current compiled file name. + The expression __LOCATION__ returns the current location of itself. + +*) + open Camlp4 + + module Make (Syntax : Sig.Camlp4Syntax) = + struct + open Sig + + include Syntax + + type 'a item_or_def = + | SdStr of 'a + | SdDef of string * ((string list) * Ast.expr) option + | SdUnd of string + | SdITE of bool * ('a item_or_def) list * ('a item_or_def) list + | SdLazy of 'a Lazy.t + + let rec list_remove x = + function + | (y, _) :: l when y = x -> l + | d :: l -> d :: (list_remove x l) + | [] -> [] + + let defined = ref [] + + let is_defined i = List.mem_assoc i !defined + + let bad_patt _loc = + Loc.raise _loc + (Failure + "this macro cannot be used in a pattern (see its definition)") + + let substp _loc env = + let rec loop = + function + | Ast.ExApp (_, e1, e2) -> Ast.PaApp (_loc, (loop e1), (loop e2)) + | Ast.ExNil _ -> Ast.PaNil _loc + | Ast.ExId (_, (Ast.IdLid (_, x))) -> + (try List.assoc x env + with | Not_found -> Ast.PaId (_loc, (Ast.IdLid (_loc, x)))) + | Ast.ExId (_, (Ast.IdUid (_, x))) -> + (try List.assoc x env + with | Not_found -> Ast.PaId (_loc, (Ast.IdUid (_loc, x)))) + | Ast.ExInt (_, x) -> Ast.PaInt (_loc, x) + | Ast.ExStr (_, s) -> Ast.PaStr (_loc, s) + | Ast.ExTup (_, x) -> Ast.PaTup (_loc, (loop x)) + | Ast.ExCom (_, x1, x2) -> Ast.PaCom (_loc, (loop x1), (loop x2)) + | Ast.ExRec (_, bi, (Ast.ExNil _)) -> + let rec substbi = + (function + | Ast.RbSem (_, b1, b2) -> + Ast.PaSem (_loc, (substbi b1), (substbi b2)) + | Ast.RbEq (_, i, e) -> Ast.PaEq (_loc, i, (loop e)) + | _ -> bad_patt _loc) + in Ast.PaRec (_loc, (substbi bi)) + | _ -> bad_patt _loc + in loop + + class reloc _loc = + object inherit Ast.map as super + method loc = fun _ -> _loc + end + + (* method _Loc_t _ = _loc; *) + class subst _loc env = + object inherit reloc _loc as super + + method expr = + function + | (Ast.ExId (_, (Ast.IdLid (_, x))) | + Ast.ExId (_, (Ast.IdUid (_, x))) + as e) -> + (try List.assoc x env with | Not_found -> super#expr e) + | e -> super#expr e + + method patt = + function + | (Ast.PaId (_, (Ast.IdLid (_, x))) | + Ast.PaId (_, (Ast.IdUid (_, x))) + as p) -> + (try substp _loc [] (List.assoc x env) + with | Not_found -> super#patt p) + | p -> super#patt p + + end + + let incorrect_number loc l1 l2 = + Loc.raise loc + (Failure + (Printf.sprintf "expected %d parameters; found %d" + (List.length l2) (List.length l1))) + + let define eo x = + ((match eo with + | Some (([], e)) -> + (Gram.extend (expr : 'expr Gram.Entry.t) + ((fun () -> + ((Some (Camlp4.Sig.Grammar.Level "simple")), + [ (None, None, + [ ([ Gram.Stoken + (((function + | UIDENT camlp4_x when camlp4_x = x -> + true + | _ -> false), + "$UIDENT x")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT ((_)) -> + ((new reloc _loc)#expr e : 'expr) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (patt : 'patt Gram.Entry.t) + ((fun () -> + ((Some (Camlp4.Sig.Grammar.Level "simple")), + [ (None, None, + [ ([ Gram.Stoken + (((function + | UIDENT camlp4_x when camlp4_x = x -> + true + | _ -> false), + "$UIDENT x")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT ((_)) -> + (let p = substp _loc [] e + in (new reloc _loc)#patt p : 'patt) + | _ -> assert false))) ]) ])) + ())) + | Some ((sl, e)) -> + (Gram.extend (expr : 'expr Gram.Entry.t) + ((fun () -> + ((Some (Camlp4.Sig.Grammar.Level "apply")), + [ (None, None, + [ ([ Gram.Stoken + (((function + | UIDENT camlp4_x when camlp4_x = x -> + true + | _ -> false), + "$UIDENT x")); + Gram.Sself ], + (Gram.Action.mk + (fun (param : 'expr) + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT ((_)) -> + (let el = + (match param with + | Ast.ExTup (_, e) -> + Ast.list_of_expr e [] + | e -> [ e ]) + in + if + (List.length el) = + (List.length sl) + then + (let env = List.combine sl el + in (new subst _loc env)#expr e) + else incorrect_number _loc el sl : + 'expr) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (patt : 'patt Gram.Entry.t) + ((fun () -> + ((Some (Camlp4.Sig.Grammar.Level "simple")), + [ (None, None, + [ ([ Gram.Stoken + (((function + | UIDENT camlp4_x when camlp4_x = x -> + true + | _ -> false), + "$UIDENT x")); + Gram.Sself ], + (Gram.Action.mk + (fun (param : 'patt) + (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | UIDENT ((_)) -> + (let pl = + (match param with + | Ast.PaTup (_, p) -> + Ast.list_of_patt p [] + | p -> [ p ]) + in + if + (List.length pl) = + (List.length sl) + then + (let env = List.combine sl pl in + let p = substp _loc env e + in (new reloc _loc)#patt p) + else incorrect_number _loc pl sl : + 'patt) + | _ -> assert false))) ]) ])) + ())) + | None -> ()); + defined := (x, eo) :: !defined) + + let undef x = + try + ((let eo = List.assoc x !defined + in + match eo with + | Some (([], _)) -> + (Gram.delete_rule expr + [ Gram.Stoken + (((function + | UIDENT camlp4_x when camlp4_x = x -> true + | _ -> false), + "$UIDENT x")) ]; + Gram.delete_rule patt + [ Gram.Stoken + (((function + | UIDENT camlp4_x when camlp4_x = x -> true + | _ -> false), + "$UIDENT x")) ]) + | Some ((_, _)) -> + (Gram.delete_rule expr + [ Gram.Stoken + (((function + | UIDENT camlp4_x when camlp4_x = x -> true + | _ -> false), + "$UIDENT x")); + Gram.Sself ]; + Gram.delete_rule patt + [ Gram.Stoken + (((function + | UIDENT camlp4_x when camlp4_x = x -> true + | _ -> false), + "$UIDENT x")); + Gram.Sself ]) + | None -> ()); + defined := list_remove x !defined) + with | Not_found -> () + + let parse_def s = + match Gram.parse_string expr (Loc.mk "<command line>") s with + | Ast.ExId (_, (Ast.IdUid (_, n))) -> define None n + | Ast.ExApp (_, + (Ast.ExApp (_, (Ast.ExId (_, (Ast.IdLid (_, "=")))), + (Ast.ExId (_, (Ast.IdUid (_, n)))))), + e) -> define (Some (([], e))) n + | _ -> invalid_arg s + + (* This is a list of directories to search for INCLUDE statements. *) + let include_dirs = ref [] + + (* Add something to the above, make sure it ends with a slash. *) + let add_include_dir str = + if str <> "" + then + (let str = + if (String.get str ((String.length str) - 1)) = '/' + then str + else str ^ "/" + in include_dirs := !include_dirs @ [ str ]) + else () + + let parse_include_file rule = + let dir_ok file dir = Sys.file_exists (dir ^ file) + in + fun file -> + let file = + try + (List.find (dir_ok file) (!include_dirs @ [ "./" ])) ^ file + with | Not_found -> file in + let ch = open_in file in + let st = Stream.of_channel ch + in Gram.parse rule (Loc.mk file) st + + let rec execute_macro nil cons = + function + | SdStr i -> i + | SdDef (x, eo) -> (define eo x; nil) + | SdUnd x -> (undef x; nil) + | SdITE (b, l1, l2) -> + execute_macro_list nil cons (if b then l1 else l2) + | SdLazy l -> Lazy.force l + and execute_macro_list nil cons = + function + | [] -> nil + | hd :: tl -> (* The evaluation order is important here *) + let il1 = execute_macro nil cons hd in + let il2 = execute_macro_list nil cons tl in cons il1 il2 + + (* Stack of conditionals. *) + let stack = Stack.create () + + (* Make an SdITE value by extracting the result of the test from the stack. *) + let make_SdITE_result st1 st2 = + let test = Stack.pop stack in SdITE (test, st1, st2) + + type branch = | Then | Else + + (* Execute macro only if it belongs to the currently active branch. *) + let execute_macro_if_active_branch _loc nil cons branch macro_def = + let test = Stack.top stack in + let item = + if (test && (branch = Then)) || ((not test) && (branch = Else)) + then execute_macro nil cons macro_def + else (* ignore the macro *) nil + in SdStr item + + let _ = + let _ = (expr : 'expr Gram.Entry.t) + and _ = (sig_item : 'sig_item Gram.Entry.t) + and _ = (str_item : 'str_item Gram.Entry.t) + and _ = (patt : 'patt Gram.Entry.t) in + let grammar_entry_create = Gram.Entry.mk in + let macro_def : 'macro_def Gram.Entry.t = + grammar_entry_create "macro_def" + and uident : 'uident Gram.Entry.t = grammar_entry_create "uident" + and opt_macro_value : 'opt_macro_value Gram.Entry.t = + grammar_entry_create "opt_macro_value" + and endif : 'endif Gram.Entry.t = grammar_entry_create "endif" + and sglist_else : 'sglist_else Gram.Entry.t = + grammar_entry_create "sglist_else" + and sglist_then : 'sglist_then Gram.Entry.t = + grammar_entry_create "sglist_then" + and smlist_else : 'smlist_else Gram.Entry.t = + grammar_entry_create "smlist_else" + and smlist_then : 'smlist_then Gram.Entry.t = + grammar_entry_create "smlist_then" + and else_expr : 'else_expr Gram.Entry.t = + grammar_entry_create "else_expr" + and else_macro_def_sig : 'else_macro_def_sig Gram.Entry.t = + grammar_entry_create "else_macro_def_sig" + and else_macro_def : 'else_macro_def Gram.Entry.t = + grammar_entry_create "else_macro_def" + and uident_eval_ifndef : 'uident_eval_ifndef Gram.Entry.t = + grammar_entry_create "uident_eval_ifndef" + and uident_eval_ifdef : 'uident_eval_ifdef Gram.Entry.t = + grammar_entry_create "uident_eval_ifdef" + and macro_def_sig : 'macro_def_sig Gram.Entry.t = + grammar_entry_create "macro_def_sig" + in + (Gram.extend (str_item : 'str_item Gram.Entry.t) + ((fun () -> + ((Some Camlp4.Sig.Grammar.First), + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (macro_def : 'macro_def Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'macro_def) (_loc : Gram.Loc.t) -> + (execute_macro (Ast.StNil _loc) + (fun a b -> Ast.StSem (_loc, a, b)) x : + 'str_item)))) ]) ])) + ()); + Gram.extend (sig_item : 'sig_item Gram.Entry.t) + ((fun () -> + ((Some Camlp4.Sig.Grammar.First), + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (macro_def_sig : + 'macro_def_sig Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'macro_def_sig) (_loc : Gram.Loc.t) -> + (execute_macro (Ast.SgNil _loc) + (fun a b -> Ast.SgSem (_loc, a, b)) x : + 'sig_item)))) ]) ])) + ()); + Gram.extend (macro_def : 'macro_def Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "INCLUDE"; + Gram.Stoken + (((function | STRING ((_)) -> true | _ -> false), + "STRING _")) ], + (Gram.Action.mk + (fun (fname : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + (let fname = Gram.Token.extract_string fname + in + SdLazy + (lazy + (parse_include_file str_items fname)) : + 'macro_def)))); + ([ Gram.Skeyword "IFNDEF"; + Gram.Snterm + (Gram.Entry.obj + (uident_eval_ifndef : + 'uident_eval_ifndef Gram.Entry.t)); + Gram.Skeyword "THEN"; + Gram.Snterm + (Gram.Entry.obj + (smlist_then : 'smlist_then Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (else_macro_def : + 'else_macro_def Gram.Entry.t)) ], + (Gram.Action.mk + (fun (st2 : 'else_macro_def) + (st1 : 'smlist_then) _ _ _ + (_loc : Gram.Loc.t) -> + (make_SdITE_result st1 st2 : 'macro_def)))); + ([ Gram.Skeyword "IFDEF"; + Gram.Snterm + (Gram.Entry.obj + (uident_eval_ifdef : + 'uident_eval_ifdef Gram.Entry.t)); + Gram.Skeyword "THEN"; + Gram.Snterm + (Gram.Entry.obj + (smlist_then : 'smlist_then Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (else_macro_def : + 'else_macro_def Gram.Entry.t)) ], + (Gram.Action.mk + (fun (st2 : 'else_macro_def) + (st1 : 'smlist_then) _ _ _ + (_loc : Gram.Loc.t) -> + (make_SdITE_result st1 st2 : 'macro_def)))); + ([ Gram.Skeyword "UNDEF"; + Gram.Snterm + (Gram.Entry.obj (uident : 'uident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'uident) _ (_loc : Gram.Loc.t) -> + (SdUnd i : 'macro_def)))); + ([ Gram.Skeyword "DEFINE"; + Gram.Snterm + (Gram.Entry.obj (uident : 'uident Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (opt_macro_value : + 'opt_macro_value Gram.Entry.t)) ], + (Gram.Action.mk + (fun (def : 'opt_macro_value) (i : 'uident) _ + (_loc : Gram.Loc.t) -> + (SdDef (i, def) : 'macro_def)))) ]) ])) + ()); + Gram.extend (macro_def_sig : 'macro_def_sig Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "INCLUDE"; + Gram.Stoken + (((function | STRING ((_)) -> true | _ -> false), + "STRING _")) ], + (Gram.Action.mk + (fun (fname : Gram.Token.t) _ + (_loc : Gram.Loc.t) -> + (let fname = Gram.Token.extract_string fname + in + SdLazy + (lazy + (parse_include_file sig_items fname)) : + 'macro_def_sig)))); + ([ Gram.Skeyword "IFNDEF"; + Gram.Snterm + (Gram.Entry.obj + (uident_eval_ifndef : + 'uident_eval_ifndef Gram.Entry.t)); + Gram.Skeyword "THEN"; + Gram.Snterm + (Gram.Entry.obj + (sglist_then : 'sglist_then Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (else_macro_def_sig : + 'else_macro_def_sig Gram.Entry.t)) ], + (Gram.Action.mk + (fun (sg2 : 'else_macro_def_sig) + (sg1 : 'sglist_then) _ _ _ + (_loc : Gram.Loc.t) -> + (make_SdITE_result sg1 sg2 : 'macro_def_sig)))); + ([ Gram.Skeyword "IFDEF"; + Gram.Snterm + (Gram.Entry.obj + (uident_eval_ifdef : + 'uident_eval_ifdef Gram.Entry.t)); + Gram.Skeyword "THEN"; + Gram.Snterm + (Gram.Entry.obj + (sglist_then : 'sglist_then Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (else_macro_def_sig : + 'else_macro_def_sig Gram.Entry.t)) ], + (Gram.Action.mk + (fun (sg2 : 'else_macro_def_sig) + (sg1 : 'sglist_then) _ _ _ + (_loc : Gram.Loc.t) -> + (make_SdITE_result sg1 sg2 : 'macro_def_sig)))); + ([ Gram.Skeyword "UNDEF"; + Gram.Snterm + (Gram.Entry.obj (uident : 'uident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'uident) _ (_loc : Gram.Loc.t) -> + (SdUnd i : 'macro_def_sig)))); + ([ Gram.Skeyword "DEFINE"; + Gram.Snterm + (Gram.Entry.obj (uident : 'uident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'uident) _ (_loc : Gram.Loc.t) -> + (SdDef (i, None) : 'macro_def_sig)))) ]) ])) + ()); + Gram.extend + (uident_eval_ifdef : 'uident_eval_ifdef Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (uident : 'uident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'uident) (_loc : Gram.Loc.t) -> + (Stack.push (is_defined i) stack : + 'uident_eval_ifdef)))) ]) ])) + ()); + Gram.extend + (uident_eval_ifndef : 'uident_eval_ifndef Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (uident : 'uident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'uident) (_loc : Gram.Loc.t) -> + (Stack.push (not (is_defined i)) stack : + 'uident_eval_ifndef)))) ]) ])) + ()); + Gram.extend (else_macro_def : 'else_macro_def Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (endif : 'endif Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + ([] : 'else_macro_def)))); + ([ Gram.Skeyword "ELSE"; + Gram.Snterm + (Gram.Entry.obj + (smlist_else : 'smlist_else Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (endif : 'endif Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (st : 'smlist_else) _ (_loc : Gram.Loc.t) + -> (st : 'else_macro_def)))) ]) ])) + ()); + Gram.extend + (else_macro_def_sig : 'else_macro_def_sig Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (endif : 'endif Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + ([] : 'else_macro_def_sig)))); + ([ Gram.Skeyword "ELSE"; + Gram.Snterm + (Gram.Entry.obj + (sglist_else : 'sglist_else Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (endif : 'endif Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (st : 'sglist_else) _ (_loc : Gram.Loc.t) + -> (st : 'else_macro_def_sig)))) ]) ])) + ()); + Gram.extend (else_expr : 'else_expr Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj (endif : 'endif Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))) : + 'else_expr)))); + ([ Gram.Skeyword "ELSE"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj (endif : 'endif Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (e : 'expr) _ (_loc : Gram.Loc.t) -> + (e : 'else_expr)))) ]) ])) + ()); + Gram.extend (smlist_then : 'smlist_then Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Slist1 + (Gram.srules smlist_then + [ ([ Gram.Snterm + (Gram.Entry.obj + (str_item : + 'str_item Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (si : 'str_item) + (_loc : Gram.Loc.t) -> + (SdStr si : 'e__25)))); + ([ Gram.Snterm + (Gram.Entry.obj + (macro_def : + 'macro_def Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (d : 'macro_def) + (_loc : Gram.Loc.t) -> + (execute_macro_if_active_branch + _loc (Ast.StNil _loc) + (fun a b -> + Ast.StSem (_loc, a, b)) + Then d : + 'e__25)))) ]) ], + (Gram.Action.mk + (fun (sml : 'e__25 list) (_loc : Gram.Loc.t) -> + (sml : 'smlist_then)))) ]) ])) + ()); + Gram.extend (smlist_else : 'smlist_else Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Slist1 + (Gram.srules smlist_else + [ ([ Gram.Snterm + (Gram.Entry.obj + (str_item : + 'str_item Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (si : 'str_item) + (_loc : Gram.Loc.t) -> + (SdStr si : 'e__26)))); + ([ Gram.Snterm + (Gram.Entry.obj + (macro_def : + 'macro_def Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (d : 'macro_def) + (_loc : Gram.Loc.t) -> + (execute_macro_if_active_branch + _loc (Ast.StNil _loc) + (fun a b -> + Ast.StSem (_loc, a, b)) + Else d : + 'e__26)))) ]) ], + (Gram.Action.mk + (fun (sml : 'e__26 list) (_loc : Gram.Loc.t) -> + (sml : 'smlist_else)))) ]) ])) + ()); + Gram.extend (sglist_then : 'sglist_then Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Slist1 + (Gram.srules sglist_then + [ ([ Gram.Snterm + (Gram.Entry.obj + (sig_item : + 'sig_item Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (si : 'sig_item) + (_loc : Gram.Loc.t) -> + (SdStr si : 'e__27)))); + ([ Gram.Snterm + (Gram.Entry.obj + (macro_def_sig : + 'macro_def_sig Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (d : 'macro_def_sig) + (_loc : Gram.Loc.t) -> + (execute_macro_if_active_branch + _loc (Ast.SgNil _loc) + (fun a b -> + Ast.SgSem (_loc, a, b)) + Then d : + 'e__27)))) ]) ], + (Gram.Action.mk + (fun (sgl : 'e__27 list) (_loc : Gram.Loc.t) -> + (sgl : 'sglist_then)))) ]) ])) + ()); + Gram.extend (sglist_else : 'sglist_else Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Slist1 + (Gram.srules sglist_else + [ ([ Gram.Snterm + (Gram.Entry.obj + (sig_item : + 'sig_item Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (si : 'sig_item) + (_loc : Gram.Loc.t) -> + (SdStr si : 'e__28)))); + ([ Gram.Snterm + (Gram.Entry.obj + (macro_def_sig : + 'macro_def_sig Gram.Entry.t)); + Gram.Snterm + (Gram.Entry.obj + (semi : 'semi Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (d : 'macro_def_sig) + (_loc : Gram.Loc.t) -> + (execute_macro_if_active_branch + _loc (Ast.SgNil _loc) + (fun a b -> + Ast.SgSem (_loc, a, b)) + Else d : + 'e__28)))) ]) ], + (Gram.Action.mk + (fun (sgl : 'e__28 list) (_loc : Gram.Loc.t) -> + (sgl : 'sglist_else)))) ]) ])) + ()); + Gram.extend (endif : 'endif Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "ENDIF" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> (() : 'endif)))); + ([ Gram.Skeyword "END" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> (() : 'endif)))) ]) ])) + ()); + Gram.extend (opt_macro_value : 'opt_macro_value Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([], + (Gram.Action.mk + (fun (_loc : Gram.Loc.t) -> + (None : 'opt_macro_value)))); + ([ Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> + (Some (([], e)) : 'opt_macro_value)))); + ([ Gram.Skeyword "("; + Gram.Slist1sep + ((Gram.srules opt_macro_value + [ ([ Gram.Stoken + (((function + | LIDENT ((_)) -> true + | _ -> false), + "LIDENT _")) ], + (Gram.Action.mk + (fun (x : Gram.Token.t) + (_loc : Gram.Loc.t) -> + (let x = + Gram.Token.extract_string x + in x : 'e__29)))) ]), + (Gram.Skeyword ",")); + Gram.Skeyword ")"; Gram.Skeyword "="; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ _ (pl : 'e__29 list) _ + (_loc : Gram.Loc.t) -> + (Some ((pl, e)) : 'opt_macro_value)))) ]) ])) + ()); + Gram.extend (expr : 'expr Gram.Entry.t) + ((fun () -> + ((Some (Camlp4.Sig.Grammar.Level "top")), + [ (None, None, + [ ([ Gram.Skeyword "DEFINE"; + Gram.Stoken + (((function | LIDENT ((_)) -> true | _ -> false), + "LIDENT _")); + Gram.Skeyword "="; Gram.Sself; + Gram.Skeyword "IN"; Gram.Sself ], + (Gram.Action.mk + (fun (body : 'expr) _ (def : 'expr) _ + (i : Gram.Token.t) _ (_loc : Gram.Loc.t) -> + (let i = Gram.Token.extract_string i + in (new subst _loc [ (i, def) ])#expr body : + 'expr)))); + ([ Gram.Skeyword "IFNDEF"; + Gram.Snterm + (Gram.Entry.obj (uident : 'uident Gram.Entry.t)); + Gram.Skeyword "THEN"; Gram.Sself; + Gram.Snterm + (Gram.Entry.obj + (else_expr : 'else_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e2 : 'else_expr) (e1 : 'expr) _ + (i : 'uident) _ (_loc : Gram.Loc.t) -> + (if is_defined i then e2 else e1 : 'expr)))); + ([ Gram.Skeyword "IFDEF"; + Gram.Snterm + (Gram.Entry.obj (uident : 'uident Gram.Entry.t)); + Gram.Skeyword "THEN"; Gram.Sself; + Gram.Snterm + (Gram.Entry.obj + (else_expr : 'else_expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e2 : 'else_expr) (e1 : 'expr) _ + (i : 'uident) _ (_loc : Gram.Loc.t) -> + (if is_defined i then e1 else e2 : 'expr)))) ]) ])) + ()); + Gram.extend (expr : 'expr Gram.Entry.t) + ((fun () -> + ((Some (Camlp4.Sig.Grammar.Level "simple")), + [ (None, None, + [ ([ Gram.Stoken + (((function + | LIDENT "__LOCATION__" -> true + | _ -> false), + "LIDENT \"__LOCATION__\"")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LIDENT "__LOCATION__" -> + (let (a, b, c, d, e, f, g, h) = + Loc.to_tuple _loc + in + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Loc")), + (Ast.IdLid (_loc, "of_tuple")))))), + (Ast.ExTup (_loc, + (Ast.ExCom (_loc, + (Ast.ExStr (_loc, + (Ast.safe_string_escaped a))), + (Ast.ExCom (_loc, + (Ast.ExCom (_loc, + (Ast.ExCom (_loc, + (Ast.ExCom (_loc, + (Ast.ExCom (_loc, + (Ast.ExCom + (_loc, + (Ast.ExInt + (_loc, + ( + string_of_int + b))), + (Ast.ExInt + (_loc, + ( + string_of_int + c))))), + (Ast.ExInt + (_loc, + (string_of_int + d))))), + (Ast.ExInt (_loc, + (string_of_int + e))))), + (Ast.ExInt (_loc, + (string_of_int f))))), + (Ast.ExInt (_loc, + (string_of_int g))))), + (if h + then + Ast.ExId (_loc, + (Ast.IdUid (_loc, + "True"))) + else + Ast.ExId (_loc, + (Ast.IdUid (_loc, + "False"))))))))))) : + 'expr) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | LIDENT "__FILE__" -> true + | _ -> false), + "LIDENT \"__FILE__\"")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LIDENT "__FILE__" -> + (Ast.ExStr (_loc, + (Ast.safe_string_escaped + (Loc.file_name _loc))) : + 'expr) + | _ -> assert false))) ]) ])) + ()); + Gram.extend (patt : 'patt Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "IFNDEF"; + Gram.Snterm + (Gram.Entry.obj (uident : 'uident Gram.Entry.t)); + Gram.Skeyword "THEN"; Gram.Sself; + Gram.Skeyword "ELSE"; Gram.Sself; + Gram.Snterm + (Gram.Entry.obj (endif : 'endif Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (p2 : 'patt) _ (p1 : 'patt) _ + (i : 'uident) _ (_loc : Gram.Loc.t) -> + (if is_defined i then p2 else p1 : 'patt)))); + ([ Gram.Skeyword "IFDEF"; + Gram.Snterm + (Gram.Entry.obj (uident : 'uident Gram.Entry.t)); + Gram.Skeyword "THEN"; Gram.Sself; + Gram.Skeyword "ELSE"; Gram.Sself; + Gram.Snterm + (Gram.Entry.obj (endif : 'endif Gram.Entry.t)) ], + (Gram.Action.mk + (fun _ (p2 : 'patt) _ (p1 : 'patt) _ + (i : 'uident) _ (_loc : Gram.Loc.t) -> + (if is_defined i then p1 else p2 : 'patt)))) ]) ])) + ()); + Gram.extend (uident : 'uident Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function | UIDENT ((_)) -> true | _ -> false), + "UIDENT _")) ], + (Gram.Action.mk + (fun (i : Gram.Token.t) (_loc : Gram.Loc.t) -> + (let i = Gram.Token.extract_string i in i : + 'uident)))) ]) ])) + ())) + + let _ = + Options.add "-D" (Arg.String parse_def) + "<string> Define for IFDEF instruction." + + let _ = + Options.add "-U" (Arg.String undef) + "<string> Undefine for IFDEF instruction." + + let _ = + Options.add "-I" (Arg.String add_include_dir) + "<string> Add a directory to INCLUDE search path." + + end + + let _ = let module M = Register.OCamlSyntaxExtension(Id)(Make) in () + + module MakeNothing (AstFilters : Camlp4.Sig.AstFilters) = + struct + open AstFilters + + open Ast + + let remove_nothings = + function + | Ast.ExApp (_, e, (Ast.ExId (_, (Ast.IdUid (_, "NOTHING"))))) | + Ast.ExFun (_, + (Ast.McArr (_, (Ast.PaId (_, (Ast.IdUid (_, "NOTHING")))), + (Ast.ExNil _), e))) + -> e + | e -> e + + let _ = + register_str_item_filter (Ast.map_expr remove_nothings)#str_item + + end + + let _ = let module M = Camlp4.Register.AstFilter(Id)(MakeNothing) in () + + end + +module D = + struct + open Camlp4 + + (* -*- camlp4r -*- *) + (****************************************************************************) + (* *) + (* Objective Caml *) + (* *) + (* INRIA Rocquencourt *) + (* *) + (* Copyright 2006 Institut National de Recherche en Informatique et *) + (* en Automatique. All rights reserved. This file is distributed under *) + (* the terms of the GNU Library General Public License, with the special *) + (* exception on linking described in LICENSE at the top of the Objective *) + (* Caml source tree. *) + (* *) + (****************************************************************************) + (* Authors: + * - Nicolas Pouillard: initial version + *) + module Id = + struct let name = "Camlp4DebugParser" + let version = Sys.ocaml_version + + end + + module Make (Syntax : Sig.Camlp4Syntax) = + struct + open Sig + + include Syntax + + module StringSet = Set.Make(String) + + let debug_mode = + try + let str = Sys.getenv "STATIC_CAMLP4_DEBUG" in + let rec loop acc i = + try + let pos = String.index_from str i ':' + in + loop (StringSet.add (String.sub str i (pos - i)) acc) + (pos + 1) + with + | Not_found -> + StringSet.add (String.sub str i ((String.length str) - i)) + acc in + let sections = loop StringSet.empty 0 + in + if StringSet.mem "*" sections + then (fun _ -> true) + else (fun x -> StringSet.mem x sections) + with | Not_found -> (fun _ -> false) + + let rec apply accu = + function + | [] -> accu + | x :: xs -> + let _loc = Ast.loc_of_expr x + in apply (Ast.ExApp (_loc, accu, x)) xs + + let mk_debug_mode _loc = + function + | None -> + Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Debug")), + (Ast.IdLid (_loc, "mode"))))) + | Some m -> + Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, m)), + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Debug")), + (Ast.IdLid (_loc, "mode"))))))) + + let mk_debug _loc m fmt section args = + let call = + apply + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Debug")), + (Ast.IdLid (_loc, "printf")))))), + (Ast.ExStr (_loc, section)))), + (Ast.ExStr (_loc, fmt)))) + args + in + Ast.ExIfe (_loc, + (Ast.ExApp (_loc, (mk_debug_mode _loc m), + (Ast.ExStr (_loc, section)))), + call, (Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))))) + + let _ = + let _ = (expr : 'expr Gram.Entry.t) in + let grammar_entry_create = Gram.Entry.mk in + let end_or_in : 'end_or_in Gram.Entry.t = + grammar_entry_create "end_or_in" + and start_debug : 'start_debug Gram.Entry.t = + grammar_entry_create "start_debug" + in + (Gram.extend (expr : 'expr Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterm + (Gram.Entry.obj + (start_debug : 'start_debug Gram.Entry.t)); + Gram.Stoken + (((function | LIDENT ((_)) -> true | _ -> false), + "LIDENT _")); + Gram.Stoken + (((function | STRING ((_)) -> true | _ -> false), + "STRING _")); + Gram.Slist0 + (Gram.Snterml + ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), + ".")); + Gram.Snterm + (Gram.Entry.obj + (end_or_in : 'end_or_in Gram.Entry.t)) ], + (Gram.Action.mk + (fun (x : 'end_or_in) (args : 'expr list) + (fmt : Gram.Token.t) (section : Gram.Token.t) + (m : 'start_debug) (_loc : Gram.Loc.t) -> + (let fmt = Gram.Token.extract_string fmt in + let section = + Gram.Token.extract_string section + in + match (x, (debug_mode section)) with + | (None, false) -> + Ast.ExId (_loc, + (Ast.IdUid (_loc, "()"))) + | (Some e, false) -> e + | (None, _) -> + mk_debug _loc m fmt section args + | (Some e, _) -> + Ast.ExLet (_loc, Ast.ReNil, + (Ast.BiEq (_loc, + (Ast.PaId (_loc, + (Ast.IdUid (_loc, "()")))), + (mk_debug _loc m fmt section args))), + e) : + 'expr)))) ]) ])) + ()); + Gram.extend (end_or_in : 'end_or_in Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Skeyword "in"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> + (Some e : 'end_or_in)))); + ([ Gram.Skeyword "end" ], + (Gram.Action.mk + (fun _ (_loc : Gram.Loc.t) -> + (None : 'end_or_in)))) ]) ])) + ()); + Gram.extend (start_debug : 'start_debug Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Stoken + (((function + | LIDENT "camlp4_debug" -> true + | _ -> false), + "LIDENT \"camlp4_debug\"")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LIDENT "camlp4_debug" -> + (Some "Camlp4" : 'start_debug) + | _ -> assert false))); + ([ Gram.Stoken + (((function + | LIDENT "debug" -> true + | _ -> false), + "LIDENT \"debug\"")) ], + (Gram.Action.mk + (fun (__camlp4_0 : Gram.Token.t) + (_loc : Gram.Loc.t) -> + match __camlp4_0 with + | LIDENT "debug" -> (None : 'start_debug) + | _ -> assert false))) ]) ])) + ())) + + end + + let _ = let module M = Register.OCamlSyntaxExtension(Id)(Make) in () + + end + +module L = + struct + open Camlp4 + + (* -*- camlp4r -*- *) + (****************************************************************************) + (* *) + (* Objective Caml *) + (* *) + (* INRIA Rocquencourt *) + (* *) + (* Copyright 2007 Institut National de Recherche en Informatique et *) + (* en Automatique. All rights reserved. This file is distributed under *) + (* the terms of the GNU Library General Public License, with the special *) + (* exception on linking described in LICENSE at the top of the Objective *) + (* Caml source tree. *) + (* *) + (****************************************************************************) + (* Authors: + * - Nao Hirokawa: initial version + * - Nicolas Pouillard: revised syntax version + *) + module Id = + struct + let name = "Camlp4ListComprenhsion" + + let version = Sys.ocaml_version + + end + + module Make (Syntax : Sig.Camlp4Syntax) = + struct + open Sig + + include Syntax + + let rec loop n = + function + | [] -> None + | [ (x, _) ] -> if n = 1 then Some x else None + | _ :: l -> loop (n - 1) l + + let stream_peek_nth n strm = loop n (Stream.npeek n strm) + + (* usual trick *) + let test_patt_lessminus = + Gram.Entry.of_parser "test_patt_lessminus" + (fun strm -> + let rec skip_patt n = + match stream_peek_nth n strm with + | Some (KEYWORD "<-") -> n + | Some (KEYWORD ("[" | "[<")) -> + skip_patt ((ignore_upto "]" (n + 1)) + 1) + | Some (KEYWORD "(") -> + skip_patt ((ignore_upto ")" (n + 1)) + 1) + | Some (KEYWORD "{") -> + skip_patt ((ignore_upto "}" (n + 1)) + 1) + | Some (KEYWORD ("as" | "::" | "," | "_")) | + Some (LIDENT _ | UIDENT _) -> skip_patt (n + 1) + | Some _ | None -> raise Stream.Failure + and ignore_upto end_kwd n = + match stream_peek_nth n strm with + | Some (KEYWORD prm) when prm = end_kwd -> n + | Some (KEYWORD ("[" | "[<")) -> + ignore_upto end_kwd ((ignore_upto "]" (n + 1)) + 1) + | Some (KEYWORD "(") -> + ignore_upto end_kwd ((ignore_upto ")" (n + 1)) + 1) + | Some (KEYWORD "{") -> + ignore_upto end_kwd ((ignore_upto "}" (n + 1)) + 1) + | Some _ -> ignore_upto end_kwd (n + 1) + | None -> raise Stream.Failure + in skip_patt 1) + + let map _loc p e l = + match (p, e) with + | (Ast.PaId (_, (Ast.IdLid (_, x))), + Ast.ExId (_, (Ast.IdLid (_, y)))) when x = y -> l + | _ -> + if Ast.is_irrefut_patt p + then + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "List")), + (Ast.IdLid (_loc, "map")))))), + (Ast.ExFun (_loc, + (Ast.McArr (_loc, p, (Ast.ExNil _loc), e)))))), + l) + else + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "List")), + (Ast.IdLid (_loc, "fold_right")))))), + (Ast.ExFun (_loc, + (Ast.McOr (_loc, + (Ast.McArr (_loc, p, + (Ast.ExId (_loc, (Ast.IdUid (_loc, "True")))), + (Ast.ExApp (_loc, + (Ast.ExFun (_loc, + (Ast.McArr (_loc, + (Ast.PaId (_loc, + (Ast.IdLid (_loc, "x")))), + (Ast.ExNil _loc), + (Ast.ExFun (_loc, + (Ast.McArr (_loc, + (Ast.PaId (_loc, + (Ast.IdLid (_loc, "xs")))), + (Ast.ExNil _loc), + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdUid (_loc, + "::")))), + (Ast.ExId (_loc, + (Ast.IdLid (_loc, + "x")))))), + (Ast.ExId (_loc, + (Ast.IdLid (_loc, "xs")))))))))))))), + e)))), + (Ast.McArr (_loc, (Ast.PaAny _loc), + (Ast.ExNil _loc), + (Ast.ExFun (_loc, + (Ast.McArr (_loc, + (Ast.PaId (_loc, + (Ast.IdLid (_loc, "l")))), + (Ast.ExNil _loc), + (Ast.ExId (_loc, + (Ast.IdLid (_loc, "l")))))))))))))))), + l)), + (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]"))))) + + let filter _loc p b l = + if Ast.is_irrefut_patt p + then + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "List")), + (Ast.IdLid (_loc, "filter")))))), + (Ast.ExFun (_loc, + (Ast.McArr (_loc, p, (Ast.ExNil _loc), b)))))), + l) + else + Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "List")), + (Ast.IdLid (_loc, "filter")))))), + (Ast.ExFun (_loc, + (Ast.McOr (_loc, + (Ast.McArr (_loc, p, + (Ast.ExId (_loc, (Ast.IdUid (_loc, "True")))), b)), + (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), + (Ast.ExId (_loc, (Ast.IdUid (_loc, "False")))))))))))), + l) + + let concat _loc l = + Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "List")), + (Ast.IdLid (_loc, "concat")))))), + l) + + let rec compr _loc e = + function + | [ `gen ((p, l)) ] -> map _loc p e l + | `gen ((p, l)) :: `cond b :: items -> + compr _loc e ((`gen ((p, (filter _loc p b l)))) :: items) + | `gen ((p, l)) :: ((`gen ((_, _)) :: _ as is)) -> + concat _loc (map _loc p (compr _loc e is) l) + | _ -> raise Stream.Failure + + let _ = + Gram.delete_rule expr + [ Gram.Skeyword "["; + Gram.Snterm + (Gram.Entry.obj + (sem_expr_for_list : 'sem_expr_for_list Gram.Entry.t)); + Gram.Skeyword "]" ] + + let is_revised = + try + (Gram.delete_rule expr + [ Gram.Skeyword "["; + Gram.Snterm + (Gram.Entry.obj + (sem_expr_for_list : 'sem_expr_for_list Gram.Entry.t)); + Gram.Skeyword "::"; + Gram.Snterm (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); + Gram.Skeyword "]" ]; + true) + with | Not_found -> false + + let comprehension_or_sem_expr_for_list = + Gram.Entry.mk "comprehension_or_sem_expr_for_list" + + let _ = + let _ = (expr : 'expr Gram.Entry.t) + and _ = + (comprehension_or_sem_expr_for_list : + 'comprehension_or_sem_expr_for_list Gram.Entry.t) in + let grammar_entry_create = Gram.Entry.mk in + let item : 'item Gram.Entry.t = grammar_entry_create "item" + in + (Gram.extend (expr : 'expr Gram.Entry.t) + ((fun () -> + ((Some (Camlp4.Sig.Grammar.Level "simple")), + [ (None, None, + [ ([ Gram.Skeyword "["; + Gram.Snterm + (Gram.Entry.obj + (comprehension_or_sem_expr_for_list : + 'comprehension_or_sem_expr_for_list Gram. + Entry.t)); + Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ (e : 'comprehension_or_sem_expr_for_list) + _ (_loc : Gram.Loc.t) -> (e : 'expr)))) ]) ])) + ()); + Gram.extend + (comprehension_or_sem_expr_for_list : + 'comprehension_or_sem_expr_for_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterml + ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), + "top") ], + (Gram.Action.mk + (fun (e : 'expr) (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdUid (_loc, "::")))), + e)), + (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]"))))) : + 'comprehension_or_sem_expr_for_list)))); + ([ Gram.Snterml + ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), + "top"); + Gram.Skeyword "|"; + Gram.Slist1sep + ((Gram.Snterm + (Gram.Entry.obj (item : 'item Gram.Entry.t))), + (Gram.Skeyword ";")) ], + (Gram.Action.mk + (fun (l : 'item list) _ (e : 'expr) + (_loc : Gram.Loc.t) -> + (compr _loc e l : + 'comprehension_or_sem_expr_for_list)))); + ([ Gram.Snterml + ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), + "top"); + Gram.Skeyword ";" ], + (Gram.Action.mk + (fun _ (e : 'expr) (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdUid (_loc, "::")))), + e)), + (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]"))))) : + 'comprehension_or_sem_expr_for_list)))); + ([ Gram.Snterml + ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), + "top"); + Gram.Skeyword ";"; + Gram.Snterm + (Gram.Entry.obj + (sem_expr_for_list : + 'sem_expr_for_list Gram.Entry.t)) ], + (Gram.Action.mk + (fun (mk : 'sem_expr_for_list) _ (e : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdUid (_loc, "::")))), + e)), + (mk + (Ast.ExId (_loc, + (Ast.IdUid (_loc, "[]")))))) : + 'comprehension_or_sem_expr_for_list)))) ]) ])) + ()); + Gram.extend (item : 'item Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ (* NP: These rules rely on being on this particular order. Which should + be improved. *) + Gram.Snterml + ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), + "top") ], + (Gram.Action.mk + (fun (e : 'expr) (_loc : Gram.Loc.t) -> + (`cond e : 'item)))); + ([ Gram.Stry + (Gram.srules item + [ ([ Gram.Snterm + (Gram.Entry.obj + (patt : 'patt Gram.Entry.t)); + Gram.Skeyword "<-" ], + (Gram.Action.mk + (fun _ (p : 'patt) (_loc : Gram.Loc.t) + -> (p : 'e__30)))) ]); + Gram.Snterml + ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), + "top") ], + (Gram.Action.mk + (fun (e : 'expr) (p : 'e__30) + (_loc : Gram.Loc.t) -> + (`gen ((p, e)) : 'item)))) ]) ])) + ())) + + let _ = + if is_revised + then + (let _ = (expr : 'expr Gram.Entry.t) + and _ = + (comprehension_or_sem_expr_for_list : + 'comprehension_or_sem_expr_for_list Gram.Entry.t) + in + Gram.extend + (comprehension_or_sem_expr_for_list : + 'comprehension_or_sem_expr_for_list Gram.Entry.t) + ((fun () -> + (None, + [ (None, None, + [ ([ Gram.Snterml + ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), + "top"); + Gram.Skeyword "::"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (last : 'expr) _ (e : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdUid (_loc, "::")))), + e)), + last) : + 'comprehension_or_sem_expr_for_list)))); + ([ Gram.Snterml + ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), + "top"); + Gram.Skeyword ";"; + Gram.Snterm + (Gram.Entry.obj + (sem_expr_for_list : + 'sem_expr_for_list Gram.Entry.t)); + Gram.Skeyword "::"; + Gram.Snterm + (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], + (Gram.Action.mk + (fun (last : 'expr) _ + (mk : 'sem_expr_for_list) _ (e : 'expr) + (_loc : Gram.Loc.t) -> + (Ast.ExApp (_loc, + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdUid (_loc, "::")))), + e)), + (mk last)) : + 'comprehension_or_sem_expr_for_list)))) ]) ])) + ())) + else () + + end + + let _ = let module M = Register.OCamlSyntaxExtension(Id)(Make) in () + + end + +module P = + struct + (****************************************************************************) + (* *) + (* Objective Caml *) + (* *) + (* INRIA Rocquencourt *) + (* *) + (* Copyright 2006 Institut National de Recherche en Informatique et *) + (* en Automatique. All rights reserved. This file is distributed under *) + (* the terms of the GNU Library General Public License, with the special *) + (* exception on linking described in LICENSE at the top of the Objective *) + (* Caml source tree. *) + (* *) + (****************************************************************************) + (* Authors: + * - Nicolas Pouillard: initial version + *) + let _ = Camlp4.Register.enable_dump_ocaml_ast_printer () + + end + +module B = + struct + (* camlp4r *) + (****************************************************************************) + (* *) + (* Objective Caml *) + (* *) + (* INRIA Rocquencourt *) + (* *) + (* Copyright 2006 Institut National de Recherche en Informatique et *) + (* en Automatique. All rights reserved. This file is distributed under *) + (* the terms of the GNU Library General Public License, with the special *) + (* exception on linking described in LICENSE at the top of the Objective *) + (* Caml source tree. *) + (* *) + (****************************************************************************) + (* Authors: + * - Daniel de Rauglaudre: initial version + * - Nicolas Pouillard: refactoring + *) + open Camlp4 + + open PreCast.Syntax + + open PreCast + + open Format + + module CleanAst = Camlp4.Struct.CleanAst.Make(Ast) + + module SSet = Set.Make(String) + + let pa_r = "Camlp4OCamlRevisedParser" + + let pa_rr = "Camlp4OCamlReloadedParser" + + let pa_o = "Camlp4OCamlParser" + + let pa_rp = "Camlp4OCamlRevisedParserParser" + + let pa_op = "Camlp4OCamlParserParser" + + let pa_g = "Camlp4GrammarParser" + + let pa_m = "Camlp4MacroParser" + + let pa_qb = "Camlp4QuotationCommon" + + let pa_q = "Camlp4QuotationExpander" + + let pa_rq = "Camlp4OCamlRevisedQuotationExpander" + + let pa_oq = "Camlp4OCamlOriginalQuotationExpander" + + let pa_l = "Camlp4ListComprehension" + + open Register + + let dyn_loader = + ref (fun _ -> raise (Match_failure ("./camlp4/Camlp4Bin.ml", 45, 24))) + + let rcall_callback = ref (fun () -> ()) + + let loaded_modules = ref SSet.empty + + let add_to_loaded_modules name = + loaded_modules := SSet.add name !loaded_modules + + let (objext, libext) = + if DynLoader.is_native then (".cmxs", ".cmxs") else (".cmo", ".cma") + + let rewrite_and_load n x = + let dyn_loader = !dyn_loader () in + let find_in_path = DynLoader.find_in_path dyn_loader in + let real_load name = + (add_to_loaded_modules name; DynLoader.load dyn_loader name) in + let load = + List.iter + (fun n -> + if + (SSet.mem n !loaded_modules) || + (List.mem n !Register.loaded_modules) + then () + else + (add_to_loaded_modules n; + DynLoader.load dyn_loader (n ^ objext))) + in + ((match (n, (String.lowercase x)) with + | (("Parsers" | ""), + ("pa_r.cmo" | "r" | "ocamlr" | "ocamlrevised" | + "camlp4ocamlrevisedparser.cmo")) + -> load [ pa_r ] + | (("Parsers" | ""), + ("rr" | "reloaded" | "ocamlreloaded" | + "camlp4ocamlreloadedparser.cmo")) + -> load [ pa_rr ] + | (("Parsers" | ""), + ("pa_o.cmo" | "o" | "ocaml" | "camlp4ocamlparser.cmo")) -> + load [ pa_r; pa_o ] + | (("Parsers" | ""), + ("pa_rp.cmo" | "rp" | "rparser" | + "camlp4ocamlrevisedparserparser.cmo")) + -> load [ pa_r; pa_o; pa_rp ] + | (("Parsers" | ""), + ("pa_op.cmo" | "op" | "parser" | "camlp4ocamlparserparser.cmo")) + -> load [ pa_r; pa_o; pa_rp; pa_op ] + | (("Parsers" | ""), + ("pa_extend.cmo" | "pa_extend_m.cmo" | "g" | "grammar" | + "camlp4grammarparser.cmo")) + -> load [ pa_g ] + | (("Parsers" | ""), + ("pa_macro.cmo" | "m" | "macro" | "camlp4macroparser.cmo")) -> + load [ pa_m ] + | (("Parsers" | ""), ("q" | "camlp4quotationexpander.cmo")) -> + load [ pa_qb; pa_q ] + | (("Parsers" | ""), + ("q_mlast.cmo" | "rq" | + "camlp4ocamlrevisedquotationexpander.cmo")) + -> load [ pa_qb; pa_rq ] + | (("Parsers" | ""), + ("oq" | "camlp4ocamloriginalquotationexpander.cmo")) -> + load [ pa_r; pa_o; pa_qb; pa_oq ] + | (("Parsers" | ""), "rf") -> + load [ pa_r; pa_rp; pa_qb; pa_q; pa_g; pa_l; pa_m ] + | (("Parsers" | ""), "of") -> + load + [ pa_r; pa_o; pa_rp; pa_op; pa_qb; pa_rq; pa_g; pa_l; pa_m ] + | (("Parsers" | ""), ("comp" | "camlp4listcomprehension.cmo")) -> + load [ pa_l ] + | (("Filters" | ""), ("lift" | "camlp4astlifter.cmo")) -> + load [ "Camlp4AstLifter" ] + | (("Filters" | ""), ("exn" | "camlp4exceptiontracer.cmo")) -> + load [ "Camlp4ExceptionTracer" ] + | (("Filters" | ""), ("prof" | "camlp4profiler.cmo")) -> + load [ "Camlp4Profiler" ] + | (("Filters" | ""), ("map" | "camlp4mapgenerator.cmo")) -> + load [ "Camlp4FoldGenerator" ] + | (("Filters" | ""), ("fold" | "camlp4foldgenerator.cmo")) -> + load [ "Camlp4FoldGenerator" ] + | (("Filters" | ""), ("meta" | "camlp4metagenerator.cmo")) -> + load [ "Camlp4MetaGenerator" ] + | (("Filters" | ""), ("trash" | "camlp4trashremover.cmo")) -> + load [ "Camlp4TrashRemover" ] + | (("Filters" | ""), ("striploc" | "camlp4locationstripper.cmo")) + -> load [ "Camlp4LocationStripper" ] + | (("Printers" | ""), + ("pr_r.cmo" | "r" | "ocamlr" | "camlp4ocamlrevisedprinter.cmo")) + -> Register.enable_ocamlr_printer () + | (("Printers" | ""), + ("pr_o.cmo" | "o" | "ocaml" | "camlp4ocamlprinter.cmo")) -> + Register.enable_ocaml_printer () + | (("Printers" | ""), + ("pr_dump.cmo" | "p" | "dumpocaml" | "camlp4ocamlastdumper.cmo")) + -> Register.enable_dump_ocaml_ast_printer () + | (("Printers" | ""), ("d" | "dumpcamlp4" | "camlp4astdumper.cmo")) + -> Register.enable_dump_camlp4_ast_printer () + | (("Printers" | ""), ("a" | "auto" | "camlp4autoprinter.cmo")) -> + load [ "Camlp4AutoPrinter" ] + | _ -> + let y = "Camlp4" ^ (n ^ ("/" ^ (x ^ objext))) + in real_load (try find_in_path y with | Not_found -> x)); + !rcall_callback ()) + + (* map is now an alias of fold since fold handles map too *) + let print_warning = eprintf "%a:\n%s@." Loc.print + + let rec parse_file dyn_loader name pa getdir = + let directive_handler = + Some + (fun ast -> + match getdir ast with + | Some x -> + (match x with + | (_, "load", s) -> (rewrite_and_load "" s; None) + | (_, "directory", s) -> + (DynLoader.include_dir dyn_loader s; None) + | (_, "use", s) -> Some (parse_file dyn_loader s pa getdir) + | (_, "default_quotation", s) -> + (Quotation.default := s; None) + | (loc, _, _) -> + Loc.raise loc (Stream.Error "bad directive")) + | None -> None) in + let loc = Loc.mk name + in + (current_warning := print_warning; + let ic = if name = "-" then stdin else open_in_bin name in + let cs = Stream.of_channel ic in + let clear () = if name = "-" then () else close_in ic in + let phr = + try pa ?directive_handler loc cs with | x -> (clear (); raise x) + in (clear (); phr)) + + let output_file = ref None + + let process dyn_loader name pa pr clean fold_filters getdir = + let ast = parse_file dyn_loader name pa getdir in + let ast = fold_filters (fun t filter -> filter t) ast in + let ast = clean ast + in pr ?input_file: (Some name) ?output_file: !output_file ast + + let gind = + function + | Ast.SgDir (loc, n, (Ast.ExStr (_, s))) -> Some ((loc, n, s)) + | _ -> None + + let gimd = + function + | Ast.StDir (loc, n, (Ast.ExStr (_, s))) -> Some ((loc, n, s)) + | _ -> None + + let process_intf dyn_loader name = + process dyn_loader name CurrentParser.parse_interf CurrentPrinter. + print_interf (new CleanAst.clean_ast)#sig_item AstFilters. + fold_interf_filters gind + + let process_impl dyn_loader name = + process dyn_loader name CurrentParser.parse_implem CurrentPrinter. + print_implem (new CleanAst.clean_ast)#str_item AstFilters. + fold_implem_filters gimd + + let just_print_the_version () = + (printf "%s@." Camlp4_config.version; exit 0) + + let print_version () = + (eprintf "Camlp4 version %s@." Camlp4_config.version; exit 0) + + let print_stdlib () = + (printf "%s@." Camlp4_config.camlp4_standard_library; exit 0) + + let usage ini_sl ext_sl = + (eprintf + "\ +Usage: camlp4 [load-options] [--] [other-options]\n\ +Options:\n\ +<file>.ml Parse this implementation file\n\ +<file>.mli Parse this interface file\n\ +<file>.%s Load this module inside the Camlp4 core@." + (if DynLoader.is_native then "cmxs " else "(cmo|cma)"); + Options.print_usage_list ini_sl; + if ext_sl <> [] + then + (eprintf "Options added by loaded object files:@."; + Options.print_usage_list ext_sl) + else ()) + + (* loop (ini_sl @ ext_sl) where rec loop = + fun + [ [(y, _, _) :: _] when y = "-help" -> () + | [_ :: sl] -> loop sl + | [] -> eprintf " -help Display this list of options.@." ]; *) + let warn_noassert () = + eprintf + "\ +camlp4 warning: option -noassert is obsolete\n\ +You should give the -noassert option to the ocaml compiler instead.@." + + type file_kind = + | Intf of string + | Impl of string + | Str of string + | ModuleImpl of string + | IncludeDir of string + + let search_stdlib = ref true + + let print_loaded_modules = ref false + + let (task, do_task) = + let t = ref None in + let task f x = + let () = Camlp4_config.current_input_file := x + in + t := + Some + (if !t = None then (fun _ -> f x) else (fun usage -> usage ())) in + let do_task usage = match !t with | Some f -> f usage | None -> () + in (task, do_task) + + let input_file x = + let dyn_loader = !dyn_loader () + in + (!rcall_callback (); + (match x with + | Intf file_name -> task (process_intf dyn_loader) file_name + | Impl file_name -> task (process_impl dyn_loader) file_name + | Str s -> + let (f, o) = Filename.open_temp_file "from_string" ".ml" + in + (output_string o s; + close_out o; + task (process_impl dyn_loader) f; + at_exit (fun () -> Sys.remove f)) + | ModuleImpl file_name -> rewrite_and_load "" file_name + | IncludeDir dir -> DynLoader.include_dir dyn_loader dir); + !rcall_callback ()) + + let initial_spec_list = + [ ("-I", (Arg.String (fun x -> input_file (IncludeDir x))), + "<directory> Add directory in search patch for object files."); + ("-where", (Arg.Unit print_stdlib), + "Print camlp4 library directory and exit."); + ("-nolib", (Arg.Clear search_stdlib), + "No automatic search for object files in library directory."); + ("-intf", (Arg.String (fun x -> input_file (Intf x))), + "<file> Parse <file> as an interface, whatever its extension."); + ("-impl", (Arg.String (fun x -> input_file (Impl x))), + "<file> Parse <file> as an implementation, whatever its extension."); + ("-str", (Arg.String (fun x -> input_file (Str x))), + "<string> Parse <string> as an implementation."); + ("-unsafe", (Arg.Set Camlp4_config.unsafe), + "Generate unsafe accesses to array and strings."); + ("-noassert", (Arg.Unit warn_noassert), + "Obsolete, do not use this option."); + ("-verbose", (Arg.Set Camlp4_config.verbose), + "More verbose in parsing errors."); + ("-loc", (Arg.Set_string Loc.name), + ("<name> Name of the location variable (default: " ^ + (!Loc.name ^ ")."))); + ("-QD", (Arg.String (fun x -> Quotation.dump_file := Some x)), + "<file> Dump quotation expander result in case of syntax error."); + ("-o", (Arg.String (fun x -> output_file := Some x)), + "<file> Output on <file> instead of standard output."); + ("-v", (Arg.Unit print_version), "Print Camlp4 version and exit."); + ("-version", (Arg.Unit just_print_the_version), + "Print Camlp4 version number and exit."); + ("-vnum", (Arg.Unit just_print_the_version), + "Print Camlp4 version number and exit."); + ("-no_quot", (Arg.Clear Camlp4_config.quotations), + "Don't parse quotations, allowing to use, e.g. \"<:>\" as token."); + ("-loaded-modules", (Arg.Set print_loaded_modules), + "Print the list of loaded modules."); + ("-parser", (Arg.String (rewrite_and_load "Parsers")), + "<name> Load the parser Camlp4Parsers/<name>.cm(o|a|xs)"); + ("-printer", (Arg.String (rewrite_and_load "Printers")), + "<name> Load the printer Camlp4Printers/<name>.cm(o|a|xs)"); + ("-filter", (Arg.String (rewrite_and_load "Filters")), + "<name> Load the filter Camlp4Filters/<name>.cm(o|a|xs)"); + ("-ignore", (Arg.String ignore), "ignore the next argument"); + ("--", (Arg.Unit ignore), "Deprecated, does nothing") ] + + let _ = Options.init initial_spec_list + + let anon_fun name = + input_file + (if Filename.check_suffix name ".mli" + then Intf name + else + if Filename.check_suffix name ".ml" + then Impl name + else + if Filename.check_suffix name objext + then ModuleImpl name + else + if Filename.check_suffix name libext + then ModuleImpl name + else raise (Arg.Bad ("don't know what to do with " ^ name))) + + let main argv = + let usage () = + (usage initial_spec_list (Options.ext_spec_list ()); exit 0) + in + try + let dynloader = + DynLoader.mk ~ocaml_stdlib: !search_stdlib + ~camlp4_stdlib: !search_stdlib () + in + (dyn_loader := (fun () -> dynloader); + let call_callback () = + Register.iter_and_take_callbacks + (fun (name, module_callback) -> + let () = add_to_loaded_modules name in module_callback ()) + in + (call_callback (); + rcall_callback := call_callback; + (match Options.parse anon_fun argv with + | [] -> () + | ("-help" | "--help" | "-h" | "-?") :: _ -> usage () + | s :: _ -> + (eprintf "%s: unknown or misused option\n" s; + eprintf "Use option -help for usage@."; + exit 2)); + do_task usage; + call_callback (); + if !print_loaded_modules + then SSet.iter (eprintf "%s@.") !loaded_modules + else ())) + with + | Arg.Bad s -> + (eprintf "Error: %s\n" s; + eprintf "Use option -help for usage@."; + exit 2) + | Arg.Help _ -> usage () + | exc -> (eprintf "@[<v0>%a@]@." ErrorHandler.print exc; exit 2) + + let _ = main Sys.argv + + end + + |
