aboutsummaryrefslogtreecommitdiffhomepage
path: root/parsing/ppconstr.ml
diff options
context:
space:
mode:
Diffstat (limited to 'parsing/ppconstr.ml')
-rw-r--r--parsing/ppconstr.ml49
1 files changed, 33 insertions, 16 deletions
diff --git a/parsing/ppconstr.ml b/parsing/ppconstr.ml
index baac4a06d..e49f531f1 100644
--- a/parsing/ppconstr.ml
+++ b/parsing/ppconstr.ml
@@ -73,7 +73,12 @@ let wrap_exception = function
let latom = 0
let lannot = 1
-let lprod = 8
+let lprod = 1
+let llambda = 1
+let lif = 1
+let lletin = 1
+let lcases = 1
+let larrow = 8
let lcast = 9
let lapp = 10
let ltop = (8,E)
@@ -98,7 +103,17 @@ let pr_notation pr s env =
let unpl, level = find_notation_printing_rule s in
prlist (print_hunk pr env) unpl, level
-let pr_delimiters x = failwith "pr_delimiters: TODO"
+let pr_delimiters sc strm =
+ match find_delimiters sc with
+ | None -> anomaly "Delimiters without concrete syntax"
+ | Some (left,right) ->
+ assert (left <> "" && right <> "");
+ let lspace =
+ if is_letter (left.[String.length left -1]) then str " " else mt () in
+ let rspace =
+ let c = right.[0] in
+ if is_letter c or is_digit c or c = '\'' then str " " else mt () in
+ str left ++ lspace ++ strm ++ rspace ++ str right
open Rawterm
@@ -118,7 +133,7 @@ let pr_explicitation = function
| Some n -> int n ++ str "!"
let pr_expl_args pr (a,expl) =
- pr_explicitation expl ++ pr (latom,E) a
+ pr_explicitation expl ++ pr (lapp,L) a
let pr_opt_type pr = function
| CHole _ -> mt ()
@@ -197,8 +212,8 @@ let pr_fix pr = pr_recursive "Fix" (pr_fixdecl pr)
let pr_cofix pr = pr_recursive "Fix" (pr_cofixdecl pr)
let rec pr_arrow pr = function
- | CArrow (_,a,b) -> pr (lprod,L) a ++ cut () ++ str "->" ++ pr_arrow pr b
- | a -> pr (lprod,E) a
+ | CArrow (_,a,b) -> pr (larrow,L) a ++ cut () ++ str "->" ++ pr_arrow pr b
+ | a -> pr (larrow,E) a
let pr_annotation pr t = str "<" ++ pr ltop t ++ str ">"
@@ -209,25 +224,26 @@ let rec pr inherited a =
| CRef r -> pr_reference r, latom
| CFix (_,id,fix) -> pr_fix pr (snd id) fix, latom
| CCoFix (_,id,cofix) -> pr_cofix pr (snd id) cofix, latom
- | CArrow _ -> hv 0 (pr_arrow pr a), lprod
+ | CArrow _ -> hv 0 (pr_arrow pr a), larrow
| CProdN (_,bl,a) ->
hov 0 (
str "(" ++ pr_binders pr bl ++ str ")" ++ brk(0,1) ++ pr ltop a), lprod
| CLambdaN (_,bl,a) ->
hov 0 (
- str "[" ++ pr_binders pr bl ++ str "]" ++ brk(0,1) ++ pr ltop a), lprod
+ str "[" ++ pr_binders pr bl ++ str "]" ++ brk(0,1) ++ pr ltop a),
+ llambda
| CLetIn (_,x,a,b) ->
- hov 0 (pr_let_binder pr (snd x) a ++ cut () ++ pr ltop b), lprod
+ hov 0 (pr_let_binder pr (snd x) a ++ cut () ++ pr ltop b), lletin
| CAppExpl (_,f,l) ->
hov 0 (
- str "!" ++ pr_reference f ++
- prlist (fun a -> brk (1,1) ++ pr (latom,E) a) l), lapp
+ str "!" ++ pr_reference f ++
+ prlist (fun a -> brk (1,1) ++ pr (lapp,L) a) l), lapp
| CApp (_,a,l) ->
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, lannot
+ pr_cases po c 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) *)
@@ -236,7 +252,7 @@ let rec pr inherited a =
hv 0 (
str "if" ++ pr ltop c ++ spc () ++
hov 0 (str "then" ++ brk (1,1) ++ pr ltop b1) ++ spc () ++
- hov 0 (str "else" ++ brk (1,1) ++ pr ltop b2))), lapp
+ hov 0 (str "else" ++ brk (1,1) ++ pr ltop b2))), lif
| COrderedCase (_,LetStyle,po,c,[CLambdaN(_,[_,_ as bd],b)]) ->
hov 0 (
pr_opt (pr_annotation pr) po ++
@@ -245,7 +261,7 @@ let rec pr inherited a =
hov 0 (str "(" ++ pr_binder pr bd ++ str ")") ++
str "=" ++ brk (1,1) ++
pr ltop c ++ spc () ++
- str "in " ++ pr ltop b)), lapp
+ str "in " ++ pr ltop b)), lletin
| COrderedCase (_,(MatchStyle|RegularStyle as style),po,c,bl) ->
hov 0 (
hov 0 (
@@ -256,7 +272,7 @@ let rec pr inherited a =
str (if style=RegularStyle then "of" else "with") ++
brk (1,3) ++
hov 0 (prlist (fun b -> pr ltop b ++ fnl ()) bl)) ++
- str "end")), lannot
+ str "end")), lcases
| COrderedCase (_,_,_,_,_) ->
anomaly "malformed if or destructuring let"
| CHole _ -> str "?", latom
@@ -267,8 +283,7 @@ let rec pr inherited a =
| CNotation (_,s,env) -> pr_notation pr s env
| CGrammar _ -> failwith "CGrammar: TODO"
| CNumeral (_,p) -> Bignat.pr_bigint p, latom
- | CDelimiters (_,sc,a) -> failwith "pr_delim: TODO"
-(* pr_delimiters (find_delimiters) (pr_constr_expr a)*)
+ | CDelimiters (_,sc,a) -> pr_delimiters sc (pr ltop a), latom
| CDynamic _ -> str "<dynamic>", latom
in
if prec_less prec inherited then strm
@@ -352,8 +367,10 @@ let gentermpr gt =
(* [at_top] means ids of env must be avoided in bound variables *)
let gentermpr_core at_top env t =
gentermpr (Termast.ast_of_constr at_top env t)
+
(*
let gentermpr_core at_top env t =
pr_constr (Constrextern.extern_constr at_top env t)
*)
+