Provided by: ocaml-man_4.14.1-1ubuntu1_all bug

NAME

       Parsetree - Abstract syntax tree produced by parsing

Module

       Module   Parsetree

Documentation

       Module Parsetree
        : sig end

       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 3 3l 3L 3n .

       Suffixes  [g-z][G-Z]  are  accepted  by the parser.  Suffixes except 'l' , 'L' and 'n' are
       rejected by the typechecker
        *)
        | Pconst_char of char
         (* Character such as 'c' .
        *)
        | Pconst_string of string * 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 , 2e5 or 1.4e-4 .

       Suffixes g-z G-Z are accepted by the parser.  Suffixes are rejected by the typechecker.
        *)

       type location_stack = Location.t list

   Extension points
       type attribute = {
        attr_name : string Asttypes.loc ;
        attr_payload : payload ;
        attr_loc : Location.t ;
        }

       Attributes such as [@id ARG] and [@@id ARG] .

       Metadata  containers  passed  around  within  the  AST.   The  compiler  ignores   unknown
       attributes.

       type extension = string Asttypes.loc * payload

       Extension points such as [%id ARG] and [%%id ARG] .

       Sub-language placeholder -- rejected by the typechecker.

       type attributes = attribute list

       type payload =
        | PStr of structure
        | PSig of signature
         (* : SIG in an attribute or an extension point
        *)
        | PTyp of core_type
         (* : T in an attribute or an extension point
        *)
        | PPat of pattern * expression option
         (* ? P or ? P when E , in an attribute or an extension point
        *)

   Core language
   Type expressions
       type core_type = {
        ptyp_desc : core_type_desc ;
        ptyp_loc : Location.t ;
        ptyp_loc_stack : location_stack ;
        ptyp_attributes : attributes ;  (* ... [@id1] [@id2]

        *)
        }

       type core_type_desc =
        | Ptyp_any  (* _

        *)
        | Ptyp_var of string
         (* A type variable such as 'a

        *)
        | Ptyp_arrow of Asttypes.arg_label * core_type * core_type
         (* Ptyp_arrow(lbl, T1, T2) represents:

       - T1 -> T2 when lbl is Asttypes.arg_label.Nolabel ,

       - ~l:T1 -> T2 when lbl is Asttypes.arg_label.Labelled ,

       - ?l:T1 -> T2 when lbl is Asttypes.arg_label.Optional .

        *)
        | Ptyp_tuple of core_type list
         (* Ptyp_tuple([T1 ; ... ; Tn]) represents a product type T1 * ... * Tn .

       Invariant: n >= 2 .
        *)
        | Ptyp_constr of Longident.t Asttypes.loc * core_type list
         (* Ptyp_constr(lident, l) represents:

       - tconstr when l=[] ,

       - T tconstr when l=[T] ,

       - (T1, ..., Tn) tconstr when l=[T1 ; ... ; Tn] .

        *)
        | Ptyp_object of object_field list * Asttypes.closed_flag
         (* Ptyp_object([ l1:T1; ...; ln:Tn ], flag) represents:

       - < l1:T1; ...; ln:Tn > when flag is Asttypes.closed_flag.Closed ,

       - < l1:T1; ...; ln:Tn; .. > when flag is Asttypes.closed_flag.Open .

        *)
        | Ptyp_class of Longident.t Asttypes.loc * core_type list
         (* Ptyp_class(tconstr, l) represents:

       - #tconstr when l=[] ,

       - T #tconstr when l=[T] ,

       - (T1, ..., Tn) #tconstr when l=[T1 ; ... ; Tn] .

        *)
        | Ptyp_alias of core_type * string
         (* T as 'a .
        *)
        | Ptyp_variant of row_field list * Asttypes.closed_flag * Asttypes.label list option
         (* Ptyp_variant([`A;`B], flag, labels) represents:

       - [ `A|`B ] when flag is Asttypes.closed_flag.Closed , and labels is None ,

       - [> `A|`B ] when flag is Asttypes.closed_flag.Open , and labels is None ,

       - [< `A|`B ] when flag is Asttypes.closed_flag.Closed , and labels is Some [] ,

       -  [<  `A|`B  >  `X  `Y  ]  when  flag is Asttypes.closed_flag.Closed , and labels is Some
       ["X";"Y"] .

        *)
        | Ptyp_poly of string Asttypes.loc list * core_type
         (* 'a1 ... 'an. T

       Can only appear in the following context:

       -As the Parsetree.core_type of a Parsetree.pattern_desc.Ppat_constraint node corresponding
       to a constraint on a let-binding:
       let x : 'a1 ... 'an. T = e ...

       -Under Parsetree.class_field_kind.Cfk_virtual for methods (not values).

       -As the Parsetree.core_type of a Parsetree.class_type_field_desc.Pctf_method node.

       -As the Parsetree.core_type of a Parsetree.expression_desc.Pexp_poly node.

       -As the Parsetree.label_declaration.pld_type field of a Parsetree.label_declaration .

       -As a Parsetree.core_type of a Parsetree.core_type_desc.Ptyp_object node.

       -As the Parsetree.value_description.pval_type field of a Parsetree.value_description .

        *)
        | Ptyp_package of package_type
         (* (module S) .
        *)
        | Ptyp_extension of extension
         (* [%id] .
        *)

       type package_type = Longident.t Asttypes.loc * (Longident.t Asttypes.loc * core_type) list

       As Parsetree.package_type typed values:

       - (S, []) represents (module S) ,

       - (S, [(t1, T1) ; ... ; (tn, Tn)]) represents (module S with type t1 = T1 and ... and tn =
       Tn) .

       type row_field = {
        prf_desc : row_field_desc ;
        prf_loc : Location.t ;
        prf_attributes : attributes ;
        }

       type row_field_desc =
        | Rtag of Asttypes.label Asttypes.loc * bool * core_type list
         (* Rtag(`A, b, l) represents:

       - `A when b is true and l is [] ,

       - `A of T when b is false and l is [T] ,

       - `A of T1 & .. & Tn when b is false and l is [T1;...Tn] ,

       - `A of & T1 & .. & Tn when b is true and l is [T1;...Tn] .

       -The bool field is true if the tag contains a constant (empty) constructor.

       - & occurs when several types are used for the same constructor (see 4.2 in the manual)

        *)
        | Rinherit of core_type
         (* [ | t ]

        *)

       type object_field = {
        pof_desc : object_field_desc ;
        pof_loc : Location.t ;
        pof_attributes : attributes ;
        }

       type object_field_desc =
        | Otag of Asttypes.label Asttypes.loc * core_type
        | Oinherit of core_type

   Patterns
       type pattern = {
        ppat_desc : pattern_desc ;
        ppat_loc : Location.t ;
        ppat_loc_stack : location_stack ;
        ppat_attributes : attributes ;  (* ... [@id1] [@id2]

        *)
        }

       type pattern_desc =
        | Ppat_any  (* The pattern _ .
        *)
        | Ppat_var of string Asttypes.loc
         (* A variable pattern such as x

        *)
        | Ppat_alias of pattern * string Asttypes.loc
         (* An alias pattern such as P as 'a

        *)
        | Ppat_constant of constant
         (* Patterns such as 1 , 'a' , "true" , 1.0 , 1l , 1L , 1n

        *)
        | Ppat_interval of constant * constant
         (* Patterns such as 'a'..'z' .

       Other forms of interval are recognized by the parser but rejected by the type-checker.
        *)
        | Ppat_tuple of pattern list
         (* Patterns (P1, ..., Pn) .

       Invariant: n >= 2

        *)
        | Ppat_construct of Longident.t Asttypes.loc  *  (string  Asttypes.loc  list  *  pattern)
       option
         (* Ppat_construct(C, args) represents:

       - C when args is None ,

       - C P when args is Some ([], P)

       - C (P1, ..., Pn) when args is Some ([], Ppat_tuple [P1; ...; Pn])

       - C (type a b) P when args is Some ([a; b], P)

        *)
        | Ppat_variant of Asttypes.label * pattern option
         (* Ppat_variant(`A, pat) represents:

       - `A when pat is None ,

       - `A P when pat is Some P

        *)
        | Ppat_record of (Longident.t Asttypes.loc * pattern) list * Asttypes.closed_flag
         (* Ppat_record([(l1, P1) ; ... ; (ln, Pn)], flag) represents:

       - { l1=P1; ...; ln=Pn } when flag is Asttypes.closed_flag.Closed

       - { l1=P1; ...; ln=Pn; _} when flag is Asttypes.closed_flag.Open

       Invariant: n > 0

        *)
        | Ppat_array of pattern list
         (* Pattern [| P1; ...; Pn |]

        *)
        | Ppat_or of pattern * pattern
         (* Pattern P1 | P2

        *)
        | Ppat_constraint of pattern * core_type
         (* Pattern (P : T)

        *)
        | Ppat_type of Longident.t Asttypes.loc
         (* Pattern #tconst

        *)
        | Ppat_lazy of pattern
         (* Pattern lazy P

        *)
        | Ppat_unpack of string option Asttypes.loc
         (* Ppat_unpack(s) represents:

       - (module P) when s is Some "P"

       - (module _) when s is None

       Note: (module P : S) is represented as Ppat_constraint(Ppat_unpack(Some "P"), Ptyp_package
       S)

        *)
        | Ppat_exception of pattern
         (* Pattern exception P

        *)
        | Ppat_extension of extension
         (* Pattern [%id]

        *)
        | Ppat_open of Longident.t Asttypes.loc * pattern
         (* Pattern M.(P)

        *)

   Value expressions
       type expression = {
        pexp_desc : expression_desc ;
        pexp_loc : Location.t ;
        pexp_loc_stack : location_stack ;
        pexp_attributes : attributes ;  (* ... [@id1] [@id2]

        *)
        }

       type expression_desc =
        | Pexp_ident of Longident.t Asttypes.loc
         (* Identifiers such as x and M.x

        *)
        | Pexp_constant of constant
         (* Expressions constant such as 1 , 'a' , "true" , 1.0 , 1l , 1L , 1n

        *)
        | Pexp_let of Asttypes.rec_flag * value_binding list * expression
         (* Pexp_let(flag, [(P1,E1) ; ... ; (Pn,En)], E) represents:

       - let P1 = E1 and ... and Pn = EN in E when flag is Asttypes.rec_flag.Nonrecursive ,

       - let rec P1 = E1 and ... and Pn = EN in E when flag is Asttypes.rec_flag.Recursive .

        *)
        | Pexp_function of case list
         (* function P1 -> E1 | ... | Pn -> En

        *)
        | Pexp_fun of Asttypes.arg_label * expression option * pattern * expression
         (* Pexp_fun(lbl, exp0, P, E1) represents:

       - fun P -> E1 when lbl is Asttypes.arg_label.Nolabel and exp0 is None

       - fun ~l:P -> E1 when lbl is Asttypes.arg_label.Labelled and exp0 is None

       - fun ?l:P -> E1 when lbl is Asttypes.arg_label.Optional and exp0 is None

       - fun ?l:(P = E0) -> E1 when lbl is Asttypes.arg_label.Optional and exp0 is Some E0

       Notes:

       -If E0 is provided, only Asttypes.arg_label.Optional is allowed.

       - fun P1 P2 .. Pn -> E1 is represented as nested Parsetree.expression_desc.Pexp_fun .

       - let f P = E is represented using Parsetree.expression_desc.Pexp_fun .

        *)
        | Pexp_apply of expression * (Asttypes.arg_label * expression) list
         (* Pexp_apply(E0, [(l1, E1) ; ... ; (ln, En)]) represents E0 ~l1:E1 ... ~ln:En

       li can be Asttypes.arg_label.Nolabel (non labeled  argument),  Asttypes.arg_label.Labelled
       (labelled arguments) or Asttypes.arg_label.Optional (optional argument).

       Invariant: n > 0

        *)
        | Pexp_match of expression * case list
         (* match E0 with P1 -> E1 | ... | Pn -> En

        *)
        | Pexp_try of expression * case list
         (* try E0 with P1 -> E1 | ... | Pn -> En

        *)
        | Pexp_tuple of expression list
         (* Expressions (E1, ..., En)

       Invariant: n >= 2

        *)
        | Pexp_construct of Longident.t Asttypes.loc * expression option
         (* Pexp_construct(C, exp) represents:

       - C when exp is None ,

       - C E when exp is Some E ,

       - C (E1, ..., En) when exp is Some (Pexp_tuple[E1;...;En])

        *)
        | Pexp_variant of Asttypes.label * expression option
         (* Pexp_variant(`A, exp) represents

       - `A when exp is None

       - `A E when exp is Some E

        *)
        | Pexp_record of (Longident.t Asttypes.loc * expression) list * expression option
         (* Pexp_record([(l1,P1) ; ... ; (ln,Pn)], exp0) represents

       - { l1=P1; ...; ln=Pn } when exp0 is None

       - { E0 with l1=P1; ...; ln=Pn } when exp0 is Some E0

       Invariant: n > 0

        *)
        | Pexp_field of expression * Longident.t Asttypes.loc
         (* E.l

        *)
        | Pexp_setfield of expression * Longident.t Asttypes.loc * expression
         (* E1.l <- E2

        *)
        | Pexp_array of expression list
         (* [| E1; ...; En |]

        *)
        | Pexp_ifthenelse of expression * expression * expression option
         (* if E1 then E2 else E3

        *)
        | Pexp_sequence of expression * expression
         (* E1; E2

        *)
        | Pexp_while of expression * expression
         (* while E1 do E2 done

        *)
        | Pexp_for of pattern * expression * expression * Asttypes.direction_flag * expression
         (* Pexp_for(i, E1, E2, direction, E3) represents:

       - for i = E1 to E2 do E3 done when direction is Asttypes.direction_flag.Upto

       - for i = E1 downto E2 do E3 done when direction is Asttypes.direction_flag.Downto

        *)
        | Pexp_constraint of expression * core_type
         (* (E : T)

        *)
        | Pexp_coerce of expression * core_type option * core_type
         (* Pexp_coerce(E, from, T) represents

       - (E :> T) when from is None ,

       - (E : T0 :> T) when from is Some T0 .

        *)
        | Pexp_send of expression * Asttypes.label Asttypes.loc
         (* E # m

        *)
        | Pexp_new of Longident.t Asttypes.loc
         (* new M.c

        *)
        | Pexp_setinstvar of Asttypes.label Asttypes.loc * expression
         (* x <- 2

        *)
        | Pexp_override of (Asttypes.label Asttypes.loc * expression) list
         (* {< x1 = E1; ...; xn = En >}

        *)
        | Pexp_letmodule of string option Asttypes.loc * module_expr * expression
         (* let module M = ME in E

        *)
        | Pexp_letexception of extension_constructor * expression
         (* let exception C in E

        *)
        | Pexp_assert of expression
         (* assert E .

       Note: assert false is treated in a special way by the type-checker.
        *)
        | Pexp_lazy of expression
         (* lazy E

        *)
        | Pexp_poly of expression * core_type option
         (* Used for method bodies.

       Can  only  be  used  as  the  expression under Parsetree.class_field_kind.Cfk_concrete for
       methods (not values).
        *)
        | Pexp_object of class_structure
         (* object ... end

        *)
        | Pexp_newtype of string Asttypes.loc * expression
         (* fun (type t) -> E

        *)
        | Pexp_pack of module_expr
         (* (module ME) .

       (module ME : S) is represented as Pexp_constraint(Pexp_pack ME, Ptyp_package S)

        *)
        | Pexp_open of open_declaration * expression
         (* - M.(E)

       - let open M in E

       - let open! M in E

        *)
        | Pexp_letop of letop
         (* - let* P = E0 in E1

       - let* P0 = E00 and* P1 = E01 in E1

        *)
        | Pexp_extension of extension
         (* [%id]

        *)
        | Pexp_unreachable  (* .

        *)

       type case = {
        pc_lhs : pattern ;
        pc_guard : expression option ;
        pc_rhs : expression ;
        }

       Values of type Parsetree.case represents (P -> E) or (P when E0 -> E)

       type letop = {
        let_ : binding_op ;
        ands : binding_op list ;
        body : expression ;
        }

       type binding_op = {
        pbop_op : string Asttypes.loc ;
        pbop_pat : pattern ;
        pbop_exp : expression ;
        pbop_loc : Location.t ;
        }

   Value descriptions
       type value_description = {
        pval_name : string Asttypes.loc ;
        pval_type : core_type ;
        pval_prim : string list ;
        pval_attributes : attributes ;  (* ... [@@id1] [@@id2]

        *)
        pval_loc : Location.t ;
        }

       Values of type Parsetree.value_description represents:

       - val x: T , when Parsetree.value_description.pval_prim is []

       -  external  x:  T  =  "s1"  ...  "sn"   when   Parsetree.value_description.pval_prim   is
       ["s1";..."sn"]

   Type declarations
       type type_declaration = {
        ptype_name : string Asttypes.loc ;
        ptype_params  :  (core_type  *  (Asttypes.variance  *  Asttypes.injectivity))  list ;  (*
       ('a1,...'an) t

        *)
        ptype_cstrs : (core_type * core_type * Location.t) list ;  (* ... constraint T1=T1'   ...
       constraint Tn=Tn'

        *)
        ptype_kind : type_kind ;
        ptype_private : Asttypes.private_flag ;  (* for = private ...

        *)
        ptype_manifest : core_type option ;  (* represents = T

        *)
        ptype_attributes : attributes ;  (* ... [@@id1] [@@id2]

        *)
        ptype_loc : Location.t ;
        }

       Here     are     type    declarations    and    their    representation,    for    various
       Parsetree.type_declaration.ptype_kind    and     Parsetree.type_declaration.ptype_manifest
       values:

       - type t when type_kind is Parsetree.type_kind.Ptype_abstract , and manifest is None ,

       -  type t = T0 when type_kind is Parsetree.type_kind.Ptype_abstract , and manifest is Some
       T0 ,

       - type t = C of T  |  ...   when  type_kind  is  Parsetree.type_kind.Ptype_variant  ,  and
       manifest is None ,

       -  type  t  = T0 = C of T | ...  when type_kind is Parsetree.type_kind.Ptype_variant , and
       manifest is Some T0 ,

       - type t = {l: T; ...} when type_kind is Parsetree.type_kind.Ptype_record ,  and  manifest
       is None ,

       -  type  t  =  T0  = {l : T; ...} when type_kind is Parsetree.type_kind.Ptype_record , and
       manifest is Some T0 ,

       - type t = ..  when type_kind is Parsetree.type_kind.Ptype_open , and manifest is None .

       type type_kind =
        | Ptype_abstract
        | Ptype_variant of constructor_declaration list
        | Ptype_record of label_declaration list
         (* Invariant: non-empty list
        *)
        | Ptype_open

       type label_declaration = {
        pld_name : string Asttypes.loc ;
        pld_mutable : Asttypes.mutable_flag ;
        pld_type : core_type ;
        pld_loc : Location.t ;
        pld_attributes : attributes ;  (* l : T [@id1] [@id2]

        *)
        }

       -   {   ...;   l:   T;   ...    }    when    Parsetree.label_declaration.pld_mutable    is
       Asttypes.mutable_flag.Immutable ,

       -   {   ...;   mutable   l:  T;  ...  }  when  Parsetree.label_declaration.pld_mutable  is
       Asttypes.mutable_flag.Mutable .

       Note: T can be a Parsetree.core_type_desc.Ptyp_poly .

       type constructor_declaration = {
        pcd_name : string Asttypes.loc ;
        pcd_vars : string Asttypes.loc list ;
        pcd_args : constructor_arguments ;
        pcd_res : core_type option ;
        pcd_loc : Location.t ;
        pcd_attributes : attributes ;  (* C of ... [@id1] [@id2]

        *)
        }

       type constructor_arguments =
        | Pcstr_tuple of core_type list
        | Pcstr_record of label_declaration list
         (* Values of type Parsetree.constructor_declaration represents the constructor arguments
       of:

       - C of T1 * ... * Tn when res = None , and args = Pcstr_tuple [T1; ... ; Tn] ,

       - C: T0 when res = Some T0 , and args = Pcstr_tuple [] ,

       - C: T1 * ... * Tn -> T0 when res = Some T0 , and args = Pcstr_tuple [T1; ... ; Tn] ,

       - C of {...} when res = None , and args = Pcstr_record [...]  ,

       - C: {...} -> T0 when res = Some T0 , and args = Pcstr_record [...]  .

        *)

       type type_extension = {
        ptyext_path : Longident.t Asttypes.loc ;
        ptyext_params : (core_type * (Asttypes.variance * Asttypes.injectivity)) list ;
        ptyext_constructors : extension_constructor list ;
        ptyext_private : Asttypes.private_flag ;
        ptyext_loc : Location.t ;
        ptyext_attributes : attributes ;  (* ...  @@id1 @@id2

        *)
        }

       Definition of new extensions constructors for the extensive sum type t ( type t += ...  ).

       type extension_constructor = {
        pext_name : string Asttypes.loc ;
        pext_kind : extension_constructor_kind ;
        pext_loc : Location.t ;
        pext_attributes : attributes ;  (* C of ... [@id1] [@id2]

        *)
        }

       type type_exception = {
        ptyexn_constructor : extension_constructor ;
        ptyexn_loc : Location.t ;
        ptyexn_attributes : attributes ;  (* ... [@@id1] [@@id2]

        *)
        }

       Definition of a new exception ( exception E ).

       type extension_constructor_kind =
        | Pext_decl of string Asttypes.loc list * constructor_arguments * core_type option
         (*  Pext_decl(existentials, c_args, t_opt) describes a new extension constructor. It can
       be:

       - C of T1 * ... * Tn when:

       - existentials is [] ,

       - c_args is [T1; ...; Tn] ,

       - t_opt is None

       - C: T0 when

       - existentials is [] ,

       - c_args is [] ,

       - t_opt is Some T0 .

       - C: T1 * ... * Tn -> T0 when

       - existentials is [] ,

       - c_args is [T1; ...; Tn] ,

       - t_opt is Some T0 .

       - C: 'a... . T1 * ... * Tn -> T0 when

       - existentials is ['a;...]  ,

       - c_args is [T1; ... ; Tn] ,

       - t_opt is Some T0 .

        *)
        | Pext_rebind of Longident.t Asttypes.loc
         (* Pext_rebind(D) re-export the constructor D with the new name C

        *)

   Class language
   Type expressions for the class language
       type class_type = {
        pcty_desc : class_type_desc ;
        pcty_loc : Location.t ;
        pcty_attributes : attributes ;  (* ... [@id1] [@id2]

        *)
        }

       type class_type_desc =
        | Pcty_constr of Longident.t Asttypes.loc * core_type list
         (* - c

       - ['a1, ..., 'an] c

        *)
        | Pcty_signature of class_signature
         (* object ... end

        *)
        | Pcty_arrow of Asttypes.arg_label * core_type * class_type
         (* Pcty_arrow(lbl, T, CT) represents:

       - T -> CT when lbl is Asttypes.arg_label.Nolabel ,

       - ~l:T -> CT when lbl is Asttypes.arg_label.Labelled ,

       - ?l:T -> CT when lbl is Asttypes.arg_label.Optional .

        *)
        | Pcty_extension of extension
         (* %id

        *)
        | Pcty_open of open_description * class_type
         (* let open M in CT

        *)

       type class_signature = {
        pcsig_self : core_type ;
        pcsig_fields : class_type_field list ;
        }

       Values of type class_signature represents:

       - object('selfpat) ... end

       -     object      ...      end      when      Parsetree.class_signature.pcsig_self      is
       Parsetree.core_type_desc.Ptyp_any

       type class_type_field = {
        pctf_desc : class_type_field_desc ;
        pctf_loc : Location.t ;
        pctf_attributes : attributes ;  (* ... [@@id1] [@@id2]

        *)
        }

       type class_type_field_desc =
        | Pctf_inherit of class_type
         (* inherit CT

        *)
        |    Pctf_val    of    (Asttypes.label    Asttypes.loc    *    Asttypes.mutable_flag    *
       Asttypes.virtual_flag * core_type)
         (* val x: T

        *)
        |   Pctf_method   of   (Asttypes.label    Asttypes.loc    *    Asttypes.private_flag    *
       Asttypes.virtual_flag * core_type)
         (* method x: T

       Note: T can be a Parsetree.core_type_desc.Ptyp_poly .
        *)
        | Pctf_constraint of (core_type * core_type)
         (* constraint T1 = T2

        *)
        | Pctf_attribute of attribute
         (* [@@@id]

        *)
        | Pctf_extension of extension
         (* [%%id]

        *)

       type 'a class_infos = {
        pci_virt : Asttypes.virtual_flag ;
        pci_params : (core_type * (Asttypes.variance * Asttypes.injectivity)) list ;
        pci_name : string Asttypes.loc ;
        pci_expr : 'a ;
        pci_loc : Location.t ;
        pci_attributes : 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.

       type class_description = class_type class_infos

       type class_type_declaration = class_type class_infos

   Value expressions for the class language
       type class_expr = {
        pcl_desc : class_expr_desc ;
        pcl_loc : Location.t ;
        pcl_attributes : attributes ;  (* ... [@id1] [@id2]

        *)
        }

       type class_expr_desc =
        | Pcl_constr of Longident.t Asttypes.loc * core_type list
         (* c and ['a1, ..., 'an] c

        *)
        | Pcl_structure of class_structure
         (* object ... end

        *)
        | Pcl_fun of Asttypes.arg_label * expression option * pattern * class_expr
         (* Pcl_fun(lbl, exp0, P, CE) represents:

       - fun P -> CE when lbl is Asttypes.arg_label.Nolabel and exp0 is None ,

       - fun ~l:P -> CE when lbl is Asttypes.arg_label.Labelled and exp0 is None ,

       - fun ?l:P -> CE when lbl is Asttypes.arg_label.Optional and exp0 is None ,

       - fun ?l:(P = E0) -> CE when lbl is Asttypes.arg_label.Optional and exp0 is Some E0 .

        *)
        | Pcl_apply of class_expr * (Asttypes.arg_label * expression) list
         (* Pcl_apply(CE, [(l1,E1) ; ... ; (ln,En)]) represents CE ~l1:E1 ... ~ln:En .  li can be
       empty (non labeled argument) or start with ?  (optional argument).

       Invariant: n > 0

        *)
        | Pcl_let of Asttypes.rec_flag * value_binding list * class_expr
         (* Pcl_let(rec, [(P1, E1); ... ; (Pn, En)], CE) represents:

       - let P1 = E1 and ... and Pn = EN in CE when rec is Asttypes.rec_flag.Nonrecursive ,

       - let rec P1 = E1 and ... and Pn = EN in CE when rec is Asttypes.rec_flag.Recursive .

        *)
        | Pcl_constraint of class_expr * class_type
         (* (CE : CT)

        *)
        | Pcl_extension of extension
         (* [%id]

        *)
        | Pcl_open of open_description * class_expr
         (* let open M in CE

        *)

       type class_structure = {
        pcstr_self : pattern ;
        pcstr_fields : class_field list ;
        }

       Values of type Parsetree.class_structure represents:

       - object(selfpat) ... end

       -     object      ...      end      when      Parsetree.class_structure.pcstr_self      is
       Parsetree.pattern_desc.Ppat_any

       type class_field = {
        pcf_desc : class_field_desc ;
        pcf_loc : Location.t ;
        pcf_attributes : attributes ;  (* ... [@@id1] [@@id2]

        *)
        }

       type class_field_desc =
        | Pcf_inherit of Asttypes.override_flag * class_expr * string Asttypes.loc option
         (* Pcf_inherit(flag, CE, s) represents:

       - inherit CE when flag is Asttypes.override_flag.Fresh and s is None ,

       - inherit CE as x when flag is Asttypes.override_flag.Fresh and s is Some x ,

       - inherit! CE when flag is Asttypes.override_flag.Override and s is None ,

       - inherit! CE as x when flag is Asttypes.override_flag.Override and s is Some x

        *)
        | Pcf_val of (Asttypes.label Asttypes.loc * Asttypes.mutable_flag * class_field_kind)
         (* Pcf_val(x,flag, kind) represents:

       -   val   x   =   E   when   flag   is   Asttypes.mutable_flag.Immutable   and   kind   is
       Parsetree.class_field_kind.Cfk_concrete

       -  val  virtual  x:  T  when  flag  is   Asttypes.mutable_flag.Immutable   and   kind   is
       Parsetree.class_field_kind.Cfk_virtual

       -   val   mutable   x   =  E  when  flag  is  Asttypes.mutable_flag.Mutable  and  kind  is
       Parsetree.class_field_kind.Cfk_concrete

       - val mutable virtual  x:  T  when  flag  is  Asttypes.mutable_flag.Mutable  and  kind  is
       Parsetree.class_field_kind.Cfk_virtual

        *)
        | Pcf_method of (Asttypes.label Asttypes.loc * Asttypes.private_flag * class_field_kind)
         (* - method x = E ( E can be a Parsetree.expression_desc.Pexp_poly )

       - method virtual x: T ( T can be a Parsetree.core_type_desc.Ptyp_poly )

        *)
        | Pcf_constraint of (core_type * core_type)
         (* constraint T1 = T2

        *)
        | Pcf_initializer of expression
         (* initializer E

        *)
        | Pcf_attribute of attribute
         (* [@@@id]

        *)
        | Pcf_extension of extension
         (* [%%id]

        *)

       type class_field_kind =
        | Cfk_virtual of core_type
        | Cfk_concrete of Asttypes.override_flag * expression

       type class_declaration = class_expr class_infos

   Module language
   Type expressions for the module language
       type module_type = {
        pmty_desc : module_type_desc ;
        pmty_loc : Location.t ;
        pmty_attributes : attributes ;  (* ... [@id1] [@id2]

        *)
        }

       type module_type_desc =
        | Pmty_ident of Longident.t Asttypes.loc
         (* Pmty_ident(S) represents S

        *)
        | Pmty_signature of signature
         (* sig ... end

        *)
        | Pmty_functor of functor_parameter * module_type
         (* functor(X : MT1) -> MT2

        *)
        | Pmty_with of module_type * with_constraint list
         (* MT with ...

        *)
        | Pmty_typeof of module_expr
         (* module type of ME

        *)
        | Pmty_extension of extension
         (* [%id]

        *)
        | Pmty_alias of Longident.t Asttypes.loc
         (* (module M)

        *)

       type functor_parameter =
        | Unit  (* ()

        *)
        | Named of string option Asttypes.loc * module_type
         (* Named(name, MT) represents:

       - (X : MT) when name is Some X ,

       - (_ : MT) when name is None

        *)

       type signature = signature_item list

       type signature_item = {
        psig_desc : signature_item_desc ;
        psig_loc : Location.t ;
        }

       type signature_item_desc =
        | Psig_value of value_description
         (* - val x: T

       - external x: T = "s1" ... "sn"

        *)
        | Psig_type of Asttypes.rec_flag * type_declaration list
         (* type t1 = ... and ... and tn  = ...

        *)
        | Psig_typesubst of type_declaration list
         (* type t1 := ... and ... and tn := ...

        *)
        | Psig_typext of type_extension
         (* type t1 += ...

        *)
        | Psig_exception of type_exception
         (* exception C of T

        *)
        | Psig_module of module_declaration
         (* module X = M and module X : MT

        *)
        | Psig_modsubst of module_substitution
         (* module X := M

        *)
        | Psig_recmodule of module_declaration list
         (* module rec X1 : MT1 and ... and Xn : MTn

        *)
        | Psig_modtype of module_type_declaration
         (* module type S = MT and module type S

        *)
        | Psig_modtypesubst of module_type_declaration
         (* module type S :=  ...

        *)
        | Psig_open of open_description
         (* open X

        *)
        | Psig_include of include_description
         (* include MT

        *)
        | Psig_class of class_description list
         (* class c1 : ... and ... and cn : ...

        *)
        | Psig_class_type of class_type_declaration list
         (* class type ct1 = ... and ... and ctn = ...

        *)
        | Psig_attribute of attribute
         (* [@@@id]

        *)
        | Psig_extension of extension * attributes
         (* [%%id]

        *)

       type module_declaration = {
        pmd_name : string option Asttypes.loc ;
        pmd_type : module_type ;
        pmd_attributes : attributes ;  (* ... [@@id1] [@@id2]

        *)
        pmd_loc : Location.t ;
        }

       Values of type module_declaration represents S : MT

       type module_substitution = {
        pms_name : string Asttypes.loc ;
        pms_manifest : Longident.t Asttypes.loc ;
        pms_attributes : attributes ;  (* ... [@@id1] [@@id2]

        *)
        pms_loc : Location.t ;
        }

       Values of type module_substitution represents S := M

       type module_type_declaration = {
        pmtd_name : string Asttypes.loc ;
        pmtd_type : module_type option ;
        pmtd_attributes : attributes ;  (* ... [@@id1] [@@id2]

        *)
        pmtd_loc : Location.t ;
        }

       Values of type module_type_declaration represents:

       - S = MT ,

       - S for abstract module type declaration, when Parsetree.module_type_declaration.pmtd_type
       is None .

       type 'a open_infos = {
        popen_expr : 'a ;
        popen_override : Asttypes.override_flag ;
        popen_loc : Location.t ;
        popen_attributes : attributes ;
        }

       Values of type 'a open_infos represents:

       - open!  X  when  Parsetree.open_infos.popen_override  is  Asttypes.override_flag.Override
       (silences the "used identifier shadowing" warning)

       - open  X when Parsetree.open_infos.popen_override is Asttypes.override_flag.Fresh

       type open_description = Longident.t Asttypes.loc open_infos

       Values of type open_description represents:

       - open M.N

       - open M(N).O

       type open_declaration = module_expr open_infos

       Values of type open_declaration represents:

       - open M.N

       - open M(N).O

       - open struct ... end

       type 'a include_infos = {
        pincl_mod : 'a ;
        pincl_loc : Location.t ;
        pincl_attributes : attributes ;
        }

       type include_description = module_type include_infos

       Values of type include_description represents include MT

       type include_declaration = module_expr include_infos

       Values of type include_declaration represents include ME

       type with_constraint =
        | Pwith_type of Longident.t Asttypes.loc * type_declaration
         (* with type X.t = ...

       Note: the last component of the longident must match the name of the type_declaration.
        *)
        | Pwith_module of Longident.t Asttypes.loc * Longident.t Asttypes.loc
         (* with module X.Y = Z

        *)
        | Pwith_modtype of Longident.t Asttypes.loc * module_type
         (* with module type X.Y = Z

        *)
        | Pwith_modtypesubst of Longident.t Asttypes.loc * module_type
         (* with module type X.Y := sig end

        *)
        | Pwith_typesubst of Longident.t Asttypes.loc * type_declaration
         (* with type X.t := ..., same format as [Pwith_type]

        *)
        | Pwith_modsubst of Longident.t Asttypes.loc * Longident.t Asttypes.loc
         (* with module X.Y := Z

        *)

   Value expressions for the module language
       type module_expr = {
        pmod_desc : module_expr_desc ;
        pmod_loc : Location.t ;
        pmod_attributes : attributes ;  (* ... [@id1] [@id2]

        *)
        }

       type module_expr_desc =
        | Pmod_ident of Longident.t Asttypes.loc
         (* X

        *)
        | Pmod_structure of structure
         (* struct ... end

        *)
        | Pmod_functor of functor_parameter * module_expr
         (* functor(X : MT1) -> ME

        *)
        | Pmod_apply of module_expr * module_expr
         (* ME1(ME2)

        *)
        | Pmod_constraint of module_expr * module_type
         (* (ME : MT)

        *)
        | Pmod_unpack of expression
         (* (val E)

        *)
        | Pmod_extension of extension
         (* [%id]

        *)

       type structure = structure_item list

       type structure_item = {
        pstr_desc : structure_item_desc ;
        pstr_loc : Location.t ;
        }

       type structure_item_desc =
        | Pstr_eval of expression * attributes
         (* E

        *)
        | Pstr_value of Asttypes.rec_flag * value_binding list
         (* Pstr_value(rec, [(P1, E1 ; ... ; (Pn, En))]) represents:

       - let P1 = E1 and ... and Pn = EN when rec is Asttypes.rec_flag.Nonrecursive ,

       - let rec P1 = E1 and ... and Pn = EN when rec is Asttypes.rec_flag.Recursive .

        *)
        | Pstr_primitive of value_description
         (* - val x: T

       - external x: T = "s1" ... "sn"

        *)
        | Pstr_type of Asttypes.rec_flag * type_declaration list
         (* type t1 = ... and ... and tn = ...

        *)
        | Pstr_typext of type_extension
         (* type t1 += ...

        *)
        | Pstr_exception of type_exception
         (* - exception C of T

       - exception C = M.X

        *)
        | Pstr_module of module_binding
         (* module X = ME

        *)
        | Pstr_recmodule of module_binding list
         (* module rec X1 = ME1 and ... and Xn = MEn

        *)
        | Pstr_modtype of module_type_declaration
         (* module type S = MT

        *)
        | Pstr_open of open_declaration
         (* open X

        *)
        | Pstr_class of class_declaration list
         (* class c1 = ... and ... and cn = ...

        *)
        | Pstr_class_type of class_type_declaration list
         (* class type ct1 = ... and ... and ctn = ...

        *)
        | Pstr_include of include_declaration
         (* include ME

        *)
        | Pstr_attribute of attribute
         (* [@@@id]

        *)
        | Pstr_extension of extension * attributes
         (* [%%id]

        *)

       type value_binding = {
        pvb_pat : pattern ;
        pvb_expr : expression ;
        pvb_attributes : attributes ;
        pvb_loc : Location.t ;
        }

       type module_binding = {
        pmb_name : string option Asttypes.loc ;
        pmb_expr : module_expr ;
        pmb_attributes : attributes ;
        pmb_loc : Location.t ;
        }

       Values of type module_binding represents module X = ME

   Toplevel
   Toplevel phrases
       type toplevel_phrase =
        | Ptop_def of structure
        | Ptop_dir of toplevel_directive
         (* #use , #load ...
        *)

       type toplevel_directive = {
        pdir_name : string Asttypes.loc ;
        pdir_arg : directive_argument option ;
        pdir_loc : Location.t ;
        }

       type directive_argument = {
        pdira_desc : directive_argument_desc ;
        pdira_loc : Location.t ;
        }

       type directive_argument_desc =
        | Pdir_string of string
        | Pdir_int of string * char option
        | Pdir_ident of Longident.t
        | Pdir_bool of bool