(************************************************************************) (* * The Coq Proof Assistant / The Coq Development Team *) (* v * INRIA, CNRS and contributors - Copyright 1999-2019 *) (* " tactic_then_gen "]" | WITH "[>" tactic_then_gen "]" ] operconstr100: [ | MOVETO term_cast operconstr99 "<:" operconstr200 | MOVETO term_cast operconstr99 "<<:" operconstr200 | MOVETO term_cast operconstr99 ":" operconstr200 | MOVETO term_cast operconstr99 ":>" ] operconstr10: [ (* fixme: add in as a prodn somewhere *) | MOVETO dangling_pattern_extension_rule "@" pattern_identref LIST1 identref | DELETE dangling_pattern_extension_rule ] operconstr9: [ (* @Zimmi48: Special token .. is for use in the Notation command. (see bug_3304.v) *) | DELETE ".." operconstr0 ".." ] arg_list: [ | arg_list appl_arg | appl_arg ] arg_list_opt: [ | arg_list | empty ] operconstr1: [ | REPLACE operconstr0 ".(" global LIST0 appl_arg ")" | WITH operconstr0 ".(" global arg_list_opt ")" | MOVETO term_projection operconstr0 ".(" global arg_list_opt ")" | MOVETO term_projection operconstr0 ".(" "@" global LIST0 ( operconstr9 ) ")" ] operconstr0: [ (* @Zimmi48: This rule is a hack, according to Hugo, and should not be shown in the manual. *) | DELETE "{" binder_constr "}" ] single_fix: [ | DELETE fix_kw fix_decl | "fix" fix_decl | "cofix" fix_decl ] fix_kw: [ | DELETENT ] binders_fixannot: [ (* | REPLACE impl_name_head impl_ident_tail binders_fixannot | WITH impl_name_head impl_ident_tail "}" binders_fixannot *) (* Omit this complex detail. See https://github.com/coq/coq/pull/10614#discussion_r344118146 *) | DELETE impl_name_head impl_ident_tail binders_fixannot | DELETE fixannot | DELETE binder binders_fixannot | DELETE (* empty *) | LIST0 binder OPT fixannot ] impl_ident_tail: [ | DELETENT (* | REPLACE "}" | WITH empty | REPLACE LIST1 name ":" lconstr "}" | WITH LIST1 name ":" lconstr | REPLACE LIST1 name "}" | WITH LIST1 name | REPLACE ":" lconstr "}" | WITH ":" lconstr *) ] of_type_with_opt_coercion: [ | DELETE ":>" ">" | DELETE ":" ">" ">" | DELETE ":" ">" ] binder: [ | DELETE name ] open_binders: [ | REPLACE name LIST0 name ":" lconstr | WITH LIST1 name ":" lconstr (* @Zimmi48: Special token .. is for use in the Notation command. (see bug_3304.v) *) | DELETE name ".." name | REPLACE name LIST0 name binders | WITH LIST1 binder | DELETE closed_binder binders ] closed_binder: [ | name | REPLACE "(" name LIST1 name ":" lconstr ")" | WITH "(" LIST1 name ":" lconstr ")" | DELETE "(" name ":" lconstr ")" | DELETE "(" name ":=" lconstr ")" | REPLACE "(" name ":" lconstr ":=" lconstr ")" | WITH "(" name rec_type_cstr ":=" lconstr ")" | DELETE "{" name LIST1 name "}" | REPLACE "{" name LIST1 name ":" lconstr "}" | WITH "{" LIST1 name rec_type_cstr "}" | DELETE "{" name ":" lconstr "}" ] typeclass_constraint: [ | EDIT ADD_OPT "!" operconstr200 ] (* ?? From the grammar, Prim.name seems to be only "_" but ident is also accepted "*) Prim.name: [ | REPLACE "_" | WITH name ] oriented_rewriter: [ | REPLACE orient_rw rewriter | WITH orient rewriter ] DELETE: [ | orient_rw ] pattern1_list: [ | pattern1_list pattern1 | pattern1 ] pattern1_list_opt: [ | pattern1_list | empty ] pattern10: [ | REPLACE pattern1 LIST1 pattern1 | WITH LIST1 pattern1 | REPLACE "@" reference LIST0 pattern1 | WITH "@" reference pattern1_list_opt ] pattern0: [ | REPLACE "(" pattern200 ")" | WITH "(" LIST1 pattern200 SEP "|" ")" | DELETE "(" pattern200 "|" LIST1 pattern200 SEP "|" ")" ] patterns_comma: [ | patterns_comma "," pattern100 | pattern100 ] patterns_comma_list_or: [ | patterns_comma_list_or "|" patterns_comma | patterns_comma ] eqn: [ | REPLACE LIST1 mult_pattern SEP "|" "=>" lconstr | WITH patterns_comma_list_or "=>" lconstr ] record_patterns: [ | REPLACE record_pattern ";" record_patterns | WITH record_patterns ";" record_pattern ] (* todo: binders should be binders_opt *) (* lexer stuff *) bigint: [ | DELETE NUMERAL | num ] ident: [ | DELETENT ] IDENT: [ | ident ] integer: [ | DELETENT ] RENAME: [ | integer int (* todo: review uses in .mlg files, some should be "natural" *) ] LEFTQMARK: [ | "?" ] natural: [ | DELETENT ] natural: [ | num (* todo: or should it be "nat"? *) ] NUMERAL: [ | numeral ] (* todo: QUOTATION only used in a test suite .mlg files, is it documented/useful? *) string: [ | DELETENT ] STRING: [ | string ] (* todo: is "bigint" useful?? *) (* todo: "check_int" in g_prim.mlg should be "check_num" *) (* added productions *) name_colon: [ | name ":" ] command_entry: [ | noedit_mode ] tactic_expr1: [ | EDIT match_key ADD_OPT "reverse" "goal" "with" match_context_list "end" | MOVETO ltac_match_goal match_key OPT "reverse" "goal" "with" match_context_list "end" | MOVETO ltac_match_term match_key tactic_expr5 "with" match_list "end" ] DELETE: [ | tactic_then_locality ] tactic_expr4: [ | REPLACE tactic_expr3 ";" tactic_then_gen "]" | WITH tactic_expr3 ";" "[" tactic_then_gen "]" | tactic_expr3 ";" "[" ">" tactic_then_gen "]" ] match_context_list: [ | EDIT ADD_OPT "|" LIST1 match_context_rule SEP "|" ] match_hyps: [ | REPLACE name ":=" "[" match_pattern "]" ":" match_pattern | WITH name ":=" OPT ("[" match_pattern "]" ":") match_pattern | DELETE name ":=" match_pattern ] match_list: [ | EDIT ADD_OPT "|" LIST1 match_rule SEP "|" ] match_rule: [ | REPLACE match_pattern "=>" tactic_expr5 | WITH [ match_pattern | "_" ] "=>" tactic_expr5 | DELETE "_" "=>" tactic_expr5 ] selector_body: [ | REPLACE range_selector_or_nth (* depends on whether range_selector_or_nth is deleted first *) | WITH LIST1 range_selector SEP "," ] range_selector_or_nth: [ | DELETENT ] simple_tactic: [ | DELETE "intros" | REPLACE "intros" ne_intropatterns | WITH "intros" intropatterns | DELETE "eintros" | REPLACE "eintros" ne_intropatterns | WITH "eintros" intropatterns ] intropatterns: [ | DELETE LIST0 intropattern | intropatterns intropattern | empty ] (* todo: don't use DELETENT for this *) ne_intropatterns: [ | DELETENT ] or_and_intropattern: [ | DELETE "()" | DELETE "(" simple_intropattern ")" | REPLACE "(" simple_intropattern "," LIST1 simple_intropattern SEP "," ")" | WITH "(" LIST0 simple_intropattern SEP "," ")" | EDIT "[" USE_NT intropattern_or LIST1 intropatterns SEP "|" "]" ] bar_cbrace: [ | REPLACE "|" "}" | WITH "|}" ] (* todo: is this really correct? Search for "Pvernac.register_proof_mode" *) (* consider tactic_command vs tac2mode *) vernac_aux: [ | tactic_mode "." ] SPLICE: [ | noedit_mode | command_entry | bigint | match_list | match_context_list | IDENT | LEFTQMARK | natural | NUMERAL | STRING | hyp | var | identref | pattern_ident | constr_eval (* splices as multiple prods *) | tactic_then_last (* todo: dependency on c.edit_mlg edit?? really useful? *) | Prim.name | ltac_selector | Constr.ident | attribute_list | operconstr99 | operconstr90 | operconstr9 | operconstr8 | pattern200 | pattern99 | pattern90 | ne_lstring | ne_string | lstring | basequalid | fullyqualid | global | reference | bar_cbrace | lconstr | impl_name_head (* | ast_closure_term | ast_closure_lterm | ident_no_do | ssrterm | ssrtacarg | ssrtac3arg | ssrtclarg | ssrhyp | ssrhoi_hyp | ssrhoi_id | ssrindex | ssrhpats | ssrhpats_nobs | ssrfwdid | ssrmovearg | ssrcasearg | ssrrwargs | ssrviewposspc | ssrpatternarg | ssr_elsepat | ssr_mpat | ssrunlockargs | ssrcofixfwd | ssrfixfwd | ssrhavefwdwbinders | ssripats_ne | ssrparentacarg | ssrposefwd *) | preident | lpar_id_coloneq | binders | casted_constr | check_module_types | constr_pattern | decl_sep | function_rec_definition_loc (* loses funind annotation *) | glob | glob_constr_with_bindings | id_or_meta | lconstr_pattern | lglob | ltac_tacdef_body | mode | mult_pattern | open_constr | option_table | record_declaration | register_type_token | tactic | uconstr | impl_ident_head | argument_spec | at_level | branches | check_module_type | decorated_vernac | ext_module_expr | ext_module_type | pattern_identref | test | binder_constr | atomic_constr | let_type_cstr | name_colon | closed_binder | binders_fixannot ] RENAME: [ | clause clause_dft_concl | in_clause' in_clause | tactic3 ltac_expr3 (* todo: can't figure out how this gets mapped by coqpp *) | tactic1 ltac_expr1 (* todo: can't figure out how this gets mapped by coqpp *) | tactic0 ltac_expr0 (* todo: can't figure out how this gets mapped by coqpp *) | tactic_expr5 ltac_expr | tactic_expr4 ltac_expr4 | tactic_expr3 ltac_expr3 | tactic_expr2 ltac_expr2 | tactic_expr1 ltac_expr1 | tactic_expr0 ltac_expr0 (* | nonsimple_intropattern intropattern (* ltac2 *) *) | intropatterns intropattern_list_opt | operconstr200 term (* historical name *) | operconstr100 term100 | operconstr10 term10 | operconstr1 term1 | operconstr0 term0 | pattern100 pattern | match_constr term_match (*| impl_ident_tail impl_ident*) | ssexpr35 ssexpr (* strange in mlg, ssexpr50 is after this *) | tactic_then_gen multi_goal_tactics | selector only_selector | selector_body selector | input_fun fun_var | match_hyps match_hyp | BULLET bullet | nat_or_var num_or_var | fix_decl fix_body | instance universe_annot_opt | rec_type_cstr colon_term_opt | fix_constr term_fix | constr term1_extended | case_type return_type | appl_arg arg | record_patterns record_patterns_opt | universe_increment universe_increment_opt | rec_definition fix_definition | corec_definition cofix_definition | record_field_instance field_def | record_fields_instance fields_def | evar_instance evar_bindings_opt | inst evar_binding ] (* todo: ssrreflect*.rst ref to fix_body is incorrect *)