aboutsummaryrefslogtreecommitdiffhomepage
path: root/parsing
diff options
context:
space:
mode:
authorGravatar herbelin <herbelin@85f007b7-540e-0410-9357-904b9bb8a0f7>2002-12-02 18:49:51 +0000
committerGravatar herbelin <herbelin@85f007b7-540e-0410-9357-904b9bb8a0f7>2002-12-02 18:49:51 +0000
commit9bfb8b1262e3e833a2df9917c3b1d7a2775693a3 (patch)
treef921fc5b1f12a19e4b69999ebd86c4bd62f47c6e /parsing
parent3e782e81b1bec6b34b3a172cb5b951f7ec101041 (diff)
Re-déplacement du résultat de Grammar au niveau constr_expr
(globalisation uniquement des noms - sauf cases, fix, ..., pas d'implicites, pas d'interprétation des scopes - pas plus robuste qu'avant...). Diverses améliorations affichage et parsing. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@3350 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'parsing')
-rw-r--r--parsing/extend.ml16
-rw-r--r--parsing/extend.mli7
-rw-r--r--parsing/ppconstr.ml33
3 files changed, 44 insertions, 12 deletions
diff --git a/parsing/extend.ml b/parsing/extend.ml
index c7ea8737f..64d8cc7cd 100644
--- a/parsing/extend.ml
+++ b/parsing/extend.ml
@@ -47,7 +47,7 @@ type prod_item =
type grammar_rule = {
gr_name : string;
gr_production : prod_item list;
- gr_action : aconstr }
+ gr_action : constr_expr }
type grammar_entry = {
ge_name : string;
@@ -65,11 +65,14 @@ type grammar_associativity = Gramext.g_assoc option
type entry_context = identifier list
-let ast_to_rawconstr = ref (fun _ _ -> AVar (id_of_string "Z"))
-let set_ast_to_rawconstr f = ast_to_rawconstr := f
+open Rawterm
+open Libnames
+
+let globalizer = ref (fun _ _ -> CHole dummy_loc)
+let set_constr_globalizer f = globalizer := f
let act_of_ast vars = function
- | SimpleAction (loc,ConstrNode a) -> !ast_to_rawconstr vars a
+ | SimpleAction (loc,ConstrNode a) -> !globalizer vars a
| SimpleAction (loc,CasesPatternNode a) ->
failwith "TODO:act_of_ast: cases_pattern"
| CaseAction _ -> failwith "case/let not supported"
@@ -92,8 +95,11 @@ type grammar_production =
type raw_grammar_rule = string * grammar_production list * grammar_action
type raw_grammar_entry = string * grammar_associativity * raw_grammar_rule list
+(* No kernel names in Grammar's *)
+let subst_constr_expr _ a = a
+
let subst_grammar_rule subst gr =
- { gr with gr_action = subst_aconstr subst gr.gr_action }
+ { gr with gr_action = subst_constr_expr subst gr.gr_action }
let subst_grammar_entry subst ge =
{ ge with gl_rules = List.map (subst_grammar_rule subst) ge.gl_rules }
diff --git a/parsing/extend.mli b/parsing/extend.mli
index 12d2ecc62..7398c7903 100644
--- a/parsing/extend.mli
+++ b/parsing/extend.mli
@@ -48,7 +48,7 @@ type prod_item =
type grammar_rule = {
gr_name : string;
gr_production : prod_item list;
- gr_action : aconstr }
+ gr_action : constr_expr }
type grammar_entry = {
ge_name : string;
@@ -63,8 +63,9 @@ type grammar_associativity = Gramext.g_assoc option
(* Globalisation and type-checking of Grammar actions *)
type entry_context = identifier list
-val to_act_check_vars : entry_context -> grammar_action -> aconstr
-val set_ast_to_rawconstr : (entry_context -> constr_expr -> aconstr) -> unit
+
+val set_constr_globalizer :
+ (entry_context -> constr_expr -> constr_expr) -> unit
type syntax_modifier =
| SetItemLevel of string list * int
diff --git a/parsing/ppconstr.ml b/parsing/ppconstr.ml
index e177bb621..cea099da7 100644
--- a/parsing/ppconstr.ml
+++ b/parsing/ppconstr.ml
@@ -214,7 +214,33 @@ let rec pr_arrow pr = function
let pr_annotation pr t = str "<" ++ pr ltop t ++ str ">"
-let pr_cases _ _ _ = str "<CASES(TODO)>"
+let rec pr_pat = function
+ | CPatAlias (_,p,x) -> pr_pat p ++ spc () ++ str "as" ++ spc () ++ pr_id x
+ | CPatCstr (_,c,[]) -> pr_reference c
+ | CPatCstr (_,c,pl) ->
+ hov 0 (
+ str "(" ++ pr_reference c ++ spc () ++
+ prlist_with_sep spc pr_pat pl ++ str ")")
+ | CPatAtom (_,Some c) -> pr_reference c
+ | CPatAtom (_,None) -> str "_"
+ | CPatNumeral (_,n) -> Bignat.pr_bigint n
+ | CPatDelimiters (_,key,p) -> pr_delimiters key (pr_pat p)
+
+let pr_eqn pr (_,patl,rhs) =
+ hov 0 (
+ prlist_with_sep spc pr_pat patl ++
+ str "=>" ++
+ brk (1,1) ++ pr ltop rhs)
+
+let pr_cases pr po tml eqns =
+ hov 0 (
+ pr_opt (pr_annotation pr) po ++
+ hv 0 (
+ hv 0 (
+ str "Cases" ++ brk (1,2) ++
+ prlist_with_sep spc (pr ltop) tml ++ spc() ++ str "of") ++
+ prlist_with_sep pr_bar (pr_eqn pr) eqns ++ spc () ++
+ str "end"))
let rec pr inherited a =
let (strm,prec) = match a with
@@ -239,8 +265,8 @@ let rec pr inherited a =
hov 0 (
pr (latom,E) a ++
prlist (fun a -> brk (1,1) ++ pr_expl_args pr a) l), lapp
- | CCases (_,po,c,eqns) ->
- pr_cases po c eqns, lcases
+ | CCases (_,po,tml,eqns) ->
+ pr_cases pr po tml eqns, lcases
| COrderedCase (_,IfStyle,po,c,[b1;b2]) ->
(* On force les parenthèses autour d'un "if" sous-terme (même si le
parsing est lui plus tolérant) *)
@@ -278,7 +304,6 @@ let rec pr inherited a =
| CCast (_,a,b) ->
hv 0 (pr (lcast,L) a ++ cut () ++ str "::" ++ pr (lcast,E) b), lcast
| CNotation (_,s,env) -> pr_notation pr s env
- | CGrammar _ -> failwith "CGrammar: TODO"
| CNumeral (_,p) -> Bignat.pr_bigint p, latom
| CDelimiters (_,sc,a) -> pr_delimiters sc (pr ltop a), latom
| CDynamic _ -> str "<dynamic>", latom