PcoqSourceDeprecated alias for Procq
include module type of struct include Procq endinclude Gramlib.Grammar.S
with type keyword_state := CLexer.keyword_state
and type te := Tok.t
and type 'a pattern := 'a Tok.p
and type 'a with_gstate := 'a
and type 'a with_kwstate := 'a
and type 'a with_estate := 'a
and type 'a mod_estate := 'aType combinators to factor the module type between explicit state passing in Grammar and global state in Procq
type 'a single_extend_statement =
string option * Gramlib.Gramext.g_assoc option * 'a Production.t listtype 'a extend_statement = 'a Procq.extend_statement = | Reuse of string option * 'a Production.t listExtend an existing level by its optional given name. If None, picks the topmost level.
*)| Fresh of Gramlib.Gramext.position * 'a single_extend_statement listCreate a level at the given position.
*)val generalize_symbol :
('a, 'tr, 'c) Symbol.t ->
('b, Gramlib.Grammar.norec, 'c) Symbol.t optionThe parser of Rocq is built from three kinds of rule declarations:
Note that parsing a Rocq document is in essence stateful: the parser needs to recognize commands that start proofs and use a different parsing entry point for them.
We thus provide two different interfaces: the "raw" parsing interface, in the style of camlp5, which provides more flexibility, and a more specialize "parse_vernac" one, which will indeed adjust the state as needed.
Dynamic extension of rules
For constr notations, dynamic addition of new rules is done in several steps:
String "x"; String "+"; String "y" : symbol_token list | | interpreted as a mixed parsing/printing production | by Metasyntax.analyse_notation_tokens V NonTerminal "x"; Terminal "+"; NonTerminal "y" : symbol list | | translated to a parsing production by Metasyntax.make_production V GramConstrNonTerminal (ETConstr (NextLevel,(BorderProd Left,LeftA)), Some "x"); GramConstrTerminal ("","+"); GramConstrNonTerminal (ETConstr (NextLevel,(BorderProd Right,LeftA)), Some "y") : grammar_constr_prod_item list | | Egrammar.make_constr_prod_item V Gramext.g_symbol list which is sent to camlp5For user level tactic notations, dynamic addition of new rules is also done in several steps:
TacTerm "f"; TacNonTerm ("constr", Some "x") : grammar_tactic_prod_item_expr list | | Metasyntax.interp_prod_item V GramTerminal "f"; GramNonTerminal (ConstrArgType, Aentry ("constr","constr"), Some "x") : grammar_prod_item list | | Egrammar.make_prod_item V Gramext.g_symbol listFor TACTIC/VERNAC/ARGUMENT EXTEND, addition of new rules is done as follows:
GramTerminal "f"; GramNonTerminal (ConstrArgType, Aentry ("constr","constr"), Some "x") | | Egrammar.make_prod_item V Gramext.g_symbol listParse a string
val create_generic_entry2 :
string ->
('a, Genarg.rlevel) Genarg.abstract_argument_type ->
'a Entry.tExtend the grammar of Rocq, without synchronizing it with the backtracking mechanism. This means that grammar extensions defined this way will survive an undo.
module GramState = Procq.GramStateAuxiliary state of the grammar. Any added data must be marshallable.
Type of synchronized parsing extensions. The 'a type should be marshallable.
Type of reinitialization data
type extend_rule = Procq.extend_rule = | ExtendRule : 'a Entry.t * 'a extend_statement -> extend_rule| ExtendRuleReinit : 'a Entry.t
* gram_reinit
* 'a extend_statement -> extend_ruletype 'a grammar_extension = 'a Procq.grammar_extension = {gext_fun : 'a -> GramState.t -> extend_rule list * GramState.t;gext_eq : 'a -> 'a -> bool;}Grammar extension entry point. Given some 'a and a current grammar state, such a function must produce the list of grammar extensions that will be applied in the same order and kept synchronized w.r.t. the summary, together with a new state. It should be pure.
Create a new grammar-modifying command with the given name. The extension function is called to generate the rules for a given data.
Extend the grammar of Rocq with the given data.
Type of synchronized entry creation. The 'a type should be marshallable.
type ('a, 'b) entry_extension = ('a, 'b) Procq.entry_extension = {eext_fun : 'a -> GramState.t -> string list * GramState.t;eext_eq : 'a -> 'a -> bool;}Entry extension entry point. Given some 'a and a current grammar state, such a function must produce the list of entry extensions that will be created and kept synchronized w.r.t. the summary, together with a new state. It should be pure.
Create a new entry-creating command with the given name. The extension function is called to generate the new entries for a given data.
Create new synchronized entries using the provided data.
Find an entry generated by the synchronized system in the current state.
Registering grammars by name