# Module Parsetree

    module Parsetree: sig .. end

Abstract syntax tree produced by parsing

    type constant =

`|` | `Pconst_integer of `string * char option``
`|` | `Pconst_char of `char``
`|` | `Pconst_string of `string * string option``
`|` | `Pconst_float of `string * char option``

## Extension points

    type attribute = string Asttypes.loc * payload

    type extension = string Asttypes.loc * payload

    type attributes = attribute list

    type payload =

`|` | `PStr of `structure``
`|` | `PSig of `signature``
`|` | `PTyp of `core_type``
`|` | `PPat of `pattern * expression option``

## Core language

    type core_type = {

`` | `ptyp_desc : `core_type_desc`;`
`` | `ptyp_loc : `Location.t`;`
`` | `ptyp_attributes : `attributes`;`

}

    type core_type_desc =

`|` | `Ptyp_any`
`|` | `Ptyp_var of `string``
`|` | `Ptyp_arrow of `Asttypes.arg_label * core_type * core_type``
`|` | `Ptyp_tuple of `core_type list``
`|` | `Ptyp_constr of `Longident.t Asttypes.loc * core_type list``
`|` | `Ptyp_object of `object_field list * Asttypes.closed_flag``
`|` | `Ptyp_class of `Longident.t Asttypes.loc * core_type list``
`|` | `Ptyp_alias of `core_type * string``
`|` | `Ptyp_variant of `row_field list * Asttypes.closed_flag * Asttypes.label list option``
`|` | `Ptyp_poly of `string Asttypes.loc list * core_type``
`|` | `Ptyp_package of `package_type``
`|` | `Ptyp_extension of `extension``

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

    type row_field =

`|` | `Rtag of `Asttypes.label Asttypes.loc * attributes * bool * core_type list``
`|` | `Rinherit of `core_type``

    type object_field =

`|` | `Otag of `Asttypes.label Asttypes.loc * attributes * core_type``
`|` | `Oinherit of `core_type``

    type pattern = {

`` | `ppat_desc : `pattern_desc`;`
`` | `ppat_loc : `Location.t`;`
`` | `ppat_attributes : `attributes`;`

}

    type pattern_desc =

`|` | `Ppat_any`
`|` | `Ppat_var of `string Asttypes.loc``
`|` | `Ppat_alias of `pattern * string Asttypes.loc``
`|` | `Ppat_constant of `constant``
`|` | `Ppat_interval of `constant * constant``
`|` | `Ppat_tuple of `pattern list``
`|` | `Ppat_construct of `Longident.t Asttypes.loc * pattern option``
`|` | `Ppat_variant of `Asttypes.label * pattern option``
`|` | `Ppat_record of `(Longident.t Asttypes.loc * pattern) list * Asttypes.closed_flag``
`|` | `Ppat_array of `pattern list``
`|` | `Ppat_or of `pattern * pattern``
`|` | `Ppat_constraint of `pattern * core_type``
`|` | `Ppat_type of `Longident.t Asttypes.loc``
`|` | `Ppat_lazy of `pattern``
`|` | `Ppat_unpack of `string Asttypes.loc``
`|` | `Ppat_exception of `pattern``
`|` | `Ppat_extension of `extension``
`|` | `Ppat_open of `Longident.t Asttypes.loc * pattern``

    type expression = {

`` | `pexp_desc : `expression_desc`;`
`` | `pexp_loc : `Location.t`;`
`` | `pexp_attributes : `attributes`;`

}

    type expression_desc =

`|` | `Pexp_ident of `Longident.t Asttypes.loc``
`|` | `Pexp_constant of `constant``
`|` | `Pexp_let of `Asttypes.rec_flag * value_binding list * expression``
`|` | `Pexp_function of `case list``
`|` | `Pexp_fun of `Asttypes.arg_label * expression option * pattern * expression``
`|` | `Pexp_apply of `expression * (Asttypes.arg_label * expression) list``
`|` | `Pexp_match of `expression * case list``
`|` | `Pexp_try of `expression * case list``
`|` | `Pexp_tuple of `expression list``
`|` | `Pexp_construct of `Longident.t Asttypes.loc * expression option``
`|` | `Pexp_variant of `Asttypes.label * expression option``
`|` | `Pexp_record of `(Longident.t Asttypes.loc * expression) list * expression option``
`|` | `Pexp_field of `expression * Longident.t Asttypes.loc``
`|` | `Pexp_setfield of `expression * Longident.t Asttypes.loc * expression``
`|` | `Pexp_array of `expression list``
`|` | `Pexp_ifthenelse of `expression * expression * expression option``
`|` | `Pexp_sequence of `expression * expression``
`|` | `Pexp_while of `expression * expression``
`|` | `Pexp_for of `pattern * expression * expression * Asttypes.direction_flag * expression``
`|` | `Pexp_constraint of `expression * core_type``
`|` | `Pexp_coerce of `expression * core_type option * core_type``
`|` | `Pexp_send of `expression * Asttypes.label Asttypes.loc``
`|` | `Pexp_new of `Longident.t Asttypes.loc``
`|` | `Pexp_setinstvar of `Asttypes.label Asttypes.loc * expression``
`|` | `Pexp_override of `(Asttypes.label Asttypes.loc * expression) list``
`|` | `Pexp_letmodule of `string Asttypes.loc * module_expr * expression``
`|` | `Pexp_letexception of `extension_constructor * expression``
`|` | `Pexp_assert of `expression``
`|` | `Pexp_lazy of `expression``
`|` | `Pexp_poly of `expression * core_type option``
`|` | `Pexp_object of `class_structure``
`|` | `Pexp_newtype of `string Asttypes.loc * expression``
`|` | `Pexp_pack of `module_expr``
`|` | `Pexp_open of `Asttypes.override_flag * Longident.t Asttypes.loc * expression``
`|` | `Pexp_extension of `extension``
`|` | `Pexp_unreachable`

    type case = {

`` | `pc_lhs : `pattern`;`
`` | `pc_guard : `expression option`;`
`` | `pc_rhs : `expression`;`

}

    type value_description = {

`` | `pval_name : `string Asttypes.loc`;`
`` | `pval_type : `core_type`;`
`` | `pval_prim : `string list`;`
`` | `pval_attributes : `attributes`;`
`` | `pval_loc : `Location.t`;`

}

    type type_declaration = {

`` | `ptype_name : `string Asttypes.loc`;`
`` | `ptype_params : `(core_type * Asttypes.variance) list`;`
`` | `ptype_cstrs : `(core_type * core_type * Location.t) list`;`
`` | `ptype_kind : `type_kind`;`
`` | `ptype_private : `Asttypes.private_flag`;`
`` | `ptype_manifest : `core_type option`;`
`` | `ptype_attributes : `attributes`;`
`` | `ptype_loc : `Location.t`;`

}

    type type_kind =

`|` | `Ptype_abstract`
`|` | `Ptype_variant of `constructor_declaration list``
`|` | `Ptype_record of `label_declaration 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`;`

}

    type constructor_declaration = {

`` | `pcd_name : `string Asttypes.loc`;`
`` | `pcd_args : `constructor_arguments`;`
`` | `pcd_res : `core_type option`;`
`` | `pcd_loc : `Location.t`;`
`` | `pcd_attributes : `attributes`;`

}

    type constructor_arguments =

`|` | `Pcstr_tuple of `core_type list``
`|` | `Pcstr_record of `label_declaration list``

    type type_extension = {

`` | `ptyext_path : `Longident.t Asttypes.loc`;`
`` | `ptyext_params : `(core_type * Asttypes.variance) list`;`
`` | `ptyext_constructors : `extension_constructor list`;`
`` | `ptyext_private : `Asttypes.private_flag`;`
`` | `ptyext_attributes : `attributes`;`

}

    type extension_constructor = {

`` | `pext_name : `string Asttypes.loc`;`
`` | `pext_kind : `extension_constructor_kind`;`
`` | `pext_loc : `Location.t`;`
`` | `pext_attributes : `attributes`;`

}

    type extension_constructor_kind =

`|` | `Pext_decl of `constructor_arguments * core_type option``
`|` | `Pext_rebind of `Longident.t Asttypes.loc``

## Class language

    type class_type = {

`` | `pcty_desc : `class_type_desc`;`
`` | `pcty_loc : `Location.t`;`
`` | `pcty_attributes : `attributes`;`

}

    type class_type_desc =

`|` | `Pcty_constr of `Longident.t Asttypes.loc * core_type list``
`|` | `Pcty_signature of `class_signature``
`|` | `Pcty_arrow of `Asttypes.arg_label * core_type * class_type``
`|` | `Pcty_extension of `extension``
`|` | `Pcty_open of `Asttypes.override_flag * Longident.t Asttypes.loc * class_type``

    type class_signature = {

`` | `pcsig_self : `core_type`;`
`` | `pcsig_fields : `class_type_field list`;`

}

    type class_type_field = {

`` | `pctf_desc : `class_type_field_desc`;`
`` | `pctf_loc : `Location.t`;`
`` | `pctf_attributes : `attributes`;`

}

    type class_type_field_desc =

`|` | `Pctf_inherit of `class_type``
`|` | `Pctf_val of `(Asttypes.label Asttypes.loc * Asttypes.mutable_flag * Asttypes.virtual_flag * core_type)``
`|` | `Pctf_method of `(Asttypes.label Asttypes.loc * Asttypes.private_flag * Asttypes.virtual_flag * core_type)``
`|` | `Pctf_constraint of `(core_type * core_type)``
`|` | `Pctf_attribute of `attribute``
`|` | `Pctf_extension of `extension``

    type 'a class_infos = {

`` | `pci_virt : `Asttypes.virtual_flag`;`
`` | `pci_params : `(core_type * Asttypes.variance) list`;`
`` | `pci_name : `string Asttypes.loc`;`
`` | `pci_expr : `'a`;`
`` | `pci_loc : `Location.t`;`
`` | `pci_attributes : `attributes`;`

}

    type class_description = class_type class_infos

    type class_type_declaration = class_type class_infos

    type class_expr = {

`` | `pcl_desc : `class_expr_desc`;`
`` | `pcl_loc : `Location.t`;`
`` | `pcl_attributes : `attributes`;`

}

    type class_expr_desc =

`|` | `Pcl_constr of `Longident.t Asttypes.loc * core_type list``
`|` | `Pcl_structure of `class_structure``
`|` | `Pcl_fun of `Asttypes.arg_label * expression option * pattern * class_expr``
`|` | `Pcl_apply of `class_expr * (Asttypes.arg_label * expression) list``
`|` | `Pcl_let of `Asttypes.rec_flag * value_binding list * class_expr``
`|` | `Pcl_constraint of `class_expr * class_type``
`|` | `Pcl_extension of `extension``
`|` | `Pcl_open of `Asttypes.override_flag * Longident.t Asttypes.loc * class_expr``

    type class_structure = {

`` | `pcstr_self : `pattern`;`
`` | `pcstr_fields : `class_field list`;`

}

    type class_field = {

`` | `pcf_desc : `class_field_desc`;`
`` | `pcf_loc : `Location.t`;`
`` | `pcf_attributes : `attributes`;`

}

    type class_field_desc =

`|` | `Pcf_inherit of `Asttypes.override_flag * class_expr * string Asttypes.loc option``
`|` | `Pcf_val of `(Asttypes.label Asttypes.loc * Asttypes.mutable_flag * class_field_kind)``
`|` | `Pcf_method of `(Asttypes.label Asttypes.loc * Asttypes.private_flag * class_field_kind)``
`|` | `Pcf_constraint of `(core_type * core_type)``
`|` | `Pcf_initializer of `expression``
`|` | `Pcf_attribute of `attribute``
`|` | `Pcf_extension of `extension``

    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 module_type = {

`` | `pmty_desc : `module_type_desc`;`
`` | `pmty_loc : `Location.t`;`
`` | `pmty_attributes : `attributes`;`

}

    type module_type_desc =

`|` | `Pmty_ident of `Longident.t Asttypes.loc``
`|` | `Pmty_signature of `signature``
`|` | `Pmty_functor of `string Asttypes.loc * module_type option * module_type``
`|` | `Pmty_with of `module_type * with_constraint list``
`|` | `Pmty_typeof of `module_expr``
`|` | `Pmty_extension of `extension``
`|` | `Pmty_alias of `Longident.t Asttypes.loc``

    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``
`|` | `Psig_type of `Asttypes.rec_flag * type_declaration list``
`|` | `Psig_typext of `type_extension``
`|` | `Psig_exception of `extension_constructor``
`|` | `Psig_module of `module_declaration``
`|` | `Psig_recmodule of `module_declaration list``
`|` | `Psig_modtype of `module_type_declaration``
`|` | `Psig_open of `open_description``
`|` | `Psig_include of `include_description``
`|` | `Psig_class of `class_description list``
`|` | `Psig_class_type of `class_type_declaration list``
`|` | `Psig_attribute of `attribute``
`|` | `Psig_extension of `extension * attributes``

    type module_declaration = {

`` | `pmd_name : `string Asttypes.loc`;`
`` | `pmd_type : `module_type`;`
`` | `pmd_attributes : `attributes`;`
`` | `pmd_loc : `Location.t`;`

}

    type module_type_declaration = {

`` | `pmtd_name : `string Asttypes.loc`;`
`` | `pmtd_type : `module_type option`;`
`` | `pmtd_attributes : `attributes`;`
`` | `pmtd_loc : `Location.t`;`

}

    type open_description = {

`` | `popen_lid : `Longident.t Asttypes.loc`;`
`` | `popen_override : `Asttypes.override_flag`;`
`` | `popen_loc : `Location.t`;`
`` | `popen_attributes : `attributes`;`

}

    type 'a include_infos = {

`` | `pincl_mod : `'a`;`
`` | `pincl_loc : `Location.t`;`
`` | `pincl_attributes : `attributes`;`

}

    type include_description = module_type include_infos

    type include_declaration = module_expr include_infos

    type with_constraint =

`|` | `Pwith_type of `Longident.t Asttypes.loc * type_declaration``
`|` | `Pwith_module of `Longident.t Asttypes.loc * Longident.t Asttypes.loc``
`|` | `Pwith_typesubst of `Longident.t Asttypes.loc * type_declaration``
`|` | `Pwith_modsubst of `Longident.t Asttypes.loc * Longident.t Asttypes.loc``

    type module_expr = {

`` | `pmod_desc : `module_expr_desc`;`
`` | `pmod_loc : `Location.t`;`
`` | `pmod_attributes : `attributes`;`

}

    type module_expr_desc =

`|` | `Pmod_ident of `Longident.t Asttypes.loc``
`|` | `Pmod_structure of `structure``
`|` | `Pmod_functor of `string Asttypes.loc * module_type option * module_expr``
`|` | `Pmod_apply of `module_expr * module_expr``
`|` | `Pmod_constraint of `module_expr * module_type``
`|` | `Pmod_unpack of `expression``
`|` | `Pmod_extension of `extension``

    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``
`|` | `Pstr_value of `Asttypes.rec_flag * value_binding list``
`|` | `Pstr_primitive of `value_description``
`|` | `Pstr_type of `Asttypes.rec_flag * type_declaration list``
`|` | `Pstr_typext of `type_extension``
`|` | `Pstr_exception of `extension_constructor``
`|` | `Pstr_module of `module_binding``
`|` | `Pstr_recmodule of `module_binding list``
`|` | `Pstr_modtype of `module_type_declaration``
`|` | `Pstr_open of `open_description``
`|` | `Pstr_class of `class_declaration list``
`|` | `Pstr_class_type of `class_type_declaration list``
`|` | `Pstr_include of `include_declaration``
`|` | `Pstr_attribute of `attribute``
`|` | `Pstr_extension of `extension * attributes``

    type value_binding = {

`` | `pvb_pat : `pattern`;`
`` | `pvb_expr : `expression`;`
`` | `pvb_attributes : `attributes`;`
`` | `pvb_loc : `Location.t`;`

}

    type module_binding = {

`` | `pmb_name : `string Asttypes.loc`;`
`` | `pmb_expr : `module_expr`;`
`` | `pmb_attributes : `attributes`;`
`` | `pmb_loc : `Location.t`;`

}

## Toplevel

    type toplevel_phrase =

`|` | `Ptop_def of `structure``
`|` | `Ptop_dir of `string * directive_argument``

    type directive_argument =

`|` | `Pdir_none`
`|` | `Pdir_string of `string``
`|` | `Pdir_int of `string * char option``
`|` | `Pdir_ident of `Longident.t``
`|` | `Pdir_bool of `bool``