29 val extend_prtabs: string -> SynExt.xprod list -> prtabs -> prtabs |
29 val extend_prtabs: string -> SynExt.xprod list -> prtabs -> prtabs |
30 val remove_prtabs: string -> SynExt.xprod list -> prtabs -> prtabs |
30 val remove_prtabs: string -> SynExt.xprod list -> prtabs -> prtabs |
31 val merge_prtabs: prtabs -> prtabs -> prtabs |
31 val merge_prtabs: prtabs -> prtabs -> prtabs |
32 val pretty_term_ast: (string -> xstring) -> Proof.context -> bool -> prtabs |
32 val pretty_term_ast: (string -> xstring) -> Proof.context -> bool -> prtabs |
33 -> (string -> (Proof.context -> Ast.ast list -> Ast.ast) list) |
33 -> (string -> (Proof.context -> Ast.ast list -> Ast.ast) list) |
34 -> (string -> (string -> string * int) option) -> Ast.ast -> Pretty.T |
34 -> (string -> (string -> string * int) option) -> Ast.ast -> Pretty.T list |
35 val pretty_typ_ast: Proof.context -> bool -> prtabs |
35 val pretty_typ_ast: Proof.context -> bool -> prtabs |
36 -> (string -> (Proof.context -> Ast.ast list -> Ast.ast) list) |
36 -> (string -> (Proof.context -> Ast.ast list -> Ast.ast) list) |
37 -> (string -> (string -> string * int) option) -> Ast.ast -> Pretty.T |
37 -> (string -> (string -> string * int) option) -> Ast.ast -> Pretty.T list |
38 end; |
38 end; |
39 |
39 |
40 structure Printer: PRINTER = |
40 structure Printer: PRINTER = |
41 struct |
41 struct |
42 |
42 |
200 (* xprod_to_fmt *) |
201 (* xprod_to_fmt *) |
201 |
202 |
202 fun xprod_to_fmt (SynExt.XProd (_, _, "", _)) = NONE |
203 fun xprod_to_fmt (SynExt.XProd (_, _, "", _)) = NONE |
203 | xprod_to_fmt (SynExt.XProd (_, xsymbs, const, pri)) = |
204 | xprod_to_fmt (SynExt.XProd (_, xsymbs, const, pri)) = |
204 let |
205 let |
205 fun cons_str s (String s' :: syms) = String (s ^ s') :: syms |
|
206 | cons_str s syms = String s :: syms; |
|
207 |
|
208 fun arg (s, p) = |
206 fun arg (s, p) = |
209 (if s = "type" then TypArg else Arg) |
207 (if s = "type" then TypArg else Arg) |
210 (if Lexicon.is_terminal s then SynExt.max_pri else p); |
208 (if Lexicon.is_terminal s then SynExt.max_pri else p); |
211 |
209 |
212 fun xsyms_to_syms (SynExt.Delim s :: xsyms) = |
210 fun xsyms_to_syms (SynExt.Delim s :: xsyms) = |
213 apfst (cons_str s) (xsyms_to_syms xsyms) |
211 apfst (cons (String s)) (xsyms_to_syms xsyms) |
214 | xsyms_to_syms (SynExt.Argument s_p :: xsyms) = |
212 | xsyms_to_syms (SynExt.Argument s_p :: xsyms) = |
215 apfst (cons (arg s_p)) (xsyms_to_syms xsyms) |
213 apfst (cons (arg s_p)) (xsyms_to_syms xsyms) |
216 | xsyms_to_syms (SynExt.Space s :: xsyms) = |
214 | xsyms_to_syms (SynExt.Space s :: xsyms) = |
217 apfst (cons_str s) (xsyms_to_syms xsyms) |
215 apfst (cons (Space s)) (xsyms_to_syms xsyms) |
218 | xsyms_to_syms (SynExt.Bg i :: xsyms) = |
216 | xsyms_to_syms (SynExt.Bg i :: xsyms) = |
219 let |
217 let |
220 val (bsyms, xsyms') = xsyms_to_syms xsyms; |
218 val (bsyms, xsyms') = xsyms_to_syms xsyms; |
221 val (syms, xsyms'') = xsyms_to_syms xsyms'; |
219 val (syms, xsyms'') = xsyms_to_syms xsyms'; |
222 in |
220 in |
281 val appT = |
282 val appT = |
282 if type_mode then TypeExt.tappl_ast_tr' |
283 if type_mode then TypeExt.tappl_ast_tr' |
283 else if curried then SynTrans.applC_ast_tr' |
284 else if curried then SynTrans.applC_ast_tr' |
284 else SynTrans.appl_ast_tr'; |
285 else SynTrans.appl_ast_tr'; |
285 |
286 |
286 fun synT ([], args) = ([], args) |
287 fun synT _ ([], args) = ([], args) |
287 | synT (Arg p :: symbs, t :: args) = |
288 | synT markup (Arg p :: symbs, t :: args) = |
288 let val (Ts, args') = synT (symbs, args); |
289 let val (Ts, args') = synT markup (symbs, args); |
289 in (astT (t, p) @ Ts, args') end |
290 in (astT (t, p) @ Ts, args') end |
290 | synT (TypArg p :: symbs, t :: args) = |
291 | synT markup (TypArg p :: symbs, t :: args) = |
291 let |
292 let |
292 val (Ts, args') = synT (symbs, args); |
293 val (Ts, args') = synT markup (symbs, args); |
293 in |
294 in |
294 if type_mode then (astT (t, p) @ Ts, args') |
295 if type_mode then (astT (t, p) @ Ts, args') |
295 else (pretty I ctxt tabs trf tokentrf true curried t p @ Ts, args') |
296 else (pretty I ctxt tabs trf tokentrf true curried t p @ Ts, args') |
296 end |
297 end |
297 | synT (String s :: symbs, args) = |
298 | synT markup (String s :: symbs, args) = |
298 let val (Ts, args') = synT (symbs, args); |
299 let val (Ts, args') = synT markup (symbs, args); |
|
300 in (markup (Pretty.str s) :: Ts, args') end |
|
301 | synT markup (Space s :: symbs, args) = |
|
302 let val (Ts, args') = synT markup (symbs, args); |
299 in (Pretty.str s :: Ts, args') end |
303 in (Pretty.str s :: Ts, args') end |
300 | synT (Block (i, bsymbs) :: symbs, args) = |
304 | synT markup (Block (i, bsymbs) :: symbs, args) = |
301 let |
305 let |
302 val (bTs, args') = synT (bsymbs, args); |
306 val (bTs, args') = synT markup (bsymbs, args); |
303 val (Ts, args'') = synT (symbs, args'); |
307 val (Ts, args'') = synT markup (symbs, args'); |
304 val T = |
308 val T = |
305 if i < 0 then Pretty.unbreakable (Pretty.block bTs) |
309 if i < 0 then Pretty.unbreakable (Pretty.block bTs) |
306 else Pretty.blk (i, bTs); |
310 else Pretty.blk (i, bTs); |
307 in (T :: Ts, args'') end |
311 in (T :: Ts, args'') end |
308 | synT (Break i :: symbs, args) = |
312 | synT markup (Break i :: symbs, args) = |
309 let |
313 let |
310 val (Ts, args') = synT (symbs, args); |
314 val (Ts, args') = synT markup (symbs, args); |
311 val T = if i < 0 then Pretty.fbrk else Pretty.brk i; |
315 val T = if i < 0 then Pretty.fbrk else Pretty.brk i; |
312 in (T :: Ts, args') end |
316 in (T :: Ts, args') end |
313 | synT (_ :: _, []) = sys_error "synT" |
317 | synT _ (_ :: _, []) = sys_error "synT" |
314 |
318 |
315 and parT (pr, args, p, p': int) = #1 (synT |
319 and parT markup (pr, args, p, p': int) = #1 (synT markup |
316 (if p > p' orelse |
320 (if p > p' orelse |
317 (! show_brackets andalso p' <> SynExt.max_pri andalso not (is_chain pr)) |
321 (! show_brackets andalso p' <> SynExt.max_pri andalso not (is_chain pr)) |
318 then [Block (1, String "(" :: pr @ [String ")"])] |
322 then [Block (1, Space "(" :: pr @ [Space ")"])] |
319 else pr, args)) |
323 else pr, args)) |
320 |
324 |
321 and atomT a = |
325 and atomT a = |
322 (case try (unprefix Lexicon.constN) a of |
326 (case try (unprefix Lexicon.constN) a of |
323 SOME c => Pretty.str (extern_const c) |
327 SOME c => const_markup c (Pretty.str (extern_const c)) |
324 | NONE => |
328 | NONE => |
325 (case try (unprefix Lexicon.fixedN) a of |
329 (case try (unprefix Lexicon.fixedN) a of |
326 SOME x => |
330 SOME x => |
327 (case tokentrf "_free" of |
331 (case tokentrf "_free" of |
328 SOME f => Pretty.raw_str (f x) |
332 SOME f => Pretty.raw_str (f x) |
338 | splitT _ _ = sys_error "splitT" |
342 | splitT _ _ = sys_error "splitT" |
339 |
343 |
340 and combT (tup as (c, a, args, p)) = |
344 and combT (tup as (c, a, args, p)) = |
341 let |
345 let |
342 val nargs = length args; |
346 val nargs = length args; |
|
347 val markup = const_markup (unprefix Lexicon.constN a) |
|
348 handle Fail _ => I; |
343 |
349 |
344 (*find matching table entry, or print as prefix / postfix*) |
350 (*find matching table entry, or print as prefix / postfix*) |
345 fun prnt ([], []) = prefixT tup |
351 fun prnt ([], []) = prefixT tup |
346 | prnt ([], tb :: tbs) = prnt (Symtab.lookup_list tb a, tbs) |
352 | prnt ([], tb :: tbs) = prnt (Symtab.lookup_list tb a, tbs) |
347 | prnt ((pr, n, p') :: prnps, tbs) = |
353 | prnt ((pr, n, p') :: prnps, tbs) = |
348 if nargs = n then parT (pr, args, p, p') |
354 if nargs = n then parT markup (pr, args, p, p') |
349 else if nargs > n andalso not type_mode then |
355 else if nargs > n andalso not type_mode then |
350 astT (appT (splitT n ([c], args)), p) |
356 astT (appT (splitT n ([c], args)), p) |
351 else prnt (prnps, tbs); |
357 else prnt (prnps, tbs); |
352 in |
358 in |
353 (case token_trans a args of (*try token translation function*) |
359 (case token_trans a args of (*try token translation function*) |