Module Ocaml_parsing.Parsetree
Abstract syntax tree produced by parsing
Warning: this module is unstable and part of compiler-libs.
type constant = | Pconst_integer of string * char option(*Integer constants such as
33l3L3n.Suffixes
*)[g-z][G-Z]are accepted by the parser. Suffixes except'l','L'and'n'are rejected by the typechecker| Pconst_unboxed_integer of string * char(*Integer constants such as
#3#3l#3L#3n.A suffix
*)[g-z][G-Z]is required by the parser. Suffixes except's','S','l','L','n', and'm'are rejected by the typechecker| Pconst_char of char(*Character such as
*)'c'.| Pconst_untagged_char of char(*Untagged character such as
*)#'c'.| Pconst_string of string * Ocaml_parsing.Location.t * string option(*Constant string such as
"constant"or{delim|other constant|delim}.The location span the content of the string, without the delimiters.
*)| Pconst_float of string * char option(*Float constant such as
3.4,2e5or1.4e-4.Suffixes
*)g-zG-Zare accepted by the parser. Suffixes except's'are rejected by the typechecker.| Pconst_unboxed_float of string * char option(*Float constant such as
#3.4,#2e5or#1.4e-4.Suffixes
*)g-zG-Zare accepted by the parser. Suffixes except's'are rejected by the typechecker.
type location_stack = Ocaml_parsing.Location.t listtype modalities =
Ocaml_parsing.Parsetree.modality Ocaml_parsing.Asttypes.loc listtype modes = Ocaml_parsing.Parsetree.mode Ocaml_parsing.Asttypes.loc listExtension points
type attribute = {attr_name : string Ocaml_parsing.Asttypes.loc;attr_payload : Ocaml_parsing.Parsetree.payload;attr_loc : Ocaml_parsing.Location.t;
}Attributes such as [\@id ARG] and [\@\@id ARG].
Metadata containers passed around within the AST. The compiler ignores unknown attributes.
and extension =
string Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.payloadExtension points such as [%id ARG] and [%%id ARG].
Sub-language placeholder -- rejected by the typechecker.
and attributes = Ocaml_parsing.Parsetree.attribute listand payload = | PStr of Ocaml_parsing.Parsetree.structure| PSig of Ocaml_parsing.Parsetree.signature(*
*): SIGin an attribute or an extension point| PTyp of Ocaml_parsing.Parsetree.core_type(*
*): Tin an attribute or an extension point| PPat of Ocaml_parsing.Parsetree.pattern * Ocaml_parsing.Parsetree.expression option(*
*)? Por? P when E, in an attribute or an extension point
Core language
Type expressions
and core_type = {ptyp_desc : Ocaml_parsing.Parsetree.core_type_desc;ptyp_loc : Ocaml_parsing.Location.t;ptyp_loc_stack : Ocaml_parsing.Parsetree.location_stack;ptyp_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)... [\@id1] [\@id2]
}and core_type_desc = | Ptyp_any of Ocaml_parsing.Parsetree.jkind_annotation option(*
*)_or_ : k| Ptyp_var of string * Ocaml_parsing.Parsetree.jkind_annotation option(*A type variable such as
*)'aor'a : k| Ptyp_arrow of Ocaml_parsing.Parsetree.arg_label * Ocaml_parsing.Parsetree.core_type * Ocaml_parsing.Parsetree.core_type * Ocaml_parsing.Parsetree.modes * Ocaml_parsing.Parsetree.modes| Ptyp_tuple of (string option * Ocaml_parsing.Parsetree.core_type) list(*Ptyp_tuple(tl)represents a product type:T1 * ... * Tnwhentlis(None,T1);...;(None,Tn)L1:T1 * ... * Ln:Tnwhentlis(Some L1,T1);...;(Some Ln,Tn)- A mix, e.g.
L1:T1 * T2whentlis(Some L1,T1);(None,T2)
Invariant:
*)n >= 2.| Ptyp_unboxed_tuple of (string option * Ocaml_parsing.Parsetree.core_type) list(*Unboxed tuple types:
Ptyp_unboxed_tuple([(Some l1,P1);...;(Some l2,Pn)]represents a product type#(l1:T1 * ... * l2:Tn), and the labels are optional.Invariant:
*)n >= 2.| Ptyp_constr of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.core_type list(*Ptyp_constr(lident, l)represents:tconstrwhenl=[],T tconstrwhenl=[T],(T1, ..., Tn) tconstrwhenl=[T1 ; ... ; Tn].
| Ptyp_object of Ocaml_parsing.Parsetree.object_field list * Ocaml_parsing.Asttypes.closed_flag| Ptyp_class of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.core_type list(*Ptyp_class(tconstr, l)represents:#tconstrwhenl=[],T #tconstrwhenl=[T],(T1, ..., Tn) #tconstrwhenl=[T1 ; ... ; Tn].
| Ptyp_alias of Ocaml_parsing.Parsetree.core_type * string Ocaml_parsing.Asttypes.loc option * Ocaml_parsing.Parsetree.jkind_annotation option(*T as 'aorT as ('a : k)orT as (_ : k).Invariant: the name or jkind annotation is non-None.
*)| Ptyp_variant of Ocaml_parsing.Parsetree.row_field list * Ocaml_parsing.Asttypes.closed_flag * Ocaml_parsing.Asttypes.label list option| Ptyp_poly of (string Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.jkind_annotation option) list * Ocaml_parsing.Parsetree.core_type(*'a1 ... 'an. T('a1 : k1) ... ('an : kn). TCan only appear in the following context:
As the
core_typeof aPpat_constraintnode corresponding to a constraint on a let-binding:let x : 'a1 ... 'an. T = e ...
- Under
Cfk_virtualfor methods (not values).
- As the
core_typeof aPctf_methodnode.
- As the
pld_typefield of alabel_declaration.
- As a
core_typeof aPtyp_objectnode.
- As the
pval_typefield of avalue_description.
- As the
core_typeof aPparam_val.
| Ptyp_package of Ocaml_parsing.Parsetree.package_type(*
*)(module S).| Ptyp_open of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.core_type(*
*)M.(T)| Ptyp_quote of Ocaml_parsing.Parsetree.core_type(*
*)<[T]>| Ptyp_splice of Ocaml_parsing.Parsetree.core_type(*
*)$T| Ptyp_of_kind of Ocaml_parsing.Parsetree.jkind_annotation(*
*)(type : k)| Ptyp_extension of Ocaml_parsing.Parsetree.extension(*
*)[%id].
and arg_label = Ocaml_parsing.Asttypes.arg_label = and package_type =
Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc
* (Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc
* Ocaml_parsing.Parsetree.core_type)
listAs package_type typed values:
(S, [])represents(module S),(S, [(t1, T1) ; ... ; (tn, Tn)])represents(module S with type t1 = T1 and ... and tn = Tn).
and row_field = {prf_desc : Ocaml_parsing.Parsetree.row_field_desc;prf_loc : Ocaml_parsing.Location.t;prf_attributes : Ocaml_parsing.Parsetree.attributes;
}and row_field_desc = | Rtag of Ocaml_parsing.Asttypes.label Ocaml_parsing.Asttypes.loc * bool * Ocaml_parsing.Parsetree.core_type list(*Rtag(`A, b, l)represents:`Awhenbistrueandlis[],`A of Twhenbisfalseandlis[T],`A of T1 & .. & Tnwhenbisfalseandlis[T1;...Tn],`A of & T1 & .. & Tnwhenbistrueandlis[T1;...Tn].
- The
boolfield is true if the tag contains a constant (empty) constructor. &occurs when several types are used for the same constructor (see 4.2 in the manual)
| Rinherit of Ocaml_parsing.Parsetree.core_type(*
*)[ | t ]
and object_field = {pof_desc : Ocaml_parsing.Parsetree.object_field_desc;pof_loc : Ocaml_parsing.Location.t;pof_attributes : Ocaml_parsing.Parsetree.attributes;
}Patterns
and pattern = {ppat_desc : Ocaml_parsing.Parsetree.pattern_desc;ppat_loc : Ocaml_parsing.Location.t;ppat_loc_stack : Ocaml_parsing.Parsetree.location_stack;ppat_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)... [\@id1] [\@id2]
}and pattern_desc = | Ppat_any(*The pattern
*)_.| Ppat_var of string Ocaml_parsing.Asttypes.loc(*A variable pattern such as
*)x| Ppat_alias of Ocaml_parsing.Parsetree.pattern * string Ocaml_parsing.Asttypes.loc(*An alias pattern such as
*)P as 'a| Ppat_constant of Ocaml_parsing.Parsetree.constant(*Patterns such as
*)1,'a',"true",1.0,1l,1L,1n| Ppat_interval of Ocaml_parsing.Parsetree.constant * Ocaml_parsing.Parsetree.constant(*Patterns such as
'a'..'z'.Other forms of interval are recognized by the parser but rejected by the type-checker.
*)| Ppat_tuple of (string option * Ocaml_parsing.Parsetree.pattern) list * Ocaml_parsing.Asttypes.closed_flag(*Ppat_tuple(pl, Closed)represents(P1, ..., Pn)whenplis(None, P1);...;(None, Pn)(~L1:P1, ..., ~Ln:Pn)whenplis(Some L1, P1);...;(Some Ln, Pn)- A mix, e.g.
(~L1:P1, P2)whenplis(Some L1, P1);(None, P2) - If pattern is open, then it also ends in a
..
Invariant:
- If Closed,
n >= 2. - If Open,
n >= 1.
| Ppat_unboxed_tuple of (string option * Ocaml_parsing.Parsetree.pattern) list * Ocaml_parsing.Asttypes.closed_flag(*Unboxed tuple patterns:
#(l1:P1, ..., ln:Pn)is([(Some l1,P1);...;(Some l2,Pn)], Closed), and the labels are optional. AnOpenpattern ends in...Invariant:
- If Closed,
n >= 2 - If Open,
n >= 1
- If Closed,
| Ppat_construct of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * ((string Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.jkind_annotation option) list * Ocaml_parsing.Parsetree.pattern) option(*Ppat_construct(C, args)represents:CwhenargsisNone,C PwhenargsisSome ([], P)C (P1, ..., Pn)whenargsisSome ([], Ppat_tuple [P1; ...; Pn])C (type a b) PwhenargsisSome ([a, None; b, None], P)C (type (a : k) b) PwhenargsisSome ([a, Some k; b, None], P)
| Ppat_variant of Ocaml_parsing.Asttypes.label * Ocaml_parsing.Parsetree.pattern option(*Ppat_variant(`A, pat)represents:`AwhenpatisNone,`A PwhenpatisSome P
| Ppat_record of (Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.pattern) list * Ocaml_parsing.Asttypes.closed_flag| Ppat_record_unboxed_product of (Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.pattern) list * Ocaml_parsing.Asttypes.closed_flag| Ppat_array of Ocaml_parsing.Asttypes.mutable_flag * Ocaml_parsing.Parsetree.pattern list(*Pattern
*)[| P1; ...; Pn |]or[: P1; ...; Pn :]| Ppat_or of Ocaml_parsing.Parsetree.pattern * Ocaml_parsing.Parsetree.pattern(*Pattern
*)P1 | P2| Ppat_constraint of Ocaml_parsing.Parsetree.pattern * Ocaml_parsing.Parsetree.core_type option * Ocaml_parsing.Parsetree.modes(*Ppat_constraint(tyopt, modes)represents:(P : ty @@ modes)whentyoptisSome ty(P @ modes)whentyoptisNone
| Ppat_type of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc(*Pattern
*)#tconst| Ppat_lazy of Ocaml_parsing.Parsetree.pattern(*Pattern
*)lazy P| Ppat_unpack of string option Ocaml_parsing.Asttypes.loc(*Ppat_unpack(s)represents:(module P)whensisSome "P"(module _)whensisNone
Note:
*)(module P : S)is represented asPpat_constraint(Ppat_unpack(Some "P"), Ptyp_package S)| Ppat_exception of Ocaml_parsing.Parsetree.pattern(*Pattern
*)exception P| Ppat_extension of Ocaml_parsing.Parsetree.extension(*Pattern
*)[%id]| Ppat_open of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.pattern(*Pattern
*)M.(P)
Value expressions
and expression = {pexp_desc : Ocaml_parsing.Parsetree.expression_desc;pexp_loc : Ocaml_parsing.Location.t;pexp_loc_stack : Ocaml_parsing.Parsetree.location_stack;pexp_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)... [\@id1] [\@id2]
}and expression_desc = | Pexp_ident of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc(*Identifiers such as
*)xandM.x| Pexp_constant of Ocaml_parsing.Parsetree.constant(*Expressions constant such as
*)1,'a',"true",1.0,1l,1L,1n| Pexp_let of Ocaml_parsing.Asttypes.mutable_flag * Ocaml_parsing.Asttypes.rec_flag * Ocaml_parsing.Parsetree.value_binding list * Ocaml_parsing.Parsetree.expression(*Pexp_let(mut, rec, [(P1,E1) ; ... ; (Pn,En)], E)represents:let P1 = E1 and ... and Pn = EN in EwhenrecisNonrecursiveandmut=Immutable.let rec P1 = E1 and ... and Pn = EN in EwhenrecisRecursiveandmut=Immutable.let mutable P1 = E1 in EwhenrecisNonrecursiveandmut=Mutable. Invariant: Ifmut = Mutablethenn = 1andrec = Nonrecursive
| Pexp_function of Ocaml_parsing.Parsetree.function_param list * Ocaml_parsing.Parsetree.function_constraint * Ocaml_parsing.Parsetree.function_body(*Pexp_function ([P1; ...; Pn], C, body)represents any construct involvingfunorfunction, including:fun P1 ... Pn -> Ewhenbody = Pfunction_body Efun P1 ... Pn -> function p1 -> e1 | ... | pm -> emwhenbody = Pfunction_cases [ p1 -> e1; ...; pm -> em ]Crepresents a type constraint or coercion placed immediately before the arrow, e.g.fun P1 ... Pn : ty -> ...whenC = Some (Pconstraint ty).
A function must have parameters.
*)Pexp_function (params, _, body)must have non-emptyparamsor aPfunction_cases _body.| Pexp_apply of Ocaml_parsing.Parsetree.expression * (Ocaml_parsing.Parsetree.arg_label * Ocaml_parsing.Parsetree.expression) list| Pexp_match of Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Parsetree.case list(*
*)match E0 with P1 -> E1 | ... | Pn -> En| Pexp_try of Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Parsetree.case list(*
*)try E0 with P1 -> E1 | ... | Pn -> En| Pexp_tuple of (string option * Ocaml_parsing.Parsetree.expression) list(*Pexp_tuple(el)represents(E1, ..., En)whenelis(None, E1);...;(None, En)(~L1:E1, ..., ~Ln:En)whenelis(Some L1, E1);...;(Some Ln, En)- A mix, e.g.:
(~L1:E1, E2)whenelis(Some L1, E1); (None, E2)
Invariant:
*)n >= 2| Pexp_unboxed_tuple of (string option * Ocaml_parsing.Parsetree.expression) list(*Unboxed tuple expressions:
Pexp_unboxed_tuple([(Some l1,P1);...;(Some l2,Pn)])represents#(l1:E1, ..., ln:En), and the labels are optional.Invariant:
*)n >= 2| Pexp_construct of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.expression option(*Pexp_construct(C, exp)represents:CwhenexpisNone,C EwhenexpisSome E,C (E1, ..., En)whenexpisSome (Pexp_tuple[E1;...;En])
| Pexp_variant of Ocaml_parsing.Asttypes.label * Ocaml_parsing.Parsetree.expression option(*Pexp_variant(`A, exp)represents`AwhenexpisNone`A EwhenexpisSome E
| Pexp_record of (Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.expression) list * Ocaml_parsing.Parsetree.expression option(*Pexp_record([(l1,P1) ; ... ; (ln,Pn)], exp0)represents{ l1=P1; ...; ln=Pn }whenexp0isNone{ E0 with l1=P1; ...; ln=Pn }whenexp0isSome E0
Invariant:
*)n > 0| Pexp_record_unboxed_product of (Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.expression) list * Ocaml_parsing.Parsetree.expression option(*Pexp_record_unboxed_product([(l1,P1) ; ... ; (ln,Pn)], exp0)represents#{ l1=P1; ...; ln=Pn }whenexp0isNone#{ E0 with l1=P1; ...; ln=Pn }whenexp0isSome E0
Invariant:
*)n > 0| Pexp_field of Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc(*
*)E.l| Pexp_unboxed_field of Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc(*
*)E.#l| Pexp_setfield of Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.expression(*
*)E1.l <- E2| Pexp_array of Ocaml_parsing.Asttypes.mutable_flag * Ocaml_parsing.Parsetree.expression list(*
*)[| E1; ...; En |]or[: E1; ...; En :]| Pexp_idx of Ocaml_parsing.Parsetree.block_access * Ocaml_parsing.Parsetree.unboxed_access list(*
*)(BA1 UA1 UA2 ...)e.g.(.foo.#bar.#baz)Above, BA1=.foo, UA1=.#bar, and UA2=#.baz| Pexp_ifthenelse of Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Parsetree.expression option(*
*)if E1 then E2 else E3| Pexp_sequence of Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Parsetree.expression(*
*)E1; E2| Pexp_while of Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Parsetree.expression(*
*)while E1 do E2 done| Pexp_for of Ocaml_parsing.Parsetree.pattern * Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Asttypes.direction_flag * Ocaml_parsing.Parsetree.expression| Pexp_constraint of Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Parsetree.core_type option * Ocaml_parsing.Parsetree.modes(*
*)(E : T @@ modes)| Pexp_coerce of Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Parsetree.core_type option * Ocaml_parsing.Parsetree.core_type(*Pexp_coerce(E, from, T)represents(E :> T)whenfromisNone,(E : T0 :> T)whenfromisSome T0.
| Pexp_send of Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Asttypes.label Ocaml_parsing.Asttypes.loc(*
*)E # m| Pexp_new of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc(*
*)new M.c| Pexp_setvar of Ocaml_parsing.Asttypes.label Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.expression(*x <- 2Represents both setting an instance variable and setting a mutable variable.
*)| Pexp_override of (Ocaml_parsing.Asttypes.label Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.expression) list(*
*){< x1 = E1; ...; xn = En >}| Pexp_letmodule of string option Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.module_expr * Ocaml_parsing.Parsetree.expression(*
*)let module M = ME in E| Pexp_letexception of Ocaml_parsing.Parsetree.extension_constructor * Ocaml_parsing.Parsetree.expression(*
*)let exception C in E| Pexp_assert of Ocaml_parsing.Parsetree.expression(*assert E.Note:
*)assert falseis treated in a special way by the type-checker.| Pexp_lazy of Ocaml_parsing.Parsetree.expression(*
*)lazy E| Pexp_poly of Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Parsetree.core_type option(*Used for method bodies.
Can only be used as the expression under
*)Cfk_concretefor methods (not values).| Pexp_object of Ocaml_parsing.Parsetree.class_structure(*
*)object ... end| Pexp_newtype of string Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.jkind_annotation option * Ocaml_parsing.Parsetree.expression(*
*)fun (type t) -> Eorfun (type t : k) -> E| Pexp_pack of Ocaml_parsing.Parsetree.module_expr(*(module ME).
*)(module ME : S)is represented asPexp_constraint(Pexp_pack ME, Ptyp_package S)| Pexp_open of Ocaml_parsing.Parsetree.open_declaration * Ocaml_parsing.Parsetree.expression(*M.(E)let open M in Elet open! M in E
| Pexp_letop of Ocaml_parsing.Parsetree.letop(*let* P = E0 in E1let* P0 = E00 and* P1 = E01 in E1
| Pexp_extension of Ocaml_parsing.Parsetree.extension(*
*)[%id]| Pexp_unreachable(*
*).| Pexp_stack of Ocaml_parsing.Parsetree.expression(*stack_ exp
*)| Pexp_comprehension of Ocaml_parsing.Parsetree.comprehension_expression(*[? BODY ...CLAUSES... ?], where:?is either""(list),:(immutable array), or|(array).BODYis an expression.CLAUSESis a series ofcomprehension_clause.
| Pexp_overwrite of Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Parsetree.expression(*overwrite_ exp with exp
*)| Pexp_quote of Ocaml_parsing.Parsetree.expression(*runtime metaprogramming quotations <
*)E>| Pexp_splice of Ocaml_parsing.Parsetree.expression(*runtime metaprogramming splicing $(E)
*)| Pexp_hole(*_
*)
and case = {pc_lhs : Ocaml_parsing.Parsetree.pattern;pc_guard : Ocaml_parsing.Parsetree.expression option;pc_rhs : Ocaml_parsing.Parsetree.expression;
}Values of type case represents (P -> E) or (P when E0 -> E)
and letop = {let_ : Ocaml_parsing.Parsetree.binding_op;ands : Ocaml_parsing.Parsetree.binding_op list;body : Ocaml_parsing.Parsetree.expression;
}and binding_op = {pbop_op : string Ocaml_parsing.Asttypes.loc;pbop_pat : Ocaml_parsing.Parsetree.pattern;pbop_exp : Ocaml_parsing.Parsetree.expression;pbop_loc : Ocaml_parsing.Location.t;
}and function_param_desc = | Pparam_val of Ocaml_parsing.Parsetree.arg_label * Ocaml_parsing.Parsetree.expression option * Ocaml_parsing.Parsetree.pattern(*Pparam_val (lbl, exp0, P)represents the parameter:PwhenlblisNolabelandexp0isNone~l:PwhenlblisLabelled landexp0isNone?l:PwhenlblisOptional landexp0isNone?l:(P = E0)whenlblisOptional landexp0isSome E0
Note: If
*)E0is provided, onlyOptionalis allowed.| Pparam_newtype of string Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.jkind_annotation option(*Pparam_newtype xrepresents the parameter(type x).xcarries the location of the identifier, whereas thepparam_locon the enclosingfunction_paramnode is the location of the(type x)as a whole.Multiple parameters
(type a b c)are represented as multiplePparam_newtypenodes, let's say:[ { pparam_kind = Pparam_newtype a; pparam_loc = loc1 }; { pparam_kind = Pparam_newtype b; pparam_loc = loc2 }; { pparam_kind = Pparam_newtype c; pparam_loc = loc3 }; ]Here, the first loc
*)loc1is the location of(type a b c), and the subsequent locsloc2andloc3are the same asloc1, except marked as ghost locations. The locations ona,b,c, correspond to the variablesa,b, andcin the source code.
and function_param = {pparam_loc : Ocaml_parsing.Location.t;pparam_desc : Ocaml_parsing.Parsetree.function_param_desc;
}and function_body = | Pfunction_body of Ocaml_parsing.Parsetree.expression| Pfunction_cases of Ocaml_parsing.Parsetree.case list * Ocaml_parsing.Location.t * Ocaml_parsing.Parsetree.attributes(*In
*)Pfunction_cases (_, loc, attrs), the location extends from the start of thefunctionkeyword to the end of the last case. The compiler will only use typechecking-related attributes fromattrs, e.g. enabling or disabling a warning.
See the comment on Pexp_function.
and type_constraint = | Pconstraint of Ocaml_parsing.Parsetree.core_type| Pcoerce of Ocaml_parsing.Parsetree.core_type option * Ocaml_parsing.Parsetree.core_type
and function_constraint = {mode_annotations : Ocaml_parsing.Parsetree.modes;(*The mode annotation placed on a function let-binding, e.g.
*)let local_ f x : int -> int = .... Thelocal_syntax is parsed into two nodes: the field here, andpvb_modes. This field only affects the interpretation ofret_type_constraint, while the latter is translated intypecoretoPexp_constraintto contrain the mode of the function. (* CR zqian: This field is not failthful representation of the user syntax, and complicatespprintast. It should be removed and their functionality should be moved topvb_modes. *)ret_mode_annotations : Ocaml_parsing.Parsetree.modes;(*The mode annotation placed on a function's body, e.g.
*)let f x : int -> int @@ local = .... This field constrains the mode of function's body.ret_type_constraint : Ocaml_parsing.Parsetree.type_constraint option;(*The type constraint placed on a function's body.
*)
}See the comment on Pexp_function.
and block_access = | Baccess_field of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc(*
*).foo| Baccess_array of Ocaml_parsing.Asttypes.mutable_flag * Ocaml_parsing.Asttypes.index_kind * Ocaml_parsing.Parsetree.expression(*Mutable array accesses:
.(E),.L(E),.l(E),.S(E),.s(E),.n(E)Immutable array accesses:.:(E),.:L(E),.:l(E),.:S(E),.:s(E),.:n(E)Indexed by
*)int,int64#,int32#,int16#,int8#, ornativeint#, respectively.| Baccess_block of Ocaml_parsing.Asttypes.mutable_flag * Ocaml_parsing.Parsetree.expression(*Access using another block index:
*).idx_imm(E),.idx_mut(E)(usually followed by unboxed accesses, to deepen the index).
and unboxed_access = | Uaccess_unboxed_field of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc(*
*).#foo
and comprehension_iterator = | Pcomp_range of {start : Ocaml_parsing.Parsetree.expression;stop : Ocaml_parsing.Parsetree.expression;direction : Ocaml_parsing.Asttypes.direction_flag;
}(*"= START to STOP" (direction = Upto) "= START downto STOP" (direction = Downto)
*)| Pcomp_in of Ocaml_parsing.Parsetree.expression(*"in EXPR"
*)
and comprehension_clause_binding = {pcomp_cb_pattern : Ocaml_parsing.Parsetree.pattern;pcomp_cb_iterator : Ocaml_parsing.Parsetree.comprehension_iterator;pcomp_cb_attributes : Ocaml_parsing.Parsetree.attributes;
}@... PAT (in/=) ...
and comprehension_clause = | Pcomp_for of Ocaml_parsing.Parsetree.comprehension_clause_binding list(*"for PAT (in/=) ... and PAT (in/=) ... and ..."; must be nonempty
*)| Pcomp_when of Ocaml_parsing.Parsetree.expression(*"when EXPR"
*)
and comprehension = {pcomp_body : Ocaml_parsing.Parsetree.expression;(*The body/generator of the comprehension
*)pcomp_clauses : Ocaml_parsing.Parsetree.comprehension_clause list;(*The clauses of the comprehension; must be nonempty
*)
}and comprehension_expression = | Pcomp_list_comprehension of Ocaml_parsing.Parsetree.comprehension(*
*)[BODY ...CLAUSES...]| Pcomp_array_comprehension of Ocaml_parsing.Asttypes.mutable_flag * Ocaml_parsing.Parsetree.comprehension(*
*)[|BODY ...CLAUSES...|](flag = Mutable)[:BODY ...CLAUSES...:](flag = Immutable) (only allowed with-extension immutable_arrays)
Value descriptions
and value_description = {pval_name : string Ocaml_parsing.Asttypes.loc;pval_type : Ocaml_parsing.Parsetree.core_type;pval_modalities : Ocaml_parsing.Parsetree.modalities;pval_prim : string list;pval_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)... [\@\@id1] [\@\@id2]pval_loc : Ocaml_parsing.Location.t;
}Values of type value_description represents:
Type declarations
and type_declaration = {ptype_name : string Ocaml_parsing.Asttypes.loc;ptype_params : (Ocaml_parsing.Parsetree.core_type * (Ocaml_parsing.Asttypes.variance * Ocaml_parsing.Asttypes.injectivity)) list;(*
*)('a1,...'an) tptype_cstrs : (Ocaml_parsing.Parsetree.core_type * Ocaml_parsing.Parsetree.core_type * Ocaml_parsing.Location.t) list;(*
*)... constraint T1=T1' ... constraint Tn=Tn'ptype_kind : Ocaml_parsing.Parsetree.type_kind;ptype_private : Ocaml_parsing.Asttypes.private_flag;(*for
*)= private ...ptype_manifest : Ocaml_parsing.Parsetree.core_type option;(*represents
*)= Tptype_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)... [\@\@id1] [\@\@id2]ptype_jkind_annotation : Ocaml_parsing.Parsetree.jkind_annotation option;(*for
*): jkindptype_loc : Ocaml_parsing.Location.t;
}Here are type declarations and their representation, for various ptype_kind and ptype_manifest values:
type twhentype_kindisPtype_abstract, andmanifestisNone,type t = T0whentype_kindisPtype_abstract, andmanifestisSome T0,type t = C of T | ...whentype_kindisPtype_variant, andmanifestisNone,type t = T0 = C of T | ...whentype_kindisPtype_variant, andmanifestisSome T0,type t = {l: T; ...}whentype_kindisPtype_record, andmanifestisNone,type t = T0 = {l : T; ...}whentype_kindisPtype_record, andmanifestisSome T0,type t = ..whentype_kindisPtype_open, andmanifestisNone.
and type_kind = | Ptype_abstract| Ptype_variant of Ocaml_parsing.Parsetree.constructor_declaration list| Ptype_record of Ocaml_parsing.Parsetree.label_declaration list(*Invariant: non-empty list
*)| Ptype_record_unboxed_product of Ocaml_parsing.Parsetree.label_declaration list(*Invariant: non-empty list
*)| Ptype_open
and label_declaration = {pld_name : string Ocaml_parsing.Asttypes.loc;pld_mutable : Ocaml_parsing.Asttypes.mutable_flag;pld_modalities : Ocaml_parsing.Parsetree.modalities;pld_type : Ocaml_parsing.Parsetree.core_type;pld_loc : Ocaml_parsing.Location.t;pld_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)l : T [\@id1] [\@id2]
}{ ...; l: T; ... }whenpld_mutableisImmutable,{ ...; mutable l: T; ... }whenpld_mutableisMutable.
Note: T can be a Ptyp_poly.
and constructor_declaration = {pcd_name : string Ocaml_parsing.Asttypes.loc;pcd_vars : (string Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.jkind_annotation option) list;(*jkind annotations are
*)C : ('a : kind1) ('a2 : kind2). ...pcd_args : Ocaml_parsing.Parsetree.constructor_arguments;pcd_res : Ocaml_parsing.Parsetree.core_type option;pcd_loc : Ocaml_parsing.Location.t;pcd_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)C of ... [\@id1] [\@id2]
}and constructor_argument = {pca_modalities : Ocaml_parsing.Parsetree.modalities;pca_type : Ocaml_parsing.Parsetree.core_type;pca_loc : Ocaml_parsing.Location.t;
}and constructor_arguments = | Pcstr_tuple of Ocaml_parsing.Parsetree.constructor_argument list| Pcstr_record of Ocaml_parsing.Parsetree.label_declaration list(*Values of type
constructor_declarationrepresents the constructor arguments of:C of T1 * ... * Tnwhenres = None, andargs = Pcstr_tuple [T1; ... ; Tn],C: T0whenres = Some T0, andargs = Pcstr_tuple [],C: T1 * ... * Tn -> T0whenres = Some T0, andargs = Pcstr_tuple [T1; ... ; Tn],C of {...}whenres = None, andargs = Pcstr_record [...],C: {...} -> T0whenres = Some T0, andargs = Pcstr_record [...].
and type_extension = {ptyext_path : Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc;ptyext_params : (Ocaml_parsing.Parsetree.core_type * (Ocaml_parsing.Asttypes.variance * Ocaml_parsing.Asttypes.injectivity)) list;ptyext_constructors : Ocaml_parsing.Parsetree.extension_constructor list;ptyext_private : Ocaml_parsing.Asttypes.private_flag;ptyext_loc : Ocaml_parsing.Location.t;ptyext_attributes : Ocaml_parsing.Parsetree.attributes;(*...
*)\@\@id1\@\@id2
}Definition of new extensions constructors for the extensive sum type t (type t += ...).
and extension_constructor = {pext_name : string Ocaml_parsing.Asttypes.loc;pext_kind : Ocaml_parsing.Parsetree.extension_constructor_kind;pext_loc : Ocaml_parsing.Location.t;pext_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)C of ... [\@id1] [\@id2]
}and type_exception = {ptyexn_constructor : Ocaml_parsing.Parsetree.extension_constructor;ptyexn_loc : Ocaml_parsing.Location.t;ptyexn_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)... [\@\@id1] [\@\@id2]
}Definition of a new exception (exception E).
and extension_constructor_kind = | Pext_decl of (string Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.jkind_annotation option) list * Ocaml_parsing.Parsetree.constructor_arguments * Ocaml_parsing.Parsetree.core_type option(*Pext_decl(existentials, c_args, t_opt)describes a new extension constructor. It can be:C of T1 * ... * Tnwhen:existentialsis[],c_argsis[T1; ...; Tn],t_optisNone
C: T0whenexistentialsis[],c_argsis[],t_optisSome T0.
C: T1 * ... * Tn -> T0whenexistentialsis[],c_argsis[T1; ...; Tn],t_optisSome T0.
C: ('a : k)... . T1 * ... * Tn -> T0whenexistentialsis[('a : k);...],c_argsis[T1; ... ; Tn],t_optisSome T0.
| Pext_rebind of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc(*
*)Pext_rebind(D)re-export the constructorDwith the new nameC
Class language
Type expressions for the class language
and class_type = {pcty_desc : Ocaml_parsing.Parsetree.class_type_desc;pcty_loc : Ocaml_parsing.Location.t;pcty_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)... [\@id1] [\@id2]
}and class_type_desc = | Pcty_constr of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.core_type list(*c['a1, ..., 'an] c
| Pcty_signature of Ocaml_parsing.Parsetree.class_signature(*
*)object ... end| Pcty_arrow of Ocaml_parsing.Parsetree.arg_label * Ocaml_parsing.Parsetree.core_type * Ocaml_parsing.Parsetree.class_type(*Pcty_arrow(lbl, T, CT)represents:T -> CTwhenlblisNolabel,~l:T -> CTwhenlblisLabelled l,?l:T -> CTwhenlblisOptional l.
| Pcty_extension of Ocaml_parsing.Parsetree.extension(*
*)%id| Pcty_open of Ocaml_parsing.Parsetree.open_description * Ocaml_parsing.Parsetree.class_type(*
*)let open M in CT
and class_signature = {pcsig_self : Ocaml_parsing.Parsetree.core_type;pcsig_fields : Ocaml_parsing.Parsetree.class_type_field list;
}Values of type class_signature represents:
object('selfpat) ... endobject ... endwhenpcsig_selfisPtyp_any
and class_type_field = {pctf_desc : Ocaml_parsing.Parsetree.class_type_field_desc;pctf_loc : Ocaml_parsing.Location.t;pctf_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)... [\@\@id1] [\@\@id2]
}and class_type_field_desc = | Pctf_inherit of Ocaml_parsing.Parsetree.class_type(*
*)inherit CT| Pctf_val of Ocaml_parsing.Asttypes.label Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Asttypes.mutable_flag * Ocaml_parsing.Asttypes.virtual_flag * Ocaml_parsing.Parsetree.core_type(*
*)val x: T| Pctf_method of Ocaml_parsing.Asttypes.label Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Asttypes.private_flag * Ocaml_parsing.Asttypes.virtual_flag * Ocaml_parsing.Parsetree.core_type| Pctf_constraint of Ocaml_parsing.Parsetree.core_type * Ocaml_parsing.Parsetree.core_type(*
*)constraint T1 = T2| Pctf_attribute of Ocaml_parsing.Parsetree.attribute(*
*)[\@\@\@id]| Pctf_extension of Ocaml_parsing.Parsetree.extension(*
*)[%%id]
and 'a class_infos = {pci_virt : Ocaml_parsing.Asttypes.virtual_flag;pci_params : (Ocaml_parsing.Parsetree.core_type * (Ocaml_parsing.Asttypes.variance * Ocaml_parsing.Asttypes.injectivity)) list;pci_name : string Ocaml_parsing.Asttypes.loc;pci_expr : 'a;pci_loc : Ocaml_parsing.Location.t;pci_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)... [\@\@id1] [\@\@id2]
}Values of type class_expr class_infos represents:
class c = ...class ['a1,...,'an] c = ...class virtual c = ...
They are also used for "class type" declaration.
and class_description =
Ocaml_parsing.Parsetree.class_type Ocaml_parsing.Parsetree.class_infosand class_type_declaration =
Ocaml_parsing.Parsetree.class_type Ocaml_parsing.Parsetree.class_infosValue expressions for the class language
and class_expr = {pcl_desc : Ocaml_parsing.Parsetree.class_expr_desc;pcl_loc : Ocaml_parsing.Location.t;pcl_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)... [\@id1] [\@id2]
}and class_expr_desc = | Pcl_constr of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.core_type list(*
*)cand['a1, ..., 'an] c| Pcl_structure of Ocaml_parsing.Parsetree.class_structure(*
*)object ... end| Pcl_fun of Ocaml_parsing.Parsetree.arg_label * Ocaml_parsing.Parsetree.expression option * Ocaml_parsing.Parsetree.pattern * Ocaml_parsing.Parsetree.class_expr(*Pcl_fun(lbl, exp0, P, CE)represents:fun P -> CEwhenlblisNolabelandexp0isNone,fun ~l:P -> CEwhenlblisLabelled landexp0isNone,fun ?l:P -> CEwhenlblisOptional landexp0isNone,fun ?l:(P = E0) -> CEwhenlblisOptional landexp0isSome E0.
| Pcl_apply of Ocaml_parsing.Parsetree.class_expr * (Ocaml_parsing.Parsetree.arg_label * Ocaml_parsing.Parsetree.expression) list(*Pcl_apply(CE, [(l1,E1) ; ... ; (ln,En)])representsCE ~l1:E1 ... ~ln:En.lican be empty (non labeled argument) or start with?(optional argument).Invariant:
*)n > 0| Pcl_let of Ocaml_parsing.Asttypes.rec_flag * Ocaml_parsing.Parsetree.value_binding list * Ocaml_parsing.Parsetree.class_expr(*Pcl_let(rec, [(P1, E1); ... ; (Pn, En)], CE)represents:let P1 = E1 and ... and Pn = EN in CEwhenrecisNonrecursive,let rec P1 = E1 and ... and Pn = EN in CEwhenrecisRecursive.
| Pcl_constraint of Ocaml_parsing.Parsetree.class_expr * Ocaml_parsing.Parsetree.class_type(*
*)(CE : CT)| Pcl_extension of Ocaml_parsing.Parsetree.extension(*
*)[%id]| Pcl_open of Ocaml_parsing.Parsetree.open_description * Ocaml_parsing.Parsetree.class_expr(*
*)let open M in CE
and class_structure = {pcstr_self : Ocaml_parsing.Parsetree.pattern;pcstr_fields : Ocaml_parsing.Parsetree.class_field list;
}Values of type class_structure represents:
object(selfpat) ... endobject ... endwhenpcstr_selfisPpat_any
and class_field = {pcf_desc : Ocaml_parsing.Parsetree.class_field_desc;pcf_loc : Ocaml_parsing.Location.t;pcf_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)... [\@\@id1] [\@\@id2]
}and class_field_desc = | Pcf_inherit of Ocaml_parsing.Asttypes.override_flag * Ocaml_parsing.Parsetree.class_expr * string Ocaml_parsing.Asttypes.loc option| Pcf_val of Ocaml_parsing.Asttypes.label Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Asttypes.mutable_flag * Ocaml_parsing.Parsetree.class_field_kind(*Pcf_val(x,flag, kind)represents:val x = EwhenflagisImmutableandkindisCfk_concrete(Fresh, E)val virtual x: TwhenflagisImmutableandkindisCfk_virtual(T)val mutable x = EwhenflagisMutableandkindisCfk_concrete(Fresh, E)val mutable virtual x: TwhenflagisMutableandkindisCfk_virtual(T)
| Pcf_method of Ocaml_parsing.Asttypes.label Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Asttypes.private_flag * Ocaml_parsing.Parsetree.class_field_kind| Pcf_constraint of Ocaml_parsing.Parsetree.core_type * Ocaml_parsing.Parsetree.core_type(*
*)constraint T1 = T2| Pcf_initializer of Ocaml_parsing.Parsetree.expression(*
*)initializer E| Pcf_attribute of Ocaml_parsing.Parsetree.attribute(*
*)[\@\@\@id]| Pcf_extension of Ocaml_parsing.Parsetree.extension(*
*)[%%id]
and class_field_kind = | Cfk_virtual of Ocaml_parsing.Parsetree.core_type| Cfk_concrete of Ocaml_parsing.Asttypes.override_flag * Ocaml_parsing.Parsetree.expression
and class_declaration =
Ocaml_parsing.Parsetree.class_expr Ocaml_parsing.Parsetree.class_infosModule language
Type expressions for the module language
and module_type = {pmty_desc : Ocaml_parsing.Parsetree.module_type_desc;pmty_loc : Ocaml_parsing.Location.t;pmty_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)... [\@id1] [\@id2]
}and module_type_desc = | Pmty_ident of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc(*
*)Pmty_ident(S)representsS| Pmty_signature of Ocaml_parsing.Parsetree.signature(*
*)sig ... end| Pmty_functor of Ocaml_parsing.Parsetree.functor_parameter * Ocaml_parsing.Parsetree.module_type * Ocaml_parsing.Parsetree.modes(*
*)functor(X : MT1 @@ modes) -> MT2 @ modes| Pmty_with of Ocaml_parsing.Parsetree.module_type * Ocaml_parsing.Parsetree.with_constraint list(*
*)MT with ...| Pmty_typeof of Ocaml_parsing.Parsetree.module_expr(*
*)module type of ME| Pmty_extension of Ocaml_parsing.Parsetree.extension(*
*)[%id]| Pmty_alias of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc(*
*)(module M)| Pmty_strengthen of Ocaml_parsing.Parsetree.module_type * Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc(*
*)MT with S
and functor_parameter = | Unit(*
*)()| Named of string option Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.module_type * Ocaml_parsing.Parsetree.modes(*Named(name, MT)represents:(X : MT @@ modes)whennameisSome X,(_ : MT @@ modes)whennameisNone
and signature = {psg_modalities : Ocaml_parsing.Parsetree.modalities;psg_items : Ocaml_parsing.Parsetree.signature_item list;psg_loc : Ocaml_parsing.Location.t;
}and signature_item = {psig_desc : Ocaml_parsing.Parsetree.signature_item_desc;psig_loc : Ocaml_parsing.Location.t;
}and signature_item_desc = | Psig_value of Ocaml_parsing.Parsetree.value_description(*val x: Texternal x: T = "s1" ... "sn"
| Psig_type of Ocaml_parsing.Asttypes.rec_flag * Ocaml_parsing.Parsetree.type_declaration list(*
*)type t1 = ... and ... and tn = ...| Psig_typesubst of Ocaml_parsing.Parsetree.type_declaration list(*
*)type t1 := ... and ... and tn := ...| Psig_typext of Ocaml_parsing.Parsetree.type_extension(*
*)type t1 += ...| Psig_exception of Ocaml_parsing.Parsetree.type_exception(*
*)exception C of T| Psig_module of Ocaml_parsing.Parsetree.module_declaration(*
*)module X = Mandmodule X : MT| Psig_modsubst of Ocaml_parsing.Parsetree.module_substitution(*
*)module X := M| Psig_recmodule of Ocaml_parsing.Parsetree.module_declaration list(*
*)module rec X1 : MT1 and ... and Xn : MTn| Psig_modtype of Ocaml_parsing.Parsetree.module_type_declaration(*
*)module type S = MTandmodule type S| Psig_modtypesubst of Ocaml_parsing.Parsetree.module_type_declaration(*
*)module type S := ...| Psig_open of Ocaml_parsing.Parsetree.open_description(*
*)open X| Psig_include of Ocaml_parsing.Parsetree.include_description * Ocaml_parsing.Parsetree.modalities(*
*)include MT| Psig_class of Ocaml_parsing.Parsetree.class_description list(*
*)class c1 : ... and ... and cn : ...| Psig_class_type of Ocaml_parsing.Parsetree.class_type_declaration list(*
*)class type ct1 = ... and ... and ctn = ...| Psig_attribute of Ocaml_parsing.Parsetree.attribute(*
*)[\@\@\@id]| Psig_extension of Ocaml_parsing.Parsetree.extension * Ocaml_parsing.Parsetree.attributes(*
*)[%%id]| Psig_kind_abbrev of string Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.jkind_annotation(*
*)kind_abbrev_ name = k
and module_declaration = {pmd_name : string option Ocaml_parsing.Asttypes.loc;pmd_type : Ocaml_parsing.Parsetree.module_type;pmd_modalities : Ocaml_parsing.Parsetree.modalities;pmd_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)... [\@\@id1] [\@\@id2]pmd_loc : Ocaml_parsing.Location.t;
}Values of type module_declaration represents S : MT
and module_substitution = {pms_name : string Ocaml_parsing.Asttypes.loc;pms_manifest : Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc;pms_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)... [\@\@id1] [\@\@id2]pms_loc : Ocaml_parsing.Location.t;
}Values of type module_substitution represents S := M
and module_type_declaration = {pmtd_name : string Ocaml_parsing.Asttypes.loc;pmtd_type : Ocaml_parsing.Parsetree.module_type option;pmtd_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)... [\@\@id1] [\@\@id2]pmtd_loc : Ocaml_parsing.Location.t;
}Values of type module_type_declaration represents:
S = MT,Sfor abstract module type declaration, whenpmtd_typeisNone.
and 'a open_infos = {popen_expr : 'a;popen_override : Ocaml_parsing.Asttypes.override_flag;popen_loc : Ocaml_parsing.Location.t;popen_attributes : Ocaml_parsing.Parsetree.attributes;
}Values of type 'a open_infos represents:
open! Xwhenpopen_overrideisOverride(silences the "used identifier shadowing" warning)open Xwhenpopen_overrideisFresh
and open_description =
Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc
Ocaml_parsing.Parsetree.open_infosValues of type open_description represents:
open M.Nopen M(N).O
and open_declaration =
Ocaml_parsing.Parsetree.module_expr Ocaml_parsing.Parsetree.open_infosValues of type open_declaration represents:
open M.Nopen M(N).Oopen struct ... end
and 'a include_infos = {pincl_kind : Ocaml_parsing.Parsetree.include_kind;pincl_mod : 'a;pincl_loc : Ocaml_parsing.Location.t;pincl_attributes : Ocaml_parsing.Parsetree.attributes;
}and include_description =
Ocaml_parsing.Parsetree.module_type Ocaml_parsing.Parsetree.include_infosValues of type include_description represents include MT
and include_declaration =
Ocaml_parsing.Parsetree.module_expr Ocaml_parsing.Parsetree.include_infosValues of type include_declaration represents include ME
and with_constraint = | Pwith_type of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.type_declaration(*with type X.t = ...Note: the last component of the longident must match the name of the type_declaration.
*)| Pwith_module of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc(*
*)with module X.Y = Z| Pwith_modtype of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.module_type(*
*)with module type X.Y = Z| Pwith_modtypesubst of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.module_type(*
*)with module type X.Y := sig end| Pwith_typesubst of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.type_declaration(*
*)with type X.t := ..., same format as [Pwith_type]| Pwith_modsubst of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc(*
*)with module X.Y := Z
Value expressions for the module language
and module_expr = {pmod_desc : Ocaml_parsing.Parsetree.module_expr_desc;pmod_loc : Ocaml_parsing.Location.t;pmod_attributes : Ocaml_parsing.Parsetree.attributes;(*
*)... [\@id1] [\@id2]
}and module_expr_desc = | Pmod_ident of Ocaml_parsing.Longident.t Ocaml_parsing.Asttypes.loc(*
*)X| Pmod_structure of Ocaml_parsing.Parsetree.structure(*
*)struct ... end| Pmod_functor of Ocaml_parsing.Parsetree.functor_parameter * Ocaml_parsing.Parsetree.module_expr(*
*)functor(X : MT1) -> ME| Pmod_apply of Ocaml_parsing.Parsetree.module_expr * Ocaml_parsing.Parsetree.module_expr(*
*)ME1(ME2)| Pmod_apply_unit of Ocaml_parsing.Parsetree.module_expr(*
*)ME1()| Pmod_constraint of Ocaml_parsing.Parsetree.module_expr * Ocaml_parsing.Parsetree.module_type option * Ocaml_parsing.Parsetree.modes(*(ME : MT @@ modes)(ME @ modes)(ME : MT)
| Pmod_unpack of Ocaml_parsing.Parsetree.expression(*
*)(val E)| Pmod_extension of Ocaml_parsing.Parsetree.extension(*
*)[%id]| Pmod_instance of Ocaml_parsing.Parsetree.module_instance(*Foo(Param1)(Arg1(Param2)(Arg2)) [@jane.non_erasable.instances]The name of an instance module. Gets converted to
*)Global.Name.tin the OxCaml compiler.
and module_instance = {pmod_instance_head : string;pmod_instance_args : (string * Ocaml_parsing.Parsetree.module_instance) list;
}M(P1)(MI1)...(Pn)(MIn)
and structure = Ocaml_parsing.Parsetree.structure_item listand structure_item = {pstr_desc : Ocaml_parsing.Parsetree.structure_item_desc;pstr_loc : Ocaml_parsing.Location.t;
}and structure_item_desc = | Pstr_eval of Ocaml_parsing.Parsetree.expression * Ocaml_parsing.Parsetree.attributes(*
*)E| Pstr_value of Ocaml_parsing.Asttypes.rec_flag * Ocaml_parsing.Parsetree.value_binding list(*Pstr_value(rec, [(P1, E1 ; ... ; (Pn, En))])represents:let P1 = E1 and ... and Pn = ENwhenrecisNonrecursive,let rec P1 = E1 and ... and Pn = ENwhenrecisRecursive.
| Pstr_primitive of Ocaml_parsing.Parsetree.value_description(*val x: Texternal x: T = "s1" ... "sn"
| Pstr_type of Ocaml_parsing.Asttypes.rec_flag * Ocaml_parsing.Parsetree.type_declaration list(*
*)type t1 = ... and ... and tn = ...| Pstr_typext of Ocaml_parsing.Parsetree.type_extension(*
*)type t1 += ...| Pstr_exception of Ocaml_parsing.Parsetree.type_exception(*exception C of Texception C = M.X
| Pstr_module of Ocaml_parsing.Parsetree.module_binding(*
*)module X = ME| Pstr_recmodule of Ocaml_parsing.Parsetree.module_binding list(*
*)module rec X1 = ME1 and ... and Xn = MEn| Pstr_modtype of Ocaml_parsing.Parsetree.module_type_declaration(*
*)module type S = MT| Pstr_open of Ocaml_parsing.Parsetree.open_declaration(*
*)open X| Pstr_class of Ocaml_parsing.Parsetree.class_declaration list(*
*)class c1 = ... and ... and cn = ...| Pstr_class_type of Ocaml_parsing.Parsetree.class_type_declaration list(*
*)class type ct1 = ... and ... and ctn = ...| Pstr_include of Ocaml_parsing.Parsetree.include_declaration(*
*)include ME| Pstr_attribute of Ocaml_parsing.Parsetree.attribute(*
*)[\@\@\@id]| Pstr_extension of Ocaml_parsing.Parsetree.extension * Ocaml_parsing.Parsetree.attributes(*
*)[%%id]| Pstr_kind_abbrev of string Ocaml_parsing.Asttypes.loc * Ocaml_parsing.Parsetree.jkind_annotation(*
*)kind_abbrev_ name = k
and value_constraint = | Pvc_constraint of {locally_abstract_univars : string Ocaml_parsing.Asttypes.loc list;typ : Ocaml_parsing.Parsetree.core_type;
}| Pvc_coercion of {ground : Ocaml_parsing.Parsetree.core_type option;coercion : Ocaml_parsing.Parsetree.core_type;
}(*Pvc_constraint { locally_abstract_univars=[]; typ}is a simple type constraint on a value binding:let x : typ- More generally, in
Pvc_constraint { locally_abstract_univars; typ}locally_abstract_univarsis the list of locally abstract type variables inlet x: type a ... . typ Pvc_coercion { ground=None; coercion }representslet x :> typPvc_coercion { ground=Some g; coercion }representslet x : g :> typ
and value_binding = {pvb_pat : Ocaml_parsing.Parsetree.pattern;pvb_expr : Ocaml_parsing.Parsetree.expression;pvb_constraint : Ocaml_parsing.Parsetree.value_constraint option;pvb_modes : Ocaml_parsing.Parsetree.modes;pvb_attributes : Ocaml_parsing.Parsetree.attributes;pvb_loc : Ocaml_parsing.Location.t;
}let pat : type_constraint = exp
and module_binding = {pmb_name : string option Ocaml_parsing.Asttypes.loc;pmb_expr : Ocaml_parsing.Parsetree.module_expr;pmb_attributes : Ocaml_parsing.Parsetree.attributes;pmb_loc : Ocaml_parsing.Location.t;
}Values of type module_binding represents module X = ME
and jkind_annotation_desc = | Pjk_default| Pjk_abbreviation of string| Pjk_mod of Ocaml_parsing.Parsetree.jkind_annotation * Ocaml_parsing.Parsetree.modes| Pjk_with of Ocaml_parsing.Parsetree.jkind_annotation * Ocaml_parsing.Parsetree.core_type * Ocaml_parsing.Parsetree.modalities| Pjk_kind_of of Ocaml_parsing.Parsetree.core_type| Pjk_product of Ocaml_parsing.Parsetree.jkind_annotation list
and jkind_annotation = {pjkind_loc : Ocaml_parsing.Location.t;pjkind_desc : Ocaml_parsing.Parsetree.jkind_annotation_desc;
}Toplevel
Toplevel phrases
type toplevel_phrase = | Ptop_def of Ocaml_parsing.Parsetree.structure| Ptop_dir of Ocaml_parsing.Parsetree.toplevel_directive(*
*)#use,#load...
and toplevel_directive = {pdir_name : string Ocaml_parsing.Asttypes.loc;pdir_arg : Ocaml_parsing.Parsetree.directive_argument option;pdir_loc : Ocaml_parsing.Location.t;
}and directive_argument = {pdira_desc : Ocaml_parsing.Parsetree.directive_argument_desc;pdira_loc : Ocaml_parsing.Location.t;
}and directive_argument_desc = | Pdir_string of string| Pdir_int of string * char option| Pdir_ident of Ocaml_parsing.Longident.t| Pdir_bool of bool