123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550(**************************************************************************)(* *)(* OCaml *)(* *)(* Alain Frisch, LexiFi *)(* *)(* Copyright 2012 Institut National de Recherche en Informatique et *)(* en Automatique. *)(* *)(* All rights reserved. This file is distributed under the terms of *)(* the GNU Lesser General Public License version 2.1, with the *)(* special exception on linking described in the file LICENSE. *)(* *)(**************************************************************************)(* TODO: remove this open *)openStdlib0moduleLocation=Astlib.LocationmoduleLongident=Astlib.LongidentopenAstlib.Ast_500[@@@warning"-9"]openAsttypesopenParsetreetype'awith_loc='aLocation.loctypeloc=Location.ttypelid=Longident.twith_loctypestr=stringwith_loctypestr_opt=stringoptionwith_loctypeattrs=attributelistletdefault_loc=refLocation.nonetyperef_and_value=R:'aref*'a->ref_and_valueletprotect_ref=letset_ref(R(r,v))=r:=vinfunreff->let(R(r,_))=refinletbackup=R(r,!r)inset_refref;matchf()with|x->set_refbackup;x|exceptione->set_refbackup;raiseeletwith_default_loclf=protect_ref(R(default_loc,l))fmoduleConst=structletinteger?suffixi=Pconst_integer(i,suffix)letint?suffixi=integer?suffix(Int.to_stringi)letint32?(suffix='l')i=integer~suffix(Int32.to_stringi)letint64?(suffix='L')i=integer~suffix(Int64.to_stringi)letnativeint?(suffix='n')i=integer~suffix(Nativeint.to_stringi)letfloat?suffixf=Pconst_float(f,suffix)letcharc=Pconst_charcletstring?quotation_delimiter?(loc=!default_loc)s=Pconst_string(s,loc,quotation_delimiter)endmoduleAttr=structletmk?(loc=!default_loc)namepayload={attr_name=name;attr_payload=payload;attr_loc=loc}endmoduleTyp=structletmk?(loc=!default_loc)?(attrs=[])d={ptyp_desc=d;ptyp_loc=loc;ptyp_loc_stack=[];ptyp_attributes=attrs;}letattrda={dwithptyp_attributes=d.ptyp_attributes@[a]}letany?loc?attrs()=mk?loc?attrsPtyp_anyletvar?loc?attrsa=mk?loc?attrs(Ptyp_vara)letarrow?loc?attrsabc=mk?loc?attrs(Ptyp_arrow(a,b,c))lettuple?loc?attrsa=mk?loc?attrs(Ptyp_tuplea)letconstr?loc?attrsab=mk?loc?attrs(Ptyp_constr(a,b))letobject_?loc?attrsab=mk?loc?attrs(Ptyp_object(a,b))letclass_?loc?attrsab=mk?loc?attrs(Ptyp_class(a,b))letalias?loc?attrsab=mk?loc?attrs(Ptyp_alias(a,b))letvariant?loc?attrsabc=mk?loc?attrs(Ptyp_variant(a,b,c))letpoly?loc?attrsab=mk?loc?attrs(Ptyp_poly(a,b))letpackage?loc?attrsab=mk?loc?attrs(Ptyp_package(a,b))letextension?loc?attrsa=mk?loc?attrs(Ptyp_extensiona)letforce_polyt=matcht.ptyp_descwithPtyp_poly_->t|_->poly~loc:t.ptyp_loc[]t(* -> ghost? *)letvarify_constructorsvar_namest=letcheck_variablevllocv=ifList.memvvlthenLocation.raise_errorf~loc"variable in scope syntax error: %s"vinletvar_names=List.map(funv->v.txt)var_namesinletrecloopt=letdesc=matcht.ptyp_descwith|Ptyp_any->Ptyp_any|Ptyp_varx->check_variablevar_namest.ptyp_locx;Ptyp_varx|Ptyp_arrow(label,core_type,core_type')->Ptyp_arrow(label,loopcore_type,loopcore_type')|Ptyp_tuplelst->Ptyp_tuple(List.maplooplst)|Ptyp_constr({txt=Longident.Lidents},[])whenList.memsvar_names->Ptyp_vars|Ptyp_constr(longident,lst)->Ptyp_constr(longident,List.maplooplst)|Ptyp_object(lst,o)->Ptyp_object(List.maploop_object_fieldlst,o)|Ptyp_class(longident,lst)->Ptyp_class(longident,List.maplooplst)|Ptyp_alias(core_type,string)->check_variablevar_namest.ptyp_locstring;Ptyp_alias(loopcore_type,string)|Ptyp_variant(row_field_list,flag,lbl_lst_option)->Ptyp_variant(List.maploop_row_fieldrow_field_list,flag,lbl_lst_option)|Ptyp_poly(string_lst,core_type)->List.iter(funv->check_variablevar_namest.ptyp_locv.txt)string_lst;Ptyp_poly(string_lst,loopcore_type)|Ptyp_package(longident,lst)->Ptyp_package(longident,List.map(fun(n,typ)->(n,looptyp))lst)|Ptyp_extension(s,arg)->Ptyp_extension(s,arg)in{twithptyp_desc=desc}andloop_row_fieldfield=letprf_desc=matchfield.prf_descwith|Rtag(label,flag,lst)->Rtag(label,flag,List.maplooplst)|Rinheritt->Rinherit(loopt)in{fieldwithprf_desc}andloop_object_fieldfield=letpof_desc=matchfield.pof_descwith|Otag(label,t)->Otag(label,loopt)|Oinheritt->Oinherit(loopt)in{fieldwithpof_desc}inlooptendmodulePat=structletmk?(loc=!default_loc)?(attrs=[])d={ppat_desc=d;ppat_loc=loc;ppat_loc_stack=[];ppat_attributes=attrs;}letattrda={dwithppat_attributes=d.ppat_attributes@[a]}letany?loc?attrs()=mk?loc?attrsPpat_anyletvar?loc?attrsa=mk?loc?attrs(Ppat_vara)letalias?loc?attrsab=mk?loc?attrs(Ppat_alias(a,b))letconstant?loc?attrsa=mk?loc?attrs(Ppat_constanta)letinterval?loc?attrsab=mk?loc?attrs(Ppat_interval(a,b))lettuple?loc?attrsa=mk?loc?attrs(Ppat_tuplea)letconstruct?loc?attrsab=mk?loc?attrs(Ppat_construct(a,Option.map(funb->([],b))b))letvariant?loc?attrsab=mk?loc?attrs(Ppat_variant(a,b))letrecord?loc?attrsab=mk?loc?attrs(Ppat_record(a,b))letarray?loc?attrsa=mk?loc?attrs(Ppat_arraya)letor_?loc?attrsab=mk?loc?attrs(Ppat_or(a,b))letconstraint_?loc?attrsab=mk?loc?attrs(Ppat_constraint(a,b))lettype_?loc?attrsa=mk?loc?attrs(Ppat_typea)letlazy_?loc?attrsa=mk?loc?attrs(Ppat_lazya)letunpack?loc?attrsa=mk?loc?attrs(Ppat_unpacka)letopen_?loc?attrsab=mk?loc?attrs(Ppat_open(a,b))letexception_?loc?attrsa=mk?loc?attrs(Ppat_exceptiona)letextension?loc?attrsa=mk?loc?attrs(Ppat_extensiona)endmoduleExp=structletmk?(loc=!default_loc)?(attrs=[])d={pexp_desc=d;pexp_loc=loc;pexp_loc_stack=[];pexp_attributes=attrs;}letattrda={dwithpexp_attributes=d.pexp_attributes@[a]}letident?loc?attrsa=mk?loc?attrs(Pexp_identa)letconstant?loc?attrsa=mk?loc?attrs(Pexp_constanta)letlet_?loc?attrsabc=mk?loc?attrs(Pexp_let(a,b,c))letfun_?loc?attrsabcd=mk?loc?attrs(Pexp_fun(a,b,c,d))letfunction_?loc?attrsa=mk?loc?attrs(Pexp_functiona)letapply?loc?attrsab=mk?loc?attrs(Pexp_apply(a,b))letmatch_?loc?attrsab=mk?loc?attrs(Pexp_match(a,b))lettry_?loc?attrsab=mk?loc?attrs(Pexp_try(a,b))lettuple?loc?attrsa=mk?loc?attrs(Pexp_tuplea)letconstruct?loc?attrsab=mk?loc?attrs(Pexp_construct(a,b))letvariant?loc?attrsab=mk?loc?attrs(Pexp_variant(a,b))letrecord?loc?attrsab=mk?loc?attrs(Pexp_record(a,b))letfield?loc?attrsab=mk?loc?attrs(Pexp_field(a,b))letsetfield?loc?attrsabc=mk?loc?attrs(Pexp_setfield(a,b,c))letarray?loc?attrsa=mk?loc?attrs(Pexp_arraya)letifthenelse?loc?attrsabc=mk?loc?attrs(Pexp_ifthenelse(a,b,c))letsequence?loc?attrsab=mk?loc?attrs(Pexp_sequence(a,b))letwhile_?loc?attrsab=mk?loc?attrs(Pexp_while(a,b))letfor_?loc?attrsabcde=mk?loc?attrs(Pexp_for(a,b,c,d,e))letconstraint_?loc?attrsab=mk?loc?attrs(Pexp_constraint(a,b))letcoerce?loc?attrsabc=mk?loc?attrs(Pexp_coerce(a,b,c))letsend?loc?attrsab=mk?loc?attrs(Pexp_send(a,b))letnew_?loc?attrsa=mk?loc?attrs(Pexp_newa)letsetinstvar?loc?attrsab=mk?loc?attrs(Pexp_setinstvar(a,b))letoverride?loc?attrsa=mk?loc?attrs(Pexp_overridea)letletmodule?loc?attrsabc=mk?loc?attrs(Pexp_letmodule(a,b,c))letletexception?loc?attrsab=mk?loc?attrs(Pexp_letexception(a,b))letassert_?loc?attrsa=mk?loc?attrs(Pexp_asserta)letlazy_?loc?attrsa=mk?loc?attrs(Pexp_lazya)letpoly?loc?attrsab=mk?loc?attrs(Pexp_poly(a,b))letobject_?loc?attrsa=mk?loc?attrs(Pexp_objecta)letnewtype?loc?attrsab=mk?loc?attrs(Pexp_newtype(a,b))letpack?loc?attrsa=mk?loc?attrs(Pexp_packa)letopen_?loc?attrsab=mk?loc?attrs(Pexp_open(a,b))letletop?loc?attrslet_andsbody=mk?loc?attrs(Pexp_letop{let_;ands;body})letextension?loc?attrsa=mk?loc?attrs(Pexp_extensiona)letunreachable?loc?attrs()=mk?loc?attrsPexp_unreachableletcaselhs?guardrhs={pc_lhs=lhs;pc_guard=guard;pc_rhs=rhs}letbinding_opoppatexploc={pbop_op=op;pbop_pat=pat;pbop_exp=exp;pbop_loc=loc}endmoduleMty=structletmk?(loc=!default_loc)?(attrs=[])d={pmty_desc=d;pmty_loc=loc;pmty_attributes=attrs}letattrda={dwithpmty_attributes=d.pmty_attributes@[a]}letident?loc?attrsa=mk?loc?attrs(Pmty_identa)letalias?loc?attrsa=mk?loc?attrs(Pmty_aliasa)letsignature?loc?attrsa=mk?loc?attrs(Pmty_signaturea)letfunctor_?loc?attrsab=mk?loc?attrs(Pmty_functor(a,b))letwith_?loc?attrsab=mk?loc?attrs(Pmty_with(a,b))lettypeof_?loc?attrsa=mk?loc?attrs(Pmty_typeofa)letextension?loc?attrsa=mk?loc?attrs(Pmty_extensiona)endmoduleMod=structletmk?(loc=!default_loc)?(attrs=[])d={pmod_desc=d;pmod_loc=loc;pmod_attributes=attrs}letattrda={dwithpmod_attributes=d.pmod_attributes@[a]}letident?loc?attrsx=mk?loc?attrs(Pmod_identx)letstructure?loc?attrsx=mk?loc?attrs(Pmod_structurex)letfunctor_?loc?attrsargbody=mk?loc?attrs(Pmod_functor(arg,body))letapply?loc?attrsm1m2=mk?loc?attrs(Pmod_apply(m1,m2))letconstraint_?loc?attrsmmty=mk?loc?attrs(Pmod_constraint(m,mty))letunpack?loc?attrse=mk?loc?attrs(Pmod_unpacke)letextension?loc?attrsa=mk?loc?attrs(Pmod_extensiona)endmoduleSig=structletmk?(loc=!default_loc)d={psig_desc=d;psig_loc=loc}letvalue?loca=mk?loc(Psig_valuea)lettype_?locrec_flaga=mk?loc(Psig_type(rec_flag,a))lettype_subst?loca=mk?loc(Psig_typesubsta)lettype_extension?loca=mk?loc(Psig_typexta)letexception_?loca=mk?loc(Psig_exceptiona)letmodule_?loca=mk?loc(Psig_modulea)letmod_subst?loca=mk?loc(Psig_modsubsta)letrec_module?loca=mk?loc(Psig_recmodulea)letmodtype?loca=mk?loc(Psig_modtypea)letopen_?loca=mk?loc(Psig_opena)letinclude_?loca=mk?loc(Psig_includea)letclass_?loca=mk?loc(Psig_classa)letclass_type?loca=mk?loc(Psig_class_typea)letextension?loc?(attrs=[])a=mk?loc(Psig_extension(a,attrs))letattribute?loca=mk?loc(Psig_attributea)endmoduleStr=structletmk?(loc=!default_loc)d={pstr_desc=d;pstr_loc=loc}leteval?loc?(attrs=[])a=mk?loc(Pstr_eval(a,attrs))letvalue?locab=mk?loc(Pstr_value(a,b))letprimitive?loca=mk?loc(Pstr_primitivea)lettype_?locrec_flaga=mk?loc(Pstr_type(rec_flag,a))lettype_extension?loca=mk?loc(Pstr_typexta)letexception_?loca=mk?loc(Pstr_exceptiona)letmodule_?loca=mk?loc(Pstr_modulea)letrec_module?loca=mk?loc(Pstr_recmodulea)letmodtype?loca=mk?loc(Pstr_modtypea)letopen_?loca=mk?loc(Pstr_opena)letclass_?loca=mk?loc(Pstr_classa)letclass_type?loca=mk?loc(Pstr_class_typea)letinclude_?loca=mk?loc(Pstr_includea)letextension?loc?(attrs=[])a=mk?loc(Pstr_extension(a,attrs))letattribute?loca=mk?loc(Pstr_attributea)endmoduleCl=structletmk?(loc=!default_loc)?(attrs=[])d={pcl_desc=d;pcl_loc=loc;pcl_attributes=attrs}letattrda={dwithpcl_attributes=d.pcl_attributes@[a]}letconstr?loc?attrsab=mk?loc?attrs(Pcl_constr(a,b))letstructure?loc?attrsa=mk?loc?attrs(Pcl_structurea)letfun_?loc?attrsabcd=mk?loc?attrs(Pcl_fun(a,b,c,d))letapply?loc?attrsab=mk?loc?attrs(Pcl_apply(a,b))letlet_?loc?attrsabc=mk?loc?attrs(Pcl_let(a,b,c))letconstraint_?loc?attrsab=mk?loc?attrs(Pcl_constraint(a,b))letextension?loc?attrsa=mk?loc?attrs(Pcl_extensiona)letopen_?loc?attrsab=mk?loc?attrs(Pcl_open(a,b))endmoduleCty=structletmk?(loc=!default_loc)?(attrs=[])d={pcty_desc=d;pcty_loc=loc;pcty_attributes=attrs}letattrda={dwithpcty_attributes=d.pcty_attributes@[a]}letconstr?loc?attrsab=mk?loc?attrs(Pcty_constr(a,b))letsignature?loc?attrsa=mk?loc?attrs(Pcty_signaturea)letarrow?loc?attrsabc=mk?loc?attrs(Pcty_arrow(a,b,c))letextension?loc?attrsa=mk?loc?attrs(Pcty_extensiona)letopen_?loc?attrsab=mk?loc?attrs(Pcty_open(a,b))endmoduleCtf=structletmk?(loc=!default_loc)?(attrs=[])d={pctf_desc=d;pctf_loc=loc;pctf_attributes=attrs}letinherit_?loc?attrsa=mk?loc?attrs(Pctf_inherita)letval_?loc?attrsabcd=mk?loc?attrs(Pctf_val(a,b,c,d))letmethod_?loc?attrsabcd=mk?loc?attrs(Pctf_method(a,b,c,d))letconstraint_?loc?attrsab=mk?loc?attrs(Pctf_constraint(a,b))letextension?loc?attrsa=mk?loc?attrs(Pctf_extensiona)letattribute?loca=mk?loc(Pctf_attributea)letattrda={dwithpctf_attributes=d.pctf_attributes@[a]}endmoduleCf=structletmk?(loc=!default_loc)?(attrs=[])d={pcf_desc=d;pcf_loc=loc;pcf_attributes=attrs}letinherit_?loc?attrsabc=mk?loc?attrs(Pcf_inherit(a,b,c))letval_?loc?attrsabc=mk?loc?attrs(Pcf_val(a,b,c))letmethod_?loc?attrsabc=mk?loc?attrs(Pcf_method(a,b,c))letconstraint_?loc?attrsab=mk?loc?attrs(Pcf_constraint(a,b))letinitializer_?loc?attrsa=mk?loc?attrs(Pcf_initializera)letextension?loc?attrsa=mk?loc?attrs(Pcf_extensiona)letattribute?loca=mk?loc(Pcf_attributea)letvirtual_ct=Cfk_virtualctletconcreteoe=Cfk_concrete(o,e)letattrda={dwithpcf_attributes=d.pcf_attributes@[a]}endmoduleVal=structletmk?(loc=!default_loc)?(attrs=[])?(prim=[])nametyp={pval_name=name;pval_type=typ;pval_attributes=attrs;pval_loc=loc;pval_prim=prim;}endmoduleMd=structletmk?(loc=!default_loc)?(attrs=[])nametyp={pmd_name=name;pmd_type=typ;pmd_attributes=attrs;pmd_loc=loc}endmoduleMs=structletmk?(loc=!default_loc)?(attrs=[])namesyn={pms_name=name;pms_manifest=syn;pms_attributes=attrs;pms_loc=loc;}endmoduleMtd=structletmk?(loc=!default_loc)?(attrs=[])?typname={pmtd_name=name;pmtd_type=typ;pmtd_attributes=attrs;pmtd_loc=loc;}endmoduleMb=structletmk?(loc=!default_loc)?(attrs=[])nameexpr={pmb_name=name;pmb_expr=expr;pmb_attributes=attrs;pmb_loc=loc}endmoduleOpn=structletmk?(loc=!default_loc)?(attrs=[])?(override=Fresh)expr={popen_expr=expr;popen_override=override;popen_loc=loc;popen_attributes=attrs;}endmoduleIncl=structletmk?(loc=!default_loc)?(attrs=[])mexpr={pincl_mod=mexpr;pincl_loc=loc;pincl_attributes=attrs}endmoduleVb=structletmk?(loc=!default_loc)?(attrs=[])patexpr={pvb_pat=pat;pvb_expr=expr;pvb_attributes=attrs;pvb_loc=loc}endmoduleCi=structletmk?(loc=!default_loc)?(attrs=[])?(virt=Concrete)?(params=[])nameexpr={pci_virt=virt;pci_params=params;pci_name=name;pci_expr=expr;pci_attributes=attrs;pci_loc=loc;}endmoduleType=structletmk?(loc=!default_loc)?(attrs=[])?(params=[])?(cstrs=[])?(kind=Ptype_abstract)?(priv=Public)?manifestname={ptype_name=name;ptype_params=params;ptype_cstrs=cstrs;ptype_kind=kind;ptype_private=priv;ptype_manifest=manifest;ptype_attributes=attrs;ptype_loc=loc;}letconstructor?(loc=!default_loc)?(attrs=[])?(vars=[])?(args=Pcstr_tuple[])?resname={pcd_name=name;pcd_vars=vars;pcd_args=args;pcd_res=res;pcd_loc=loc;pcd_attributes=attrs;}letfield?(loc=!default_loc)?(attrs=[])?(mut=Immutable)nametyp={pld_name=name;pld_mutable=mut;pld_type=typ;pld_loc=loc;pld_attributes=attrs;}end(** Type extensions *)moduleTe=structletmk?(loc=!default_loc)?(attrs=[])?(params=[])?(priv=Public)pathconstructors={ptyext_path=path;ptyext_params=params;ptyext_constructors=constructors;ptyext_private=priv;ptyext_loc=loc;ptyext_attributes=attrs;}letmk_exception?(loc=!default_loc)?(attrs=[])constructor={ptyexn_constructor=constructor;ptyexn_loc=loc;ptyexn_attributes=attrs;}letconstructor?(loc=!default_loc)?(attrs=[])namekind={pext_name=name;pext_kind=kind;pext_loc=loc;pext_attributes=attrs;}letdecl?(loc=!default_loc)?(attrs=[])?(vars=[])?(args=Pcstr_tuple[])?resname={pext_name=name;pext_kind=Pext_decl(vars,args,res);pext_loc=loc;pext_attributes=attrs;}letrebind?(loc=!default_loc)?(attrs=[])namelid={pext_name=name;pext_kind=Pext_rebindlid;pext_loc=loc;pext_attributes=attrs;}endmoduleCsig=structletmkselffields={pcsig_self=self;pcsig_fields=fields}endmoduleCstr=structletmkselffields={pcstr_self=self;pcstr_fields=fields}end(** Row fields *)moduleRf=structletmk?(loc=!default_loc)?(attrs=[])desc={prf_desc=desc;prf_loc=loc;prf_attributes=attrs}lettag?loc?attrslabelconsttys=mk?loc?attrs(Rtag(label,const,tys))letinherit_?locty=mk?loc(Rinheritty)end(** Object fields *)moduleOf=structletmk?(loc=!default_loc)?(attrs=[])desc={pof_desc=desc;pof_loc=loc;pof_attributes=attrs}lettag?loc?attrslabelty=mk?loc?attrs(Otag(label,ty))letinherit_?locty=mk?loc(Oinheritty)end