summaryrefslogtreecommitdiff
path: root/ocaml-binary-annot/camlp4/boot/camlp4boot.ml
diff options
context:
space:
mode:
Diffstat (limited to 'ocaml-binary-annot/camlp4/boot/camlp4boot.ml')
-rw-r--r--ocaml-binary-annot/camlp4/boot/camlp4boot.ml15516
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
+
+