aboutsummaryrefslogtreecommitdiffhomepage
path: root/parsing/printer.ml
diff options
context:
space:
mode:
Diffstat (limited to 'parsing/printer.ml')
-rw-r--r--parsing/printer.ml154
1 files changed, 89 insertions, 65 deletions
diff --git a/parsing/printer.ml b/parsing/printer.ml
index 72fe499e6..df2aabdf8 100644
--- a/parsing/printer.ml
+++ b/parsing/printer.ml
@@ -28,15 +28,91 @@ open Ppconstr
let emacs_str s = if !Options.print_emacs then s else ""
-(* These are the names of the universes where the pp rules for constr and
- tactic are put (must be consistent with files PPConstr.v and PPTactic.v *)
-
-let tactic_syntax_universe = "tactic"
+(**********************************************************************)
+(* Old Ast printing *)
+let constr_syntax_universe = "constr"
(* This is starting precedence for printing constructions or tactics *)
(* Level 9 means no parentheses except for applicative terms (at level 10) *)
-let tactic_initial_prec = Some ((tactic_syntax_universe,(9,0,0)),Ppextend.L)
-
+let constr_initial_prec_v7 = Some (9,Ppextend.L)
+let constr_initial_prec = Some (200,Ppextend.E)
+
+let dfltpr ast = (str"#GENTERM " ++ print_ast ast);;
+
+let global_const_name kn =
+ try pr_global Idset.empty (ConstRef kn)
+ with Not_found -> (* May happen in debug *)
+ (str ("CONST("^(string_of_kn kn)^")"))
+
+let global_var_name id =
+ try pr_global Idset.empty (VarRef id)
+ with Not_found -> (* May happen in debug *)
+ (str ("SECVAR("^(string_of_id id)^")"))
+
+let global_ind_name (kn,tyi) =
+ try pr_global Idset.empty (IndRef (kn,tyi))
+ with Not_found -> (* May happen in debug *)
+ (str ("IND("^(string_of_kn kn)^","^(string_of_int tyi)^")"))
+
+let global_constr_name ((kn,tyi),i) =
+ try pr_global Idset.empty (ConstructRef ((kn,tyi),i))
+ with Not_found -> (* May happen in debug *)
+ (str ("CONSTRUCT("^(string_of_kn kn)^","^(string_of_int tyi)
+ ^","^(string_of_int i)^")"))
+
+let globpr gt = match gt with
+ | Nvar(_,s) -> (pr_id s)
+ | Node(_,"EVAR", [Num (_,ev)]) -> (str ("?" ^ (string_of_int ev)))
+ | Node(_,"CONST",[Path(_,sl)]) ->
+ global_const_name (section_path sl)
+ | Node(_,"SECVAR",[Nvar(_,s)]) ->
+ global_var_name s
+ | Node(_,"MUTIND",[Path(_,sl); Num(_,tyi)]) ->
+ global_ind_name (section_path sl, tyi)
+ | Node(_,"MUTCONSTRUCT",[Path(_,sl); Num(_,tyi); Num(_,i)]) ->
+ global_constr_name ((section_path sl, tyi), i)
+ | Dynamic(_,d) ->
+ if (Dyn.tag d) = "constr" then (str"<dynamic [constr]>")
+ else dfltpr gt
+ | gt -> dfltpr gt
+
+
+let wrap_exception = function
+ Anomaly (s1,s2) ->
+ warning ("Anomaly ("^s1^")"); pp s2;
+ str"<PP error: non-printable term>"
+ | Failure _ | UserError _ | Not_found ->
+ str"<PP error: non-printable term>"
+ | s -> raise s
+
+let gentermpr_fail gt =
+ let prec =
+ if !Options.v7 then constr_initial_prec_v7 else constr_initial_prec in
+ Esyntax.genprint globpr constr_syntax_universe prec gt
+
+let gentermpr gt =
+ try gentermpr_fail gt
+ with s -> wrap_exception s
+
+(**********************************************************************)
+(* Generic printing: choose old or new printers *)
+
+(* [at_top] means ids of env must be avoided in bound variables *)
+let gentermpr_core at_top env t =
+ if !Options.v7 then gentermpr (Termast.ast_of_constr at_top env t)
+ else Ppconstrnew.pr_constr (Constrextern.extern_constr at_top env t)
+let pr_cases_pattern t =
+ if !Options.v7 then gentermpr (Termast.ast_of_cases_pattern t)
+ else Ppconstrnew.pr_cases_pattern
+ (Constrextern.extern_cases_pattern Idset.empty t)
+let pr_pattern_env tenv env t =
+ if !Options.v7 then gentermpr (Termast.ast_of_pattern tenv env t)
+ else Ppconstrnew.pr_constr
+ (Constrextern.extern_pattern tenv env t)
+
+(**********************************************************************)
+(* Derived printers *)
+
let prterm_env_at_top env = gentermpr_core true env
let prterm_env env = gentermpr_core false env
let prtype_env env typ = prterm_env env typ
@@ -48,25 +124,14 @@ let prterm t = prterm_env (Global.env()) t
let prtype t = prtype_env (Global.env()) t
let prjudge j = prjudge_env (Global.env()) j
-let fprterm_env a =
- warning "Fw printing not implemented, use CCI printing 1"; prterm_env a
-let fprterm a =
- warning "Fw printing not implemented, use CCI printing 2"; prterm a
-
-let fprtype_env env typ =
- warning "Fw printing not implemented, use CCI printing 3"; prtype_env env typ
-let fprtype a =
- warning "Fw printing not implemented, use CCI printing 4"; prtype a
+let pr_constant env cst = prterm_env env (mkConst cst)
+let pr_existential env ev = prterm_env env (mkEvar ev)
+let pr_inductive env ind = prterm_env env (mkInd ind)
+let pr_constructor env cstr = prterm_env env (mkConstruct cstr)
+let pr_global = pr_global Idset.empty
-(* For compatibility *)
-let fterm0 = fprterm_env
-
-let pr_constant env cst = gentermpr (ast_of_constant env cst)
-let pr_existential env ev = gentermpr (ast_of_existential env ev)
-let pr_inductive env ind = gentermpr (ast_of_inductive env ind)
-let pr_constructor env cstr = gentermpr (ast_of_constructor env cstr)
-
-let pr_global = pr_global
+let pr_rawterm t =
+ pr_constr (Constrextern.extern_rawconstr Idset.empty t)
open Pattern
let pr_ref_label = function (* On triche sur le contexte *)
@@ -75,49 +140,8 @@ let pr_ref_label = function (* On triche sur le contexte *)
| CstrNode sp -> pr_constructor (Global.env()) sp
| VarNode id -> pr_id id
-let pr_cases_pattern t = gentermpr (Termast.ast_of_cases_pattern t)
-(*
-let pr_rawterm t = gentermpr (Termast.ast_of_rawconstr t)
-*)
-let pr_rawterm t = pr_constr (Constrextern.extern_rawconstr t)
-let pr_pattern_env tenv env t = gentermpr (Termast.ast_of_pattern tenv env t)
let pr_pattern t = pr_pattern_env (Global.env()) empty_names_context t
-(*
-let gentacpr x = Pptactic.prtac x
-*)
-
-(*
-and default_tacpr = function
- | Nvar(_,s) -> (pr_id s)
-
- (* constr's may occur inside tac expressions ! *)
- | Node(_,"EVAR", [Num (_,ev)]) -> (str ("?" ^ (string_of_int ev)))
- | Node(_,"CONST",[Path(_,sl)]) ->
- let sp = section_path sl in
- pr_global (ConstRef sp)
- | Node(_,"MUTIND",[Path(_,sl); Num(_,tyi)]) ->
- let sp = section_path sl in
- pr_global (IndRef (sp,tyi))
- | Node(_,"MUTCONSTRUCT",[Path(_,sl); Num(_,tyi); Num(_,i)]) ->
- let sp = section_path sl in
- pr_global (ConstructRef ((sp,tyi),i))
-
- (* This should be tactics *)
- | Node(_,s,[]) -> (str s)
-(* TODO
- | Node(_,s,ta) ->
- (str s ++ brk(1,2) ++ hov 0 (prlist_with_sep pr_spc gentacpr ta))
-*)
- | Dynamic(_,d) as gt ->
- let tg = Dyn.tag d in
- if tg = "tactic" then (str"<dynamic [tactic]>")
- else if tg = "value" then (str"<dynamic [value]>")
- else if tg = "constr" then (str"<dynamic [constr]>")
- else dfltpr gt
- | gt -> dfltpr gt
-*)
-
let pr_var_decl env (id,c,typ) =
let pbody = match c with
| None -> (mt ())