aboutsummaryrefslogtreecommitdiff
path: root/parsing
diff options
context:
space:
mode:
authorherbelin2009-04-27 13:55:46 +0000
committerherbelin2009-04-27 13:55:46 +0000
commit94affd965c1554d2ad10654e9832fcdb2a024daf (patch)
tree6501b61d51db4a7e346fbaf390c847847f48d4e9 /parsing
parentf90fde30288f67b167b68bfd32363eaa20644c5f (diff)
- Fixed a little bug in previous commit (bad failure in case of unknown entry).
- Added support for list of intropattern in Tactic Notation. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@12109 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'parsing')
-rw-r--r--parsing/argextend.ml46
-rw-r--r--parsing/pcoq.ml419
-rw-r--r--parsing/pcoq.mli4
-rw-r--r--parsing/tacextend.ml44
-rw-r--r--parsing/vernacextend.ml44
5 files changed, 20 insertions, 17 deletions
diff --git a/parsing/argextend.ml4 b/parsing/argextend.ml4
index aa0c3c771e..539b203d01 100644
--- a/parsing/argextend.ml4
+++ b/parsing/argextend.ml4
@@ -238,7 +238,7 @@ EXTEND
[ e = argtype; LIDENT "list" -> List0ArgType e
| e = argtype; LIDENT "option" -> OptArgType e ]
| "0"
- [ e = LIDENT -> fst (interp_entry_name None e "")
+ [ e = LIDENT -> fst (interp_entry_name false None e "")
| "("; e = argtype; ")" -> e ] ]
;
argrule:
@@ -246,10 +246,10 @@ EXTEND
;
genarg:
[ [ e = LIDENT; "("; s = LIDENT; ")" ->
- let t, g = interp_entry_name None e "" in
+ let t, g = interp_entry_name false None e "" in
GramNonTerminal (loc, t, g, Some (Names.id_of_string s))
| e = LIDENT; "("; s = LIDENT; ","; sep = STRING; ")" ->
- let t, g = interp_entry_name None e sep in
+ let t, g = interp_entry_name false None e sep in
GramNonTerminal (loc, t, g, Some (Names.id_of_string s))
| s = STRING ->
if String.length s > 0 && Util.is_letter s.[0] then
diff --git a/parsing/pcoq.ml4 b/parsing/pcoq.ml4
index 99c6d8528c..b7928b3b54 100644
--- a/parsing/pcoq.ml4
+++ b/parsing/pcoq.ml4
@@ -652,26 +652,26 @@ let rec symbol_of_prod_entry_key = function
(**********************************************************************)
(* Interpret entry names of the form "ne_constr_list" as entry keys *)
-let rec interp_entry_name up_level s sep =
+let rec interp_entry_name static up_level s sep =
let l = String.length s in
if l > 8 & String.sub s 0 3 = "ne_" & String.sub s (l-5) 5 = "_list" then
- let t, g = interp_entry_name up_level (String.sub s 3 (l-8)) "" in
+ let t, g = interp_entry_name static up_level (String.sub s 3 (l-8)) "" in
List1ArgType t, Alist1 g
else if l > 12 & String.sub s 0 3 = "ne_" &
String.sub s (l-9) 9 = "_list_sep" then
- let t, g = interp_entry_name up_level (String.sub s 3 (l-12)) "" in
+ let t, g = interp_entry_name static up_level (String.sub s 3 (l-12)) "" in
List1ArgType t, Alist1sep (g,sep)
else if l > 5 & String.sub s (l-5) 5 = "_list" then
- let t, g = interp_entry_name up_level (String.sub s 0 (l-5)) "" in
+ let t, g = interp_entry_name static up_level (String.sub s 0 (l-5)) "" in
List0ArgType t, Alist0 g
else if l > 9 & String.sub s (l-9) 9 = "_list_sep" then
- let t, g = interp_entry_name up_level (String.sub s 0 (l-9)) "" in
+ let t, g = interp_entry_name static up_level (String.sub s 0 (l-9)) "" in
List0ArgType t, Alist0sep (g,sep)
else if l > 4 & String.sub s (l-4) 4 = "_opt" then
- let t, g = interp_entry_name up_level (String.sub s 0 (l-4)) "" in
+ let t, g = interp_entry_name static up_level (String.sub s 0 (l-4)) "" in
OptArgType t, Aopt g
else if l > 5 & String.sub s (l-5) 5 = "_mods" then
- let t, g = interp_entry_name up_level (String.sub s 0 (l-1)) "" in
+ let t, g = interp_entry_name static up_level (String.sub s 0 (l-1)) "" in
List0ArgType t, Amodifiers g
else
let s = if s = "hyp" then "var" else s in
@@ -684,7 +684,10 @@ let rec interp_entry_name up_level s sep =
try Some (get_entry uprim s), Aentry ("prim",s) with Not_found ->
try Some (get_entry uconstr s), Aentry ("constr",s) with Not_found ->
try Some (get_entry utactic s), Aentry ("tactic",s) with Not_found ->
- None, Aentry ("",s) in
+ if static then
+ error ("Unknown entry "^s^".")
+ else
+ None, Aentry ("",s) in
let t =
match t with
| Some t -> type_of_typed_entry t
diff --git a/parsing/pcoq.mli b/parsing/pcoq.mli
index 02db8d55d1..f356ae07e3 100644
--- a/parsing/pcoq.mli
+++ b/parsing/pcoq.mli
@@ -270,8 +270,8 @@ val symbol_of_prod_entry_key :
(**********************************************************************)
(* Interpret entry names of the form "ne_constr_list" as entry keys *)
-val interp_entry_name : int option -> string -> string ->
- entry_type * Gram.te prod_entry_key
+val interp_entry_name : bool (* true to fail on unknown entry *) ->
+ int option -> string -> string -> entry_type * Gram.te prod_entry_key
(**********************************************************************)
(* Registering/resetting the level of a constr entry *)
diff --git a/parsing/tacextend.ml4 b/parsing/tacextend.ml4
index fc499241cf..d52ab8dd73 100644
--- a/parsing/tacextend.ml4
+++ b/parsing/tacextend.ml4
@@ -203,10 +203,10 @@ EXTEND
;
tacargs:
[ [ e = LIDENT; "("; s = LIDENT; ")" ->
- let t, g = interp_entry_name None e "" in
+ let t, g = interp_entry_name false None e "" in
GramNonTerminal (loc, t, g, Some (Names.id_of_string s))
| e = LIDENT; "("; s = LIDENT; ","; sep = STRING; ")" ->
- let t, g = interp_entry_name None e sep in
+ let t, g = interp_entry_name false None e sep in
GramNonTerminal (loc, t, g, Some (Names.id_of_string s))
| s = STRING ->
if s = "" then Util.user_err_loc (loc,"",Pp.str "Empty terminal.");
diff --git a/parsing/vernacextend.ml4 b/parsing/vernacextend.ml4
index be9e0e422c..dd05d5cd76 100644
--- a/parsing/vernacextend.ml4
+++ b/parsing/vernacextend.ml4
@@ -82,10 +82,10 @@ EXTEND
;
args:
[ [ e = LIDENT; "("; s = LIDENT; ")" ->
- let t, g = interp_entry_name None e "" in
+ let t, g = interp_entry_name false None e "" in
GramNonTerminal (loc, t, g, Some (Names.id_of_string s))
| e = LIDENT; "("; s = LIDENT; ","; sep = STRING; ")" ->
- let t, g = interp_entry_name None e sep in
+ let t, g = interp_entry_name false None e sep in
GramNonTerminal (loc, t, g, Some (Names.id_of_string s))
| s = STRING ->
GramTerminal s