123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155(************************************************************************)(* * 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_strings:typec.cp->string*stringoption=function|PKEYWORDs->"",Somes|PIDENTs->"IDENT",s|PFIELDs->"FIELD",s|PNUMBERNone->"NUMBER",None|PNUMBER(Somen)->"NUMBER",Some(NumTok.Unsigned.sprintn)|PSTRINGs->"STRING",s|PLEFTQMARK->"LEFTQMARK",None|PBULLETs->"BULLET",s|PQUOTATIONlbl->"QUOTATION",Somelbl|PEOI->"EOI",Nonetypet=|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|_->Noneletequalt1t2=matcht1,t2with|IDENTs1,KEYWORDs2->string_equals1s2|KEYWORDs1,KEYWORDs2->string_equals1s2|IDENTs1,IDENTs2->string_equals1s2|FIELDs1,FIELDs2->string_equals1s2|NUMBERn1,NUMBERn2->NumTok.Unsigned.equaln1n2|STRINGs1,STRINGs2->string_equals1s2|LEFTQMARK,LEFTQMARK->true|BULLETs1,BULLETs2->string_equals1s2|EOI,EOI->true|QUOTATION(s1,t1),QUOTATION(s2,t2)->string_equals1s2&&string_equalt1t2|_->falselettoken_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->c=leterr()=raiseGramlib.Stream.Failureinletseq=string_equalinmatchpwith|PKEYWORDs->(functionKEYWORDs'whenseqss'->s'|NUMBERnwhenseqs(NumTok.Unsigned.sprintn)->s|STRINGs'whenseqs(CString.quote_coq_strings')->s|_->err())|PIDENTNone->(functionIDENTs'->s'|_->err())|PIDENT(Somes)->(function(IDENTs'|KEYWORDs')whenseqss'->s'|_->err())|PFIELDNone->(functionFIELDs->s|_->err())|PFIELD(Somes)->(functionFIELDs'whenseqss'->s'|_->err())|PNUMBERNone->(functionNUMBERs->s|_->err())|PNUMBER(Somen)->lets=NumTok.Unsigned.sprintnin(functionNUMBERn'whens=NumTok.Unsigned.sprintn'->n'|_->err())|PSTRINGNone->(functionSTRINGs->s|_->err())|PSTRING(Somes)->(functionSTRINGs'whenseqss'->s'|_->err())|PLEFTQMARK->(functionLEFTQMARK->()|_->err())|PBULLETNone->(functionBULLETs->s|_->err())|PBULLET(Somes)->(functionBULLETs'whenseqss'->s'|_->err())|PQUOTATIONlbl->(functionQUOTATION(lbl',s')whenstring_equallbllbl'->s'|_->err())|PEOI->(functionEOI->()|_->err())