123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162(* This file is free software, part of Zipperposition. See file "license" for more details. *)(** {1 Main AST before Typing} *)moduleLoc=ParseLocationmoduleT=STermtypeterm=T.ttypety=T.ttypeform=T.t(** Basic definition of inductive types *)typedata={data_name:string;data_vars:stringlist;data_cstors:(string*(stringoption*ty)list)list;(* list of constructor. Each constructor is paired with a list of
arguments, that is, an optional projector + the type *)}(** Attributes (general terms) *)typeattr=|A_appofstring*attrlist|A_quotedofstring|A_listofattrlisttypeattrs=attrlisttypedef={def_id:string;def_ty:ty;def_rules:termlist;}(** Statement *)typestatement_view=|Includeofstring|Declofstring*ty|Defofdeflist|Rewriteofterm|Dataofdatalist|Assertofform|Lemmaofform|Goalofformtypestatement={stmt:statement_view;attrs:attrs;loc:Loc.toption;}letdefault_attrs=[]moduleA=structtypet=attrletstrs=A_app(s,[])letappsl=A_app(s,l)letquoteds=A_quotedsletlistl=A_listlendletname_of_attrs=CCList.find_map(functionA_app("name",[A_quotedn])->Somen|_->None)letattr_namen=A.app"name"[A.strn]letattr_ac=A.str"ac"letattr_prefixs=A.app"prefix"[A.quoteds]letattr_infixs=A.app"infix"[A.quoteds]letmake_?loc?(attrs=default_attrs)stmt={loc;stmt;attrs;}letmk_defdef_iddef_tydef_rules={def_id;def_ty;def_rules}letinclude_?loc?attrss=make_?loc?attrs(Includes)letdecl?loc?attrsfty=make_?loc?attrs(Decl(f,ty))letdef?loc?attrsl=make_?loc?attrs(Defl)letrewrite?loc?attrst=make_?loc?attrs(Rewritet)letdata?loc?attrsl=make_?loc?attrs(Datal)letassert_?loc?attrst=make_?attrs?loc(Assertt)letlemma?loc?attrst=make_?attrs?loc(Lemmat)letgoal?loc?attrst=make_?attrs?loc(Goalt)letpp_attr=letrecpp_attr_gen~innerout=function|A_app(s,[])->CCFormat.stringouts|A_app(s,l)whennotinner->Format.fprintfout"@[%s@ %a@]"s(Util.pp_list~sep:" "pp_attr)l|A_app(s,l)->Format.fprintfout"(@[%s@ %a@])"s(Util.pp_list~sep:" "pp_attr)l|A_quoteds->Format.fprintfout"\"%s\""s|A_listl->Format.fprintfout"[@[<hv>%a@]]"(Util.pp_list~sep:","pp_attr)landpp_attrout=pp_attr_gen~inner:trueoutinpp_attr_gen~inner:falseletpp_attrsout=function|[]->()|l->Format.fprintfout"@ [@[%a@]]"(Util.pp_list~sep:", "pp_attr)lletpp_attr_zf=pp_attrletpp_attrs_zf=pp_attrsletrecpp_attr_tstpout=function|A_app(s,[])->Format.fprintfout"%s()"s|A_app(s,l)->Format.fprintfout"%s(@[%a@])"s(Util.pp_list~sep:","pp_attr_tstp)l|A_quoteds->Format.fprintfout"'%s'"s|A_listl->Format.fprintfout"[@[<hv>%a@]]"(Util.pp_list~sep:","pp_attr_tstp)lletnamest=name_of_attrsst.attrsletpp_statementoutst=letattrs=st.attrsinletfpf=Format.fprintfinmatchst.stmtwith|Includes->fpfout"@[<2>include \"%s\"@]@."(String.escapeds)|Decl(id,ty)->fpfout"@[<2>val%a %s :@ @[%a@]@]."pp_attrsattrsidT.ppty|Defl->letpp_defout{def_id=id;def_ty;def_rules}=fpfout"@[<2>@[%s :@ %a@]@ := @[%a@]"idT.ppdef_ty(Util.pp_list~sep:" and "T.pp)def_rulesinfpfout"@[<2>def%a %a@]."pp_attrsattrs(Util.pp_list~sep:""pp_def)l|Rewritet->fpfout"@[<2>rewrite%a @[%a@]@]."pp_attrsattrsT.ppt|Datal->letpp_argout(_,ty)=T.ppouttyinletpp_cstorout(id,args)=fpfout"@[<2>| @[%s@ %a@]@]"id(Util.pp_list~sep:" "pp_arg)argsinletpp_dataoutd=fpfout"@[%s %a@] :=@ @[<v>%a@]"d.data_name(Util.pp_list~sep:" "CCFormat.string)d.data_vars(Util.pp_list~sep:""pp_cstor)d.data_cstorsinfpfout"@[<v>data%a@ %a@]."pp_attrsattrs(Util.pp_list~sep:" and "pp_data)l|Assertf->fpfout"@[<2>assert%a@ @[%a@]@]."pp_attrsattrsT.ppf|Lemmaf->fpfout"@[<2>lemma%a@ @[%a@]@]."pp_attrsattrsT.ppf|Goalf->fpfout"@[<2>goal%a@ @[%a@]@]."pp_attrsattrsT.ppf(** {2 Errors} *)exceptionParse_errorofLoc.t*stringlet()=Printexc.register_printer(function|Parse_error(loc,msg)->Some(CCFormat.sprintf"@[<4>parse error:@ @[%s@]@ at %a@]"msgLoc.pploc)|_->None)leterrorlocmsg=raise(Parse_error(loc,msg))leterrorflocmsg=CCFormat.ksprintfmsg~f:(errorloc)