123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220(************************************************************************)(* v * The Coq Proof Assistant / The Coq Development Team *)(* <O___,, * INRIA - CNRS - LIX - LRI - PPS - Copyright 1999-2016 *)(* \VV/ **************************************************************)(* // * This file is distributed under the terms of the *)(* * GNU Lesser General Public License Version 2.1 *)(************************************************************************)(************************************************************************)(* Coq serialization API/Plugin *)(* Copyright 2016-2018 MINES ParisTech *)(************************************************************************)(* Status: Very Experimental *)(************************************************************************)openSexplib(**********************************************************************)(* GenArg *)(**********************************************************************)openGenargtyperlevel=[%import:Genarg.rlevel][@@derivingsexp,yojson]typeglevel=[%import:Genarg.glevel][@@derivingsexp,yojson]typetlevel=[%import:Genarg.tlevel][@@derivingsexp,yojson]openSexpletrecsexp_of_genarg_type:typeabc.(a,b,c)genarg_type->t=fungt->matchgtwith|ExtraArgtag->List[Atom"ExtraArg";Atom(ArgT.reprtag)]|ListArgrt->List[Atom"ListArg";sexp_of_genarg_typert]|OptArgrt->List[Atom"OptArg";sexp_of_genarg_typert]|PairArg(t1,t2)->List[Atom"PairArg";sexp_of_genarg_typet1;sexp_of_genarg_typet2]letsexp_of_abstract_argument_type:typelvl.('o,lvl)abstract_argument_type->t*t=funat->matchatwith|Rawwitw->Atom"raw",sexp_of_genarg_typew|Glbwitw->Atom"glb",sexp_of_genarg_typew|Topwitw->Atom"top",sexp_of_genarg_typewletrecargument_type_of_sexp:t->argument_type=funsexp->matchsexpwith|List[Atom"ExtraArg";Atomtag]->beginmatchArgT.nametagwith|None->raise(Failure"SEXP Exception in argument_type")|Some(ArgT.Anyt)->ArgumentType(ExtraArgt)end|List[Atom"ListArg";s1]->let(ArgumentTypet)=argument_type_of_sexps1inArgumentType(ListArgt)|List[Atom"OptArg";s1]->let(ArgumentTypet)=argument_type_of_sexps1inArgumentType(OptArgt)|List[Atom"PairArg";s1;s2]->let(ArgumentTypet1)=argument_type_of_sexps1inlet(ArgumentTypet2)=argument_type_of_sexps2inArgumentType(PairArg(t1,t2))|_->raise(Failure"SEXP Exception")type('raw,'glb,'top)gen_ser={raw_ser:'raw->Sexp.t;raw_des:Sexp.t->'raw;glb_ser:'glb->Sexp.t;glb_des:Sexp.t->'glb;top_ser:'top->Sexp.t;top_des:Sexp.t->'top;}letgen_ser_list:('raw,'glb,'top)gen_ser->('rawlist,'glblist,'toplist)gen_ser=fung->letopenSexplib.Convin{raw_ser=sexp_of_listg.raw_ser;raw_des=list_of_sexpg.raw_des;glb_ser=sexp_of_listg.glb_ser;glb_des=list_of_sexpg.glb_des;top_ser=sexp_of_listg.top_ser;top_des=list_of_sexpg.top_des;}letgen_ser_opt:('raw,'glb,'top)gen_ser->('rawoption,'glboption,'topoption)gen_ser=fung->letopenSexplib.Convin{raw_ser=sexp_of_optiong.raw_ser;raw_des=option_of_sexpg.raw_des;glb_ser=sexp_of_optiong.glb_ser;glb_des=option_of_sexpg.glb_des;top_ser=sexp_of_optiong.top_ser;top_des=option_of_sexpg.top_des;}letgen_ser_pair:('raw1,'glb1,'top1)gen_ser->('raw2,'glb2,'top2)gen_ser->(('raw1*'raw2),('glb1*'glb2),('top1*'top2))gen_ser=fung1g2->letopenSexplib.Convin{raw_ser=sexp_of_pairg1.raw_serg2.raw_ser;raw_des=pair_of_sexpg1.raw_desg2.raw_des;glb_ser=sexp_of_pairg1.glb_serg2.glb_ser;glb_des=pair_of_sexpg1.glb_desg2.glb_des;top_ser=sexp_of_pairg1.top_serg2.top_ser;top_des=pair_of_sexpg1.top_desg2.top_des;}moduleSerObj=structtype('raw,'glb,'top)obj=('raw,'glb,'top)gen_serletsexp_of_gentypga=lettyp=typ^": "^Sexp.to_string(sexp_of_genarg_typega)inSerlib_base.sexp_of_opaque~typletname="ser_arg"letdefault_ga=Some{(* raw_ser = (fun _ -> Sexp.(List [Atom "[XXX ser_gen]"; Atom "raw"; sexp_of_genarg_type ga])); *)raw_ser=sexp_of_gen"raw"_ga;raw_des=(Sexplib.Conv_error.no_matching_variant_found"raw_arg");(* glb_ser = (fun _ -> Sexp.(List [Atom "[XXX ser_gen]"; Atom "glb"; sexp_of_genarg_type ga])); *)glb_ser=sexp_of_gen"glb"_ga;glb_des=(Sexplib.Conv_error.no_matching_variant_found"glb_arg");(* top_ser = (fun _ -> Sexp.(List [Atom "[XXX ser_gen]"; Atom "top"; sexp_of_genarg_type ga])); *)top_ser=sexp_of_gen"top"_ga;top_des=(Sexplib.Conv_error.no_matching_variant_found"top_arg")}endmoduleSerGen=Register(SerObj)letregister_gensertyobj=SerGen.register0tyobjletrecget_gen_ser_ty:typergt.(r,g,t)Genarg.genarg_type->(r,g,t)gen_ser=fungt->matchgtwith|Genarg.ExtraArg_->SerGen.objgt|Genarg.ListArgt->gen_ser_list (get_gen_ser_tyt)|Genarg.OptArgt->gen_ser_opt(get_gen_ser_tyt)|Genarg.PairArg(t1,t2)->gen_ser_pair(get_gen_ser_tyt1)(get_gen_ser_tyt2)letget_gen_ser:typelvl.('o,lvl)abstract_argument_type->('o->'t)=funaty->matchatywith|Genarg.Rawwitty->(get_gen_ser_tyty).raw_ser|Genarg.Glbwitty->(get_gen_ser_tyty).glb_ser|Genarg.Topwitty->(get_gen_ser_tyty).top_serletgeneric_des:typelvl.('o,lvl)abstract_argument_type->t->lvlgeneric_argument=funtys->matchtywith|Genarg.Rawwitw->GenArg(ty,(get_gen_ser_tyw).raw_dess)|Genarg.Glbwitw->GenArg(ty,(get_gen_ser_tyw).glb_dess)|Genarg.Topwitw->GenArg(ty,(get_gen_ser_tyw).top_dess)(* We need to generalize this to use the proper printers for opt *)letmk_sexparg(lvl,st)so=List[Atom"GenArg";lvl;st;so](* XXX: There is still some duplication here in the traversal of g_ty, but
we can live with that for now. *)letsexp_of_genarg_val:typea.ageneric_argument->Sexp.t=fung->matchgwith|GenArg(g_ty,g_val)->mk_sexparg(sexp_of_abstract_argument_typeg_ty)(get_gen_serg_tyg_val)letsexp_of_generic_argument:typea.(a->t)->ageneric_argument->t=fun_level_tagg->sexp_of_genarg_valgtypergen_argument=RG:'lvlgeneric_argument->rgen_argumentletgen_abstype_of_sexp:t->rgen_argument=funs->matchswith|List[Atom"GenArg";Atom"raw";sty;sobj]->let(ArgumentTypety)=argument_type_of_sexpstyinRG(generic_des(Rawwitty)sobj)|List[Atom"GenArg";Atom"glb";sty;sobj]->let(ArgumentTypety)=argument_type_of_sexpstyinRG(generic_des(Glbwitty)sobj)|List[Atom"GenArg";Atom"top";sty;sobj]->let(ArgumentTypety)=argument_type_of_sexpstyinRG(generic_des(Topwitty)sobj)|_->raise(Failure"SEXP Exception in abstype")letgeneric_argument_of_sexp_lvlsexp:'aGenarg.generic_argument=let(RGga)=gen_abstype_of_sexpsexpinObj.magicgaletgeneric_argument_of_yojson_lvl_json=Error"not supported generic_argument_of_yojson"letgeneric_argument_to_yojson_lvl_g=`String"foo"type'ageneric_argument='aGenarg.generic_argumenttypeglob_generic_argument=[%import:Genarg.glob_generic_argument][@@derivingsexp,yojson]typeraw_generic_argument=[%import:Genarg.raw_generic_argument][@@derivingsexp,yojson]typetyped_generic_argument=[%import:Genarg.typed_generic_argument][@@derivingsexp,yojson]letmk_uniformpinpout={raw_ser=pin;glb_ser=pin;top_ser=pin;raw_des=pout;glb_des=pout;top_des=pout;}