123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125(************************************************************************)(* * 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) *)(************************************************************************)openProcqtypeproof_mode_entry=ProofMode:{command_entry:Vernacexpr.vernac_exprEntry.t;wit_tactic_expr:('raw,_,unit)Genarg.genarg_type;tactic_expr_entry:'rawEntry.t;}->proof_mode_entrytypeproof_mode=string(* Tactic parsing modes *)letregister_proof_mode,find_proof_mode,lookup_proof_mode,list_proof_modes=letproof_mode:(string,proof_mode_entry)Hashtbl.t=Hashtbl.create19inletregister_proof_modeenamee=Hashtbl.addproof_modeenamee;enameinletfind_proof_modeename=tryHashtbl.findproof_modeenamewithNot_found->CErrors.anomalyPp.(str"proof mode not found: "++strename)inletlookup_proof_modename=ifHashtbl.memproof_modenamethenSomenameelseNoneinletlist_proof_modes()=Hashtbl.foldCString.Map.addproof_modeCString.Map.emptyinregister_proof_mode,find_proof_mode,lookup_proof_mode,list_proof_modesletproof_mode_to_stringname=name(* Default proof mode, to be set at the beginning of proofs for
programs that cannot be statically classified. *)letproof_mode_opt_name=["Default";"Proof";"Mode"]letnoedit_mode=Entry.make"noedit_command"letnoedit_tactic_expr=Entry.make"noedit_tactic_expr"letnoedit_mode_entry=ProofMode{command_entry=noedit_mode;wit_tactic_expr=Stdarg.wit_unit;tactic_expr_entry=noedit_tactic_expr;}let{Goptions.get=get_default_proof_mode}=Goptions.declare_interpreted_string_option_and_ref~stage:Summary.Stage.Synterp~key:proof_mode_opt_name~value:(register_proof_mode"Noedit"noedit_mode_entry)(funname->matchlookup_proof_modenamewith|Somepm->pm|None->CErrors.user_errPp.(str(Format.sprintf"No proof mode named \"%s\"."name)))proof_mode_to_string()letcommand_entry_ref=refNonemoduleVernac_=struct(* The different kinds of vernacular commands *)letgallina=Entry.make"gallina"letgallina_ext=Entry.make"gallina_ext"letcommand=Entry.make"command"letsyntax=Entry.make"syntax_command"letvernac_control=Entry.make"vernac_control"letinductive_or_record_definition=Entry.make"inductive_or_record_definition"letfix_definition=Entry.make"fix_definition"letred_expr=Entry.make"red_expr"lethint_info=Entry.make"hint_info"(* Main vernac entry *)letmain_entry=Entry.make"vernac"letnoedit_mode=noedit_modelet()=letact_vernacvloc=Somevinletact_eoi_loc=Noneinletrule=[Procq.(Production.make(Rule.nextRule.stop(Symbol.tokenTok.PEOI))act_eoi);Procq.(Production.make(Rule.nextRule.stop(Symbol.ntermvernac_control))act_vernac);]inProcq.(grammar_extendmain_entry(Fresh(Gramlib.Gramext.First,[None,None,rule])))letselect_command_entryspec=matchspecwith|None->noedit_mode|Someename->letProofModemode=find_proof_modeenameinmode.command_entryletparse_generic_tacticstrm=letmode=get_default_proof_mode()inletProofModemode=find_proof_modemodeinletv=Procq.Entry.parse_token_streammode.tactic_expr_entrystrminGentactic.of_raw_genargGenarg.(in_gen(rawwitmode.wit_tactic_expr)v)letcommand_entry=Procq.Entry.(of_parser"command_entry"{parser_fun=(fun_kwstatestrm->Procq.Entry.parse_token_stream(select_command_entry!command_entry_ref)strm)})letgeneric_tactic=Procq.Entry.(of_parser"generic_tactic"{parser_fun=(fun_kwstatestrm->parse_generic_tacticstrm)})endmoduleUnsafe=structletset_tactic_entryoname=command_entry_ref:=onameendletmain_entryproof_mode=Unsafe.set_tactic_entryproof_mode;Vernac_.main_entrylet()=register_grammarRedexpr.wit_red_expr(Vernac_.red_expr);register_grammarGentactic.wit_generic_tacticVernac_.generic_tactic