aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--parsing/egrammar.ml44
-rw-r--r--parsing/extend.ml1
-rw-r--r--parsing/g_basevernac.ml42
-rw-r--r--toplevel/metasyntax.ml13
-rw-r--r--toplevel/metasyntax.mli2
-rw-r--r--toplevel/vernacexpr.ml2
6 files changed, 33 insertions, 31 deletions
diff --git a/parsing/egrammar.ml b/parsing/egrammar.ml
index 5b57774920..17d9736211 100644
--- a/parsing/egrammar.ml
+++ b/parsing/egrammar.ml
@@ -47,22 +47,25 @@ let symbolic_level = function
| 11 -> "pattern", None
| n -> "constr", Some n
-let numeric_levels = ref [8;1;0]
-
-exception Found
-
-let find_position n =
- let after = ref 8 in
- let rec add_level q = function
- | p::l when p > n -> p :: add_level p l
- | p::l when p = n -> raise Found
- | l -> after := q; n::l
- in
- try
- numeric_levels := add_level 8 !numeric_levels;
- Gramext.After (constr_level !after)
- with
- Found -> Gramext.Level (constr_level n)
+let numeric_levels =
+ ref [8,Some Gramext.RightA; 1,None; 0,None ]
+
+exception Found of Gramext.g_assoc option
+
+let find_position assoc = function
+ | None -> None, assoc
+ | Some n ->
+ let after = ref 8 in
+ let rec add_level q = function
+ | (p,_ as pa)::l when p > n -> pa :: add_level p l
+ | (p,a)::l when p = n -> raise (Found a)
+ | l -> after := q; (n,assoc)::l
+ in
+ try
+ numeric_levels := add_level 8 !numeric_levels;
+ Some (Gramext.After (constr_level !after)), assoc
+ with
+ Found a -> Some (Gramext.Level (constr_level n)), a
(* Interpretation of the right hand side of grammar rules *)
@@ -179,7 +182,7 @@ let extend_entry univ (te, etyp, pos, name, ass, rls) =
let define_entry univ {ge_name=n; gl_assoc=ass; gl_rules=rls} =
let typ = explicitize_entry (fst univ) n in
let e,lev = entry_of_type true typ in
- let pos = option_app find_position lev in
+ let pos,ass = find_position ass lev in
let name = option_app constr_level lev in
(e,typ,pos,name,ass,rls)
@@ -216,19 +219,16 @@ let extend_constr entry pos (level,assoc) make_act pt =
let act = make_act ntl in
grammar_extend entry pos [(level, assoc, [symbs, act])]
-let constr_entry name =
- object_of_typed_entry (get_entry (get_univ "constr") name)
-
let extend_constr_notation (n,assoc,ntn,rule) =
let mkact loc env = CNotation (loc,ntn,env) in
let (e,level) = entry_of_type false (ETConstr ((n,Ppextend.E),Some n)) in
- let pos = option_app find_position level in
+ let pos,assoc = find_position assoc level in
extend_constr e pos (option_app constr_level level,assoc)
(make_act mkact) rule
let extend_constr_delimiters (sc,rule,pat_rule) =
let mkact loc env = CDelimiters (loc,sc,snd (List.hd env)) in
- extend_constr (constr_entry "constr") (Some (Gramext.Level "top"))
+ extend_constr Constr.constr (Some (Gramext.Level "0"))
(None,None)
(make_act mkact) rule;
let mkact loc env = CPatDelimiters (loc,sc,snd (List.hd env)) in
diff --git a/parsing/extend.ml b/parsing/extend.ml
index 2e4eea4b0f..70704f0195 100644
--- a/parsing/extend.ml
+++ b/parsing/extend.ml
@@ -162,6 +162,7 @@ let explicitize_entry univ nt =
| "constr8" | "constr" -> ETConstr ((8,E),Some 8)
| "constr9" -> ETConstr ((9,E),Some 9)
| "constr10" | "lconstr" -> ETConstr ((10,E),Some 10)
+ | "pattern" -> ETPattern
| "ident" -> ETIdent
| "global" -> ETReference
| _ -> ETOther (univ,nt)
diff --git a/parsing/g_basevernac.ml4 b/parsing/g_basevernac.ml4
index d042f8c915..4d675a0828 100644
--- a/parsing/g_basevernac.ml4
+++ b/parsing/g_basevernac.ml4
@@ -226,7 +226,7 @@ GEXTEND Gram
| IDENT "Open"; IDENT "Scope"; sc = IDENT -> VernacOpenScope sc
| IDENT "Delimits"; IDENT "Scope"; sc = IDENT; "with"; key = IDENT ->
- VernacDelimiters (sc,("'"^key^":","'"))
+ VernacDelimiters (sc,key)
| IDENT "Arguments"; IDENT "Scope"; qid = global;
"["; scl = LIST0 opt_scope; "]" -> VernacArgumentsScope (qid,scl)
diff --git a/toplevel/metasyntax.ml b/toplevel/metasyntax.ml
index 858add3c78..8efa576f0d 100644
--- a/toplevel/metasyntax.ml
+++ b/toplevel/metasyntax.ml
@@ -662,13 +662,14 @@ let (inDelim,outDelim) =
load_function = load_delimiters;
export_function = (fun x -> Some x) }
-let make_delimiter_rule (l,r) typ =
+let make_delimiter_rule key typ =
let e = Nameops.make_ident "e" None in
- let symbols = [Terminal l; NonTerminal e; Terminal r] in
+ let m = key^":" in
+ let symbols = [Terminal "`"; Terminal m; NonTerminal e; Terminal "`"] in
make_production [e,typ] symbols
-let add_delimiters scope (l,r as dlms) =
- if l = "" or r = "" then error "Delimiters cannot be empty";
- let gram_rule = make_delimiter_rule dlms (ETConstr ((0,E),Some 0)) in
- let pat_gram_rule = make_delimiter_rule dlms ETPattern in
+let add_delimiters scope key =
+ let gram_rule = make_delimiter_rule key (ETConstr ((0,E),Some 0)) in
+ let pat_gram_rule = make_delimiter_rule key ETPattern in
+ let dlms = ("`"^key^":", "`") in
Lib.add_anonymous_leaf (inDelim(gram_rule,pat_gram_rule,scope,dlms))
diff --git a/toplevel/metasyntax.mli b/toplevel/metasyntax.mli
index fbbe4a94e5..a63d1dea91 100644
--- a/toplevel/metasyntax.mli
+++ b/toplevel/metasyntax.mli
@@ -34,7 +34,7 @@ val add_infix :
val add_distfix :
grammar_associativity -> precedence -> string -> reference
-> scope_name option -> unit
-val add_delimiters : scope_name -> delimiters -> unit
+val add_delimiters : scope_name -> string -> unit
val add_notation : string -> constr_expr
-> syntax_modifier list -> scope_name option -> unit
diff --git a/toplevel/vernacexpr.ml b/toplevel/vernacexpr.ml
index 050ac58d1c..6076184b8d 100644
--- a/toplevel/vernacexpr.ml
+++ b/toplevel/vernacexpr.ml
@@ -155,7 +155,7 @@ type vernac_expr =
| VernacSyntax of string * raw_syntax_entry list
| VernacSyntaxExtension of string * syntax_modifier list
| VernacOpenScope of scope_name
- | VernacDelimiters of scope_name * (string * string)
+ | VernacDelimiters of scope_name * string
| VernacArgumentsScope of reference * scope_name option list
| VernacInfix of
grammar_associativity * precedence * string * reference *