123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103(************************************************************************)(* * The Coq Proof Assistant / The Coq 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) *)(************************************************************************)openUtilopenPpopenNotationexternopenNotationopenConstrexpr(*s Pretty-print. *)typeppbox=|PpHB|PpHOVBofint|PpHVBofint|PpVBofinttypeppcut=|PpBrkofint*int|PpFnlletppcmd_of_box=function|PpHB->h|PpHOVBn->hovn|PpHVBn->hvn|PpVBn->vnletppcmd_of_cut=function|PpFnl->fnl()|PpBrk(n1,n2)->brk(n1,n2)typepattern_quote_style=QuotedPattern|NotQuotedPatterntypeunparsing=|UnpMetaVarofnotation_entry_relative_level|UnpBinderMetaVarofnotation_entry_relative_level*pattern_quote_style|UnpListMetaVarofnotation_entry_relative_level*unparsinglist|UnpBinderListMetaVarofbool(* true if open binder *)*bool(* true if printed with a quote *)*unparsinglist|UnpTerminalofstring|UnpBoxofppbox*unparsingLoc.locatedlist|UnpCutofppcuttypeunparsing_rule=unparsinglistletrecunparsing_equnp1unp2=match(unp1,unp2)with|UnpMetaVarsubentry1,UnpMetaVarsubentry2->notation_entry_relative_level_eqsubentry1subentry2|UnpBinderMetaVar(subentry1,s1),UnpBinderMetaVar(subentry2,s2)->notation_entry_relative_level_eqsubentry1subentry2&&s1=s2|UnpListMetaVar(subentry1,l1),UnpListMetaVar(subentry2,l2)->notation_entry_relative_level_eqsubentry1subentry2&&List.for_all2equnparsing_eql1l2|UnpBinderListMetaVar(b1,q1,l1),UnpBinderListMetaVar(b2,q2,l2)->b1=b2&&q1=q2&&List.for_all2equnparsing_eql1l2|UnpTerminals1,UnpTerminals2->String.equals1s2|UnpBox(b1,l1),UnpBox(b2,l2)->b1=b2&&List.for_all2equnparsing_eq(List.mapsndl1)(List.mapsndl2)|UnpCutp1,UnpCutp2->p1=p2|(UnpMetaVar_|UnpBinderMetaVar_|UnpListMetaVar_|UnpBinderListMetaVar_|UnpTerminal_|UnpBox_|UnpCut_),_->false(* Register generic and specific printing rules *)typenotation_printing_rules={notation_printing_unparsing:unparsing_rule;notation_printing_level:entry_level;}typegeneric_notation_printing_rules={notation_printing_reserved:bool;notation_printing_rules:notation_printing_rules;}letgeneric_notation_printing_rules=Summary.ref~stage:Synterp~name:"generic-notation-printing-rules"(NotationMap.empty:generic_notation_printing_rulesNotationMap.t)letspecific_notation_printing_rules=Summary.ref~name:"specific-notation-printing-rules"(SpecificNotationMap.empty:notation_printing_rulesSpecificNotationMap.t)letdeclare_generic_notation_printing_rulesntnrules=generic_notation_printing_rules:=NotationMap.addntnrules!generic_notation_printing_rulesletdeclare_specific_notation_printing_rulesspecific_ntnrules=specific_notation_printing_rules:=SpecificNotationMap.addspecific_ntnrules!specific_notation_printing_ruleslethas_generic_notation_printing_rulentn=try(NotationMap.findntn!generic_notation_printing_rules).notation_printing_reservedwithNot_found->falseletfind_generic_notation_printing_rulentn=NotationMap.findntn!generic_notation_printing_rulesletfind_specific_notation_printing_rulespecific_ntn=SpecificNotationMap.findspecific_ntn!specific_notation_printing_rulesletfind_notation_printing_rulewhichntn=trymatchwhichwith|None->raiseNot_found(* Normally not the case *)|Somewhich->(find_specific_notation_printing_rule(which,ntn))withNot_found->(find_generic_notation_printing_rulentn).notation_printing_rules