123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142(************************************************************************)(* * The Rocq Prover / The Rocq Development Team *)(* v * Copyright INRIA, CNRS and contributors *)(* <O___,, * (see version control and CREDITS file for authors & dates) *)(* \VV/ **************************************************************)(* // * This file is distributed under the terms of the *)(* * GNU Lesser General Public License Version 2.1 *)(* * (see LICENSE file for the text of the license) *)(************************************************************************)(** The type of token for the Rocq lexer and parser *)letstring_equal(s1:string)s2=s1=s2type'cp=|PKEYWORD:string->stringp|PIDENT:stringoption->stringp|PFIELD:stringoption->stringp|PNUMBER:NumTok.Unsigned.toption->NumTok.Unsigned.tp|PSTRING:stringoption->stringp|PLEFTQMARK:unitp|PBULLET:stringoption->stringp|PQUOTATION:string->stringp|PEOI:unitpletpattern_exact:typec.cp->bool=function|PKEYWORD_->true|PIDENTid->Option.has_someid|PFIELDs->Option.has_somes|PNUMBERn->Option.has_somen|PSTRINGs->Option.has_somes|PLEFTQMARK->false|PBULLETs->Option.has_somes|PQUOTATION_->true|PEOI->falsetypet=|KEYWORDofstring|IDENTofstring|FIELDofstring|NUMBERofNumTok.Unsigned.t|STRINGofstring|LEFTQMARK|BULLETofstring|QUOTATIONofstring*string|EOIletequal_p(typeab)(t1:ap)(t2:bp):(a,b)Util.eqoption=letstreqs1s2=matchs1,s2withNone,None->true|Somes1,Somes2->string_equals1s2|_->falseinmatcht1,t2with|PIDENTs1,PIDENTs2whenstreqs1s2->SomeUtil.Refl|PKEYWORDs1,PKEYWORDs2whenstring_equals1s2->SomeUtil.Refl|PIDENT(Somes1),PKEYWORDs2whenstring_equals1s2->SomeUtil.Refl|PKEYWORDs1,PIDENT(Somes2)whenstring_equals1s2->SomeUtil.Refl|PFIELDs1,PFIELDs2whenstreqs1s2->SomeUtil.Refl|PNUMBERNone,PNUMBERNone->SomeUtil.Refl|PNUMBER(Somen1),PNUMBER(Somen2)whenNumTok.Unsigned.equaln1n2->SomeUtil.Refl|PSTRINGs1,PSTRINGs2whenstreqs1s2->SomeUtil.Refl|PLEFTQMARK,PLEFTQMARK->SomeUtil.Refl|PBULLETs1,PBULLETs2whenstreqs1s2->SomeUtil.Refl|PQUOTATIONs1,PQUOTATIONs2whenstring_equals1s2->SomeUtil.Refl|PEOI,PEOI->SomeUtil.Refl|_->Nonelettoken_text:typec.cp->string=function|PKEYWORDt->"'"^t^"'"|PIDENTNone->"identifier"|PIDENT(Somet)->"'"^t^"'"|PNUMBERNone->"number"|PNUMBER(Somen)->"'"^NumTok.Unsigned.sprintn^"'"|PSTRINGNone->"string"|PSTRING(Somes)->"STRING \""^s^"\""|PLEFTQMARK->"LEFTQMARK"|PEOI->"end of input"|PFIELDNone->"FIELD"|PFIELD(Somes)->"FIELD \""^s^"\""|PBULLETNone->"BULLET"|PBULLET(Somes)->"BULLET \""^s^"\""|PQUOTATIONlbl->"QUOTATION \""^lbl^"\""letextract_stringdiff_mode=function|KEYWORDs->s|IDENTs->s|STRINGs->ifdiff_modethenletescape_quotess=letlen=String.lengthsinletbuf=Buffer.createleninfori=0tolen-1doletch=String.getsiinBuffer.add_charbufch;ifch='"'thenBuffer.add_charbuf'"'else()done;Buffer.contentsbufin"\""^(escape_quotess)^"\""elses|FIELDs->ifdiff_modethen"."^selses|NUMBERn->NumTok.Unsigned.sprintn|LEFTQMARK->"?"|BULLETs->s|QUOTATION(_,s)->s|EOI->""(* Invariant, txt is "ident" or a well parenthesized "{{....}}" *)lettrim_quotationtxt=letlen=String.lengthtxtiniflen=0thenNone,txtelseletc=txt.[0]inifc='('||c='['||c='{'thenletrecauxn=ifn<len&&txt.[n]=cthenaux(n+1)elseSomec,String.subtxtn(len-(2*n))inaux0elseNone,txtletmatch_pattern(typec)(p:cp):t->coption=letseq=string_equalinmatchpwith|PKEYWORDs->(functionKEYWORDs'whenseqss'->Somes'|NUMBERnwhenseqs(NumTok.Unsigned.sprintn)->Somes|STRINGs'whenseqs(CString.quote_coq_strings')->Somes|_->None)|PIDENTNone->(functionIDENTs'->Somes'|_->None)|PIDENT(Somes)->(function(IDENTs'|KEYWORDs')whenseqss'->Somes'|_->None)|PFIELDNone->(functionFIELDs->Somes|_->None)|PFIELD(Somes)->(functionFIELDs'whenseqss'->Somes'|_->None)|PNUMBERNone->(functionNUMBERs->Somes|_->None)|PNUMBER(Somen)->lets=NumTok.Unsigned.sprintnin(functionNUMBERn'whens=NumTok.Unsigned.sprintn'->Somen'|_->None)|PSTRINGNone->(functionSTRINGs->Somes|_->None)|PSTRING(Somes)->(functionSTRINGs'whenseqss'->Somes'|_->None)|PLEFTQMARK->(functionLEFTQMARK->Some()|_->None)|PBULLETNone->(functionBULLETs->Somes|_->None)|PBULLET(Somes)->(functionBULLETs'whenseqss'->Somes'|_->None)|PQUOTATIONlbl->(functionQUOTATION(lbl',s')whenstring_equallbllbl'->Somes'|_->None)|PEOI->(functionEOI->Some()|_->None)