| author | wenzelm | 
| Sun, 15 Oct 2023 14:22:37 +0200 | |
| changeset 78782 | c44171d372a1 | 
| parent 73163 | 624c2b98860a | 
| child 80741 | ec1023a5c54c | 
| permissions | -rw-r--r-- | 
| 18 | 1 | (* Title: Pure/Syntax/printer.ML | 
| 0 | 2 | Author: Tobias Nipkow and Markus Wenzel, TU Muenchen | 
| 18 | 3 | |
| 4 | Pretty printing of asts, terms, types and print (ast) translation. | |
| 0 | 5 | *) | 
| 6 | ||
| 42289 
dafae095d733
discontinued special status of structure Printer;
 wenzelm parents: 
42288diff
changeset | 7 | signature BASIC_PRINTER = | 
| 2384 | 8 | sig | 
| 39137 
ccb53edd59f0
turned show_brackets into proper configuration option;
 wenzelm parents: 
39134diff
changeset | 9 | val show_brackets: bool Config.T | 
| 
ccb53edd59f0
turned show_brackets into proper configuration option;
 wenzelm parents: 
39134diff
changeset | 10 | val show_types: bool Config.T | 
| 39134 
917b4b6ba3d2
turned show_sorts/show_types into proper configuration options;
 wenzelm parents: 
39128diff
changeset | 11 | val show_sorts: bool Config.T | 
| 49657 
40e4feac2921
turn constraints into Isabelle_Markup.typing, depending on show_markup options;
 wenzelm parents: 
49655diff
changeset | 12 | val show_markup: bool Config.T | 
| 39127 
e7ecbe86d22e
turned show_structs into proper configuration option;
 wenzelm parents: 
39118diff
changeset | 13 | val show_structs: bool Config.T | 
| 38980 
af73cf0dc31f
turned show_question_marks into proper configuration option;
 wenzelm parents: 
37852diff
changeset | 14 | val show_question_marks: bool Config.T | 
| 40956 | 15 | val pretty_priority: int Config.T | 
| 2384 | 16 | end; | 
| 0 | 17 | |
| 18 | signature PRINTER = | |
| 2384 | 19 | sig | 
| 42289 
dafae095d733
discontinued special status of structure Printer;
 wenzelm parents: 
42288diff
changeset | 20 | include BASIC_PRINTER | 
| 49657 
40e4feac2921
turn constraints into Isabelle_Markup.typing, depending on show_markup options;
 wenzelm parents: 
49655diff
changeset | 21 | val show_markup_default: bool Unsynchronized.ref | 
| 52210 
0226035df99d
more explicit Printer.type_emphasis, depending on show_type_emphasis;
 wenzelm parents: 
52185diff
changeset | 22 | val show_type_emphasis: bool Config.T | 
| 
0226035df99d
more explicit Printer.type_emphasis, depending on show_type_emphasis;
 wenzelm parents: 
52185diff
changeset | 23 | val type_emphasis: Proof.context -> typ -> bool | 
| 2200 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 24 | type prtabs | 
| 69071 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 25 | datatype assoc = No_Assoc | Left_Assoc | Right_Assoc | 
| 69078 
a5e904112ea9
more accurate syntax: e.g. avoid brackets as prefix notation;
 wenzelm parents: 
69077diff
changeset | 26 | val get_prefix: prtabs -> Symtab.key -> string option | 
| 
a5e904112ea9
more accurate syntax: e.g. avoid brackets as prefix notation;
 wenzelm parents: 
69077diff
changeset | 27 | val get_binder: prtabs -> Symtab.key -> string option | 
| 69071 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 28 |   val get_infix: prtabs -> string -> {assoc: assoc, delim: string, pri: int} option
 | 
| 2200 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 29 | val empty_prtabs: prtabs | 
| 42288 
2074b31650e6
discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
 wenzelm parents: 
42284diff
changeset | 30 | val update_prtabs: string -> Syntax_Ext.xprod list -> prtabs -> prtabs | 
| 
2074b31650e6
discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
 wenzelm parents: 
42284diff
changeset | 31 | val remove_prtabs: string -> Syntax_Ext.xprod list -> prtabs -> prtabs | 
| 2200 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 32 | val merge_prtabs: prtabs -> prtabs -> prtabs | 
| 42267 
9566078ad905
simplified printer context: uniform externing and static token translations;
 wenzelm parents: 
42262diff
changeset | 33 | val pretty_term_ast: bool -> Proof.context -> prtabs -> | 
| 42254 | 34 | (string -> Proof.context -> Ast.ast list -> Ast.ast) -> | 
| 49655 | 35 | (string -> Ast.ast list -> Pretty.T option) -> | 
| 42382 
dcd983ee2c29
provide structure Syntax early (before structure Type), back-patch check/uncheck later;
 wenzelm parents: 
42297diff
changeset | 36 | (string -> Markup.T list * string) -> | 
| 42267 
9566078ad905
simplified printer context: uniform externing and static token translations;
 wenzelm parents: 
42262diff
changeset | 37 | Ast.ast -> Pretty.T list | 
| 
9566078ad905
simplified printer context: uniform externing and static token translations;
 wenzelm parents: 
42262diff
changeset | 38 | val pretty_typ_ast: Proof.context -> prtabs -> | 
| 42254 | 39 | (string -> Proof.context -> Ast.ast list -> Ast.ast) -> | 
| 49655 | 40 | (string -> Ast.ast list -> Pretty.T option) -> | 
| 42382 
dcd983ee2c29
provide structure Syntax early (before structure Type), back-patch check/uncheck later;
 wenzelm parents: 
42297diff
changeset | 41 | (string -> Markup.T list * string) -> Ast.ast -> Pretty.T list | 
| 2384 | 42 | end; | 
| 0 | 43 | |
| 2365 | 44 | structure Printer: PRINTER = | 
| 0 | 45 | struct | 
| 2200 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 46 | |
| 0 | 47 | (** options for printing **) | 
| 48 | ||
| 69575 | 49 | val show_brackets = Config.declare_option_bool ("show_brackets", \<^here>);
 | 
| 50 | val show_types = Config.declare_option_bool ("show_types", \<^here>);
 | |
| 51 | val show_sorts = Config.declare_option_bool ("show_sorts", \<^here>);
 | |
| 49657 
40e4feac2921
turn constraints into Isabelle_Markup.typing, depending on show_markup options;
 wenzelm parents: 
49655diff
changeset | 52 | val show_markup_default = Unsynchronized.ref false; | 
| 69575 | 53 | val show_markup = Config.declare_bool ("show_markup", \<^here>) (fn _ => ! show_markup_default);
 | 
| 54 | val show_structs = Config.declare_bool ("show_structs", \<^here>) (K false);
 | |
| 55 | val show_question_marks = Config.declare_option_bool ("show_question_marks", \<^here>);
 | |
| 56 | val show_type_emphasis = Config.declare_bool ("show_type_emphasis", \<^here>) (K true);
 | |
| 52210 
0226035df99d
more explicit Printer.type_emphasis, depending on show_type_emphasis;
 wenzelm parents: 
52185diff
changeset | 57 | |
| 
0226035df99d
more explicit Printer.type_emphasis, depending on show_type_emphasis;
 wenzelm parents: 
52185diff
changeset | 58 | fun type_emphasis ctxt T = | 
| 
0226035df99d
more explicit Printer.type_emphasis, depending on show_type_emphasis;
 wenzelm parents: 
52185diff
changeset | 59 | T <> dummyT andalso | 
| 
0226035df99d
more explicit Printer.type_emphasis, depending on show_type_emphasis;
 wenzelm parents: 
52185diff
changeset | 60 | (Config.get ctxt show_types orelse Config.get ctxt show_markup orelse | 
| 67704 | 61 | Config.get ctxt show_type_emphasis andalso not (is_Type T)); | 
| 49690 
a6814de45b69
more explicit show_type_constraint, show_sort_constraint;
 wenzelm parents: 
49657diff
changeset | 62 | |
| 14837 
827c68f8267c
added pp_show_brackets; support unbreakable blocks;
 wenzelm parents: 
14783diff
changeset | 63 | |
| 0 | 64 | |
| 2200 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 65 | (** type prtabs **) | 
| 0 | 66 | |
| 67 | datatype symb = | |
| 68 | Arg of int | | |
| 69 | TypArg of int | | |
| 49821 
d15fe10593ff
clarified output token markup (see also bc22daeed49e);
 wenzelm parents: 
49690diff
changeset | 70 | String of bool * string | | 
| 0 | 71 | Break of int | | 
| 62789 | 72 | Block of Syntax_Ext.block_info * symb list; | 
| 0 | 73 | |
| 2200 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 74 | type prtabs = (string * ((symb list * int * int) list) Symtab.table) list; | 
| 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 75 | |
| 69071 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 76 | fun mode_tab (prtabs: prtabs) mode = the_default Symtab.empty (AList.lookup (op =) prtabs mode); | 
| 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 77 | fun mode_tabs (prtabs: prtabs) modes = map_filter (AList.lookup (op =) prtabs) (modes @ [""]); | 
| 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 78 | |
| 69078 
a5e904112ea9
more accurate syntax: e.g. avoid brackets as prefix notation;
 wenzelm parents: 
69077diff
changeset | 79 | fun lookup_default prtabs = Symtab.lookup_list (mode_tab prtabs ""); | 
| 
a5e904112ea9
more accurate syntax: e.g. avoid brackets as prefix notation;
 wenzelm parents: 
69077diff
changeset | 80 | |
| 69071 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 81 | |
| 69077 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69071diff
changeset | 82 | (* approximative syntax *) | 
| 69071 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 83 | |
| 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 84 | datatype assoc = No_Assoc | Left_Assoc | Right_Assoc; | 
| 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 85 | |
| 69077 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69071diff
changeset | 86 | local | 
| 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69071diff
changeset | 87 | |
| 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69071diff
changeset | 88 | fun is_arg (Arg _) = true | 
| 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69071diff
changeset | 89 | | is_arg (TypArg _) = true | 
| 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69071diff
changeset | 90 | | is_arg _ = false; | 
| 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69071diff
changeset | 91 | |
| 69071 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 92 | fun is_space str = forall_string (fn s => s = " ") str; | 
| 69077 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69071diff
changeset | 93 | |
| 69079 
fedacfd60fdb
more liberal: detect free-form infixes as well, e.g. Orderings.ord_class.less_eq;
 wenzelm parents: 
69078diff
changeset | 94 | fun clean symbs = symbs |> maps | 
| 
fedacfd60fdb
more liberal: detect free-form infixes as well, e.g. Orderings.ord_class.less_eq;
 wenzelm parents: 
69078diff
changeset | 95 | (fn Block (_, body) => clean body | 
| 
fedacfd60fdb
more liberal: detect free-form infixes as well, e.g. Orderings.ord_class.less_eq;
 wenzelm parents: 
69078diff
changeset | 96 | | symb as String (_, s) => if is_space s then [] else [symb] | 
| 
fedacfd60fdb
more liberal: detect free-form infixes as well, e.g. Orderings.ord_class.less_eq;
 wenzelm parents: 
69078diff
changeset | 97 | | symb => if is_arg symb then [symb] else []); | 
| 69077 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69071diff
changeset | 98 | |
| 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69071diff
changeset | 99 | in | 
| 69071 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 100 | |
| 69078 
a5e904112ea9
more accurate syntax: e.g. avoid brackets as prefix notation;
 wenzelm parents: 
69077diff
changeset | 101 | fun get_prefix prtabs c = | 
| 
a5e904112ea9
more accurate syntax: e.g. avoid brackets as prefix notation;
 wenzelm parents: 
69077diff
changeset | 102 | lookup_default prtabs c | 
| 
a5e904112ea9
more accurate syntax: e.g. avoid brackets as prefix notation;
 wenzelm parents: 
69077diff
changeset | 103 | |> get_first (fn (symbs, _, _) => | 
| 69079 
fedacfd60fdb
more liberal: detect free-form infixes as well, e.g. Orderings.ord_class.less_eq;
 wenzelm parents: 
69078diff
changeset | 104 | (case clean symbs of | 
| 69078 
a5e904112ea9
more accurate syntax: e.g. avoid brackets as prefix notation;
 wenzelm parents: 
69077diff
changeset | 105 | String (_, d) :: rest => if forall is_arg rest then SOME d else NONE | 
| 
a5e904112ea9
more accurate syntax: e.g. avoid brackets as prefix notation;
 wenzelm parents: 
69077diff
changeset | 106 | | _ => NONE)); | 
| 
a5e904112ea9
more accurate syntax: e.g. avoid brackets as prefix notation;
 wenzelm parents: 
69077diff
changeset | 107 | |
| 
a5e904112ea9
more accurate syntax: e.g. avoid brackets as prefix notation;
 wenzelm parents: 
69077diff
changeset | 108 | fun get_binder prtabs c = | 
| 
a5e904112ea9
more accurate syntax: e.g. avoid brackets as prefix notation;
 wenzelm parents: 
69077diff
changeset | 109 | lookup_default prtabs (Mixfix.binder_name c) | 
| 
a5e904112ea9
more accurate syntax: e.g. avoid brackets as prefix notation;
 wenzelm parents: 
69077diff
changeset | 110 | |> get_first (fn (symbs, _, _) => | 
| 69079 
fedacfd60fdb
more liberal: detect free-form infixes as well, e.g. Orderings.ord_class.less_eq;
 wenzelm parents: 
69078diff
changeset | 111 | (case clean symbs of | 
| 
fedacfd60fdb
more liberal: detect free-form infixes as well, e.g. Orderings.ord_class.less_eq;
 wenzelm parents: 
69078diff
changeset | 112 | String (_, d) :: _ => SOME d | 
| 69078 
a5e904112ea9
more accurate syntax: e.g. avoid brackets as prefix notation;
 wenzelm parents: 
69077diff
changeset | 113 | | _ => NONE)); | 
| 
a5e904112ea9
more accurate syntax: e.g. avoid brackets as prefix notation;
 wenzelm parents: 
69077diff
changeset | 114 | |
| 69071 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 115 | fun get_infix prtabs c = | 
| 69078 
a5e904112ea9
more accurate syntax: e.g. avoid brackets as prefix notation;
 wenzelm parents: 
69077diff
changeset | 116 | lookup_default prtabs c | 
| 69071 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 117 | |> map_filter (fn (symbs, _, p) => | 
| 69079 
fedacfd60fdb
more liberal: detect free-form infixes as well, e.g. Orderings.ord_class.less_eq;
 wenzelm parents: 
69078diff
changeset | 118 | (case clean symbs of | 
| 
fedacfd60fdb
more liberal: detect free-form infixes as well, e.g. Orderings.ord_class.less_eq;
 wenzelm parents: 
69078diff
changeset | 119 | [Arg p1, String (_, d), Arg p2] => SOME (p1, p2, d, p) | 
| 
fedacfd60fdb
more liberal: detect free-form infixes as well, e.g. Orderings.ord_class.less_eq;
 wenzelm parents: 
69078diff
changeset | 120 | | [TypArg p1, String (_, d), TypArg p2] => SOME (p1, p2, d, p) | 
| 69071 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 121 | | _ => NONE)) | 
| 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 122 | |> get_first (fn (p1, p2, d, p) => | 
| 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 123 |       if p1 = p + 1 andalso p2 = p + 1 then SOME {assoc = No_Assoc, delim = d, pri = p}
 | 
| 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 124 |       else if p1 = p andalso p2 = p + 1 then SOME {assoc = Left_Assoc, delim = d, pri = p}
 | 
| 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 125 |       else if p1 = p + 1 andalso p2 = p then SOME {assoc = Right_Assoc, delim = d, pri = p}
 | 
| 
3ef82592dc22
clarified get_infix: avoid old ASCII input syntax;
 wenzelm parents: 
67704diff
changeset | 126 | else NONE); | 
| 2200 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 127 | |
| 69077 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69071diff
changeset | 128 | end; | 
| 
11529ae45786
more approximative prefix syntax, including binder;
 wenzelm parents: 
69071diff
changeset | 129 | |
| 18 | 130 | |
| 3816 | 131 | (* xprod_to_fmt *) | 
| 237 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 132 | |
| 42288 
2074b31650e6
discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
 wenzelm parents: 
42284diff
changeset | 133 | fun xprod_to_fmt (Syntax_Ext.XProd (_, _, "", _)) = NONE | 
| 
2074b31650e6
discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
 wenzelm parents: 
42284diff
changeset | 134 | | xprod_to_fmt (Syntax_Ext.XProd (_, xsymbs, const, pri)) = | 
| 237 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 135 | let | 
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 136 | fun arg (s, p) = | 
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 137 | (if s = "type" then TypArg else Arg) | 
| 42297 
140f283266b7
discontinued Syntax.max_pri, which is not really a symbolic parameter;
 wenzelm parents: 
42289diff
changeset | 138 | (if Lexicon.is_terminal s then 1000 else p); | 
| 237 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 139 | |
| 42288 
2074b31650e6
discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
 wenzelm parents: 
42284diff
changeset | 140 | fun xsyms_to_syms (Syntax_Ext.Delim s :: xsyms) = | 
| 73163 
624c2b98860a
suppress markup for literal tokens with block control symbols, for better PIDE/HTML output (see also d15fe10593ff);
 wenzelm parents: 
69575diff
changeset | 141 | apfst (cons (String (not (Lexicon.suppress_literal_markup s), s))) | 
| 49821 
d15fe10593ff
clarified output token markup (see also bc22daeed49e);
 wenzelm parents: 
49690diff
changeset | 142 | (xsyms_to_syms xsyms) | 
| 42288 
2074b31650e6
discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
 wenzelm parents: 
42284diff
changeset | 143 | | xsyms_to_syms (Syntax_Ext.Argument s_p :: xsyms) = | 
| 237 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 144 | apfst (cons (arg s_p)) (xsyms_to_syms xsyms) | 
| 42288 
2074b31650e6
discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
 wenzelm parents: 
42284diff
changeset | 145 | | xsyms_to_syms (Syntax_Ext.Space s :: xsyms) = | 
| 49821 
d15fe10593ff
clarified output token markup (see also bc22daeed49e);
 wenzelm parents: 
49690diff
changeset | 146 | apfst (cons (String (false, s))) (xsyms_to_syms xsyms) | 
| 62783 | 147 | | xsyms_to_syms (Syntax_Ext.Bg info :: xsyms) = | 
| 237 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 148 | let | 
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 149 | val (bsyms, xsyms') = xsyms_to_syms xsyms; | 
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 150 | val (syms, xsyms'') = xsyms_to_syms xsyms'; | 
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 151 | in | 
| 62783 | 152 | (Block (info, bsyms) :: syms, xsyms'') | 
| 237 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 153 | end | 
| 42288 
2074b31650e6
discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
 wenzelm parents: 
42284diff
changeset | 154 | | xsyms_to_syms (Syntax_Ext.Brk i :: xsyms) = | 
| 237 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 155 | apfst (cons (Break i)) (xsyms_to_syms xsyms) | 
| 42288 
2074b31650e6
discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
 wenzelm parents: 
42284diff
changeset | 156 | | xsyms_to_syms (Syntax_Ext.En :: xsyms) = ([], xsyms) | 
| 237 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 157 | | xsyms_to_syms [] = ([], []); | 
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 158 | |
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 159 | fun nargs (Arg _ :: syms) = nargs syms + 1 | 
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 160 | | nargs (TypArg _ :: syms) = nargs syms + 1 | 
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 161 | | nargs (String _ :: syms) = nargs syms | 
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 162 | | nargs (Break _ :: syms) = nargs syms | 
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 163 | | nargs (Block (_, bsyms) :: syms) = nargs syms + nargs bsyms | 
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 164 | | nargs [] = 0; | 
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 165 | in | 
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 166 | (case xsyms_to_syms xsymbs of | 
| 15531 | 167 | (symbs, []) => SOME (const, (symbs, nargs symbs, pri)) | 
| 37852 
a902f158b4fc
eliminated old-style sys_error/SYS_ERROR in favour of exception Fail -- after careful checking that there is no overlap with existing handling of that;
 wenzelm parents: 
37216diff
changeset | 168 | | _ => raise Fail "Unbalanced pretty-printing blocks") | 
| 237 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 169 | end; | 
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 170 | |
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 171 | |
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 172 | (* empty, extend, merge prtabs *) | 
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 173 | |
| 2200 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 174 | val empty_prtabs = []; | 
| 18 | 175 | |
| 25393 
0856e0141062
replaced extend_prtabs by update_prtabs (absorb duplicates);
 wenzelm parents: 
25386diff
changeset | 176 | fun update_prtabs mode xprods prtabs = | 
| 2200 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 177 | let | 
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19374diff
changeset | 178 | val fmts = map_filter xprod_to_fmt xprods; | 
| 25393 
0856e0141062
replaced extend_prtabs by update_prtabs (absorb duplicates);
 wenzelm parents: 
25386diff
changeset | 179 | val tab' = fold (Symtab.update_list (op =)) fmts (mode_tab prtabs mode); | 
| 25386 | 180 | in AList.update (op =) (mode, tab') prtabs end; | 
| 15753 | 181 | |
| 25386 | 182 | fun remove_prtabs mode xprods prtabs = | 
| 183 | let | |
| 184 | val tab = mode_tab prtabs mode; | |
| 42288 
2074b31650e6
discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
 wenzelm parents: 
42284diff
changeset | 185 | val fmts = map_filter (fn xprod as Syntax_Ext.XProd (_, _, c, _) => | 
| 25386 | 186 | if null (Symtab.lookup_list tab c) then NONE | 
| 187 | else xprod_to_fmt xprod) xprods; | |
| 25393 
0856e0141062
replaced extend_prtabs by update_prtabs (absorb duplicates);
 wenzelm parents: 
25386diff
changeset | 188 | val tab' = fold (Symtab.remove_list (op =)) fmts tab; | 
| 
0856e0141062
replaced extend_prtabs by update_prtabs (absorb duplicates);
 wenzelm parents: 
25386diff
changeset | 189 | in AList.update (op =) (mode, tab') prtabs end; | 
| 0 | 190 | |
| 2200 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 191 | fun merge_prtabs prtabs1 prtabs2 = | 
| 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 192 | let | 
| 19046 
bc5c6c9b114e
removed distinct, renamed gen_distinct to distinct;
 wenzelm parents: 
18977diff
changeset | 193 | val modes = distinct (op =) (map fst (prtabs1 @ prtabs2)); | 
| 18957 | 194 | fun merge m = (m, Symtab.merge_list (op =) (mode_tab prtabs1 m, mode_tab prtabs2 m)); | 
| 12292 | 195 | in map merge modes end; | 
| 237 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 196 | |
| 0 | 197 | |
| 198 | ||
| 237 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 199 | (** pretty term or typ asts **) | 
| 0 | 200 | |
| 2200 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 201 | fun is_chain [Block (_, pr)] = is_chain pr | 
| 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 202 | | is_chain [Arg _] = true | 
| 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 203 | | is_chain _ = false; | 
| 506 
e0ca460d6e51
improved show_brackets again - Trueprop does not create () any more.
 nipkow parents: 
505diff
changeset | 204 | |
| 69575 | 205 | val pretty_priority = Config.declare_int ("Syntax.pretty_priority", \<^here>) (K 0);
 | 
| 40956 | 206 | |
| 49655 | 207 | fun pretty type_mode curried ctxt tabs trf markup_trans markup_extern ast0 = | 
| 0 | 208 | let | 
| 39137 
ccb53edd59f0
turned show_brackets into proper configuration option;
 wenzelm parents: 
39134diff
changeset | 209 | val show_brackets = Config.get ctxt show_brackets; | 
| 35429 
afa8cf9e63d8
authentic syntax for classes and type constructors;
 wenzelm parents: 
35262diff
changeset | 210 | |
| 2200 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 211 | (*default applications: prefix / postfix*) | 
| 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 212 | val appT = | 
| 42284 | 213 | if type_mode then Syntax_Trans.tappl_ast_tr' | 
| 214 | else if curried then Syntax_Trans.applC_ast_tr' | |
| 215 | else Syntax_Trans.appl_ast_tr'; | |
| 18 | 216 | |
| 23630 
bc22daeed49e
pretty: markup for syntax/name of authentic consts;
 wenzelm parents: 
23615diff
changeset | 217 | fun synT _ ([], args) = ([], args) | 
| 42267 
9566078ad905
simplified printer context: uniform externing and static token translations;
 wenzelm parents: 
42262diff
changeset | 218 | | synT m (Arg p :: symbs, t :: args) = | 
| 
9566078ad905
simplified printer context: uniform externing and static token translations;
 wenzelm parents: 
42262diff
changeset | 219 | let val (Ts, args') = synT m (symbs, args); | 
| 0 | 220 | in (astT (t, p) @ Ts, args') end | 
| 42267 
9566078ad905
simplified printer context: uniform externing and static token translations;
 wenzelm parents: 
42262diff
changeset | 221 | | synT m (TypArg p :: symbs, t :: args) = | 
| 237 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 222 | let | 
| 42267 
9566078ad905
simplified printer context: uniform externing and static token translations;
 wenzelm parents: 
42262diff
changeset | 223 | val (Ts, args') = synT m (symbs, args); | 
| 237 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 224 | in | 
| 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 225 | if type_mode then (astT (t, p) @ Ts, args') | 
| 40956 | 226 | else | 
| 42267 
9566078ad905
simplified printer context: uniform externing and static token translations;
 wenzelm parents: 
42262diff
changeset | 227 | (pretty true curried (Config.put pretty_priority p ctxt) | 
| 49655 | 228 | tabs trf markup_trans markup_extern t @ Ts, args') | 
| 237 
a7d3e712767a
MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
 wenzelm parents: 
62diff
changeset | 229 | end | 
| 49821 
d15fe10593ff
clarified output token markup (see also bc22daeed49e);
 wenzelm parents: 
49690diff
changeset | 230 | | synT m (String (do_mark, s) :: symbs, args) = | 
| 47850 
c638127b4653
avoid interference of markup for literal tokens, which may contain slightly odd \<^bsub> \<^esub> counted as pseudo-markup (especially relevant for HTML output, e.g. of thm power3_eq_cube);
 wenzelm parents: 
42382diff
changeset | 231 | let | 
| 
c638127b4653
avoid interference of markup for literal tokens, which may contain slightly odd \<^bsub> \<^esub> counted as pseudo-markup (especially relevant for HTML output, e.g. of thm power3_eq_cube);
 wenzelm parents: 
42382diff
changeset | 232 | val (Ts, args') = synT m (symbs, args); | 
| 
c638127b4653
avoid interference of markup for literal tokens, which may contain slightly odd \<^bsub> \<^esub> counted as pseudo-markup (especially relevant for HTML output, e.g. of thm power3_eq_cube);
 wenzelm parents: 
42382diff
changeset | 233 | val T = | 
| 49821 
d15fe10593ff
clarified output token markup (see also bc22daeed49e);
 wenzelm parents: 
49690diff
changeset | 234 | if do_mark | 
| 73163 
624c2b98860a
suppress markup for literal tokens with block control symbols, for better PIDE/HTML output (see also d15fe10593ff);
 wenzelm parents: 
69575diff
changeset | 235 | then Pretty.marks_str (m @ Lexicon.literal_markup s, s) | 
| 49821 
d15fe10593ff
clarified output token markup (see also bc22daeed49e);
 wenzelm parents: 
49690diff
changeset | 236 | else Pretty.str s; | 
| 47850 
c638127b4653
avoid interference of markup for literal tokens, which may contain slightly odd \<^bsub> \<^esub> counted as pseudo-markup (especially relevant for HTML output, e.g. of thm power3_eq_cube);
 wenzelm parents: 
42382diff
changeset | 237 | in (T :: Ts, args') end | 
| 62789 | 238 |       | synT m (Block ({markup, consistent, unbreakable, indent}, bsymbs) :: symbs, args) =
 | 
| 0 | 239 | let | 
| 42267 
9566078ad905
simplified printer context: uniform externing and static token translations;
 wenzelm parents: 
42262diff
changeset | 240 | val (bTs, args') = synT m (bsymbs, args); | 
| 
9566078ad905
simplified printer context: uniform externing and static token translations;
 wenzelm parents: 
42262diff
changeset | 241 | val (Ts, args'') = synT m (symbs, args'); | 
| 62789 | 242 | val T = | 
| 243 |               Pretty.markup_block {markup = markup, consistent = consistent, indent = indent} bTs
 | |
| 244 | |> unbreakable ? Pretty.unbreakable; | |
| 14837 
827c68f8267c
added pp_show_brackets; support unbreakable blocks;
 wenzelm parents: 
14783diff
changeset | 245 | in (T :: Ts, args'') end | 
| 42267 
9566078ad905
simplified printer context: uniform externing and static token translations;
 wenzelm parents: 
42262diff
changeset | 246 | | synT m (Break i :: symbs, args) = | 
| 14837 
827c68f8267c
added pp_show_brackets; support unbreakable blocks;
 wenzelm parents: 
14783diff
changeset | 247 | let | 
| 42267 
9566078ad905
simplified printer context: uniform externing and static token translations;
 wenzelm parents: 
42262diff
changeset | 248 | val (Ts, args') = synT m (symbs, args); | 
| 14837 
827c68f8267c
added pp_show_brackets; support unbreakable blocks;
 wenzelm parents: 
14783diff
changeset | 249 | val T = if i < 0 then Pretty.fbrk else Pretty.brk i; | 
| 
827c68f8267c
added pp_show_brackets; support unbreakable blocks;
 wenzelm parents: 
14783diff
changeset | 250 | in (T :: Ts, args') end | 
| 0 | 251 | |
| 42297 
140f283266b7
discontinued Syntax.max_pri, which is not really a symbolic parameter;
 wenzelm parents: 
42289diff
changeset | 252 | and parT m (pr, args, p, p': int) = #1 (synT m | 
| 62783 | 253 | (if p > p' orelse (show_brackets andalso p' <> 1000 andalso not (is_chain pr)) then | 
| 254 |             [Block (Syntax_Ext.block_indent 1, String (false, "(") :: pr @ [String (false, ")")])]
 | |
| 42288 
2074b31650e6
discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
 wenzelm parents: 
42284diff
changeset | 255 | else pr, args)) | 
| 0 | 256 | |
| 42267 
9566078ad905
simplified printer context: uniform externing and static token translations;
 wenzelm parents: 
42262diff
changeset | 257 | and atomT a = Pretty.marks_str (markup_extern a) | 
| 19374 
ae4a225e0c1f
pretty: late externing of consts (support authentic syntax);
 wenzelm parents: 
19046diff
changeset | 258 | |
| 
ae4a225e0c1f
pretty: late externing of consts (support authentic syntax);
 wenzelm parents: 
19046diff
changeset | 259 | and prefixT (_, a, [], _) = [atomT a] | 
| 16611 
edb368e2878f
proper treatment of advanced trfuns: pass thy argument;
 wenzelm parents: 
15973diff
changeset | 260 | | prefixT (c, _, args, p) = astT (appT (c, args), p) | 
| 0 | 261 | |
| 18 | 262 | and splitT 0 ([x], ys) = (x, ys) | 
| 5691 | 263 | | splitT 0 (rev_xs, ys) = (Ast.Appl (rev rev_xs), ys) | 
| 18 | 264 | | splitT n (rev_xs, y :: ys) = splitT (n - 1) (y :: rev_xs, ys) | 
| 265 | ||
| 0 | 266 | and combT (tup as (c, a, args, p)) = | 
| 267 | let | |
| 268 | val nargs = length args; | |
| 18 | 269 | |
| 2701 | 270 | (*find matching table entry, or print as prefix / postfix*) | 
| 6280 | 271 | fun prnt ([], []) = prefixT tup | 
| 18957 | 272 | | prnt ([], tb :: tbs) = prnt (Symtab.lookup_list tb a, tbs) | 
| 6280 | 273 | | prnt ((pr, n, p') :: prnps, tbs) = | 
| 42267 
9566078ad905
simplified printer context: uniform externing and static token translations;
 wenzelm parents: 
42262diff
changeset | 274 | if nargs = n then parT (#1 (markup_extern a)) (pr, args, p, p') | 
| 2200 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 275 | else if nargs > n andalso not type_mode then | 
| 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 276 | astT (appT (splitT n ([c], args)), p) | 
| 6280 | 277 | else prnt (prnps, tbs); | 
| 2200 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 278 | in | 
| 49655 | 279 | (case markup_trans a args of | 
| 26707 
ddf6bab64b96
token translations: context dependent, result Pretty.T;
 wenzelm parents: 
25393diff
changeset | 280 | SOME prt => [prt] | 
| 42254 | 281 | | NONE => astT (trf a ctxt args, p) handle Match => prnt ([], tabs)) | 
| 2200 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 282 | end | 
| 
2538977e94fa
added print_mode: string list ref (order of printer tables);
 wenzelm parents: 
1509diff
changeset | 283 | |
| 5691 | 284 | and astT (c as Ast.Constant a, p) = combT (c, a, [], p) | 
| 42267 
9566078ad905
simplified printer context: uniform externing and static token translations;
 wenzelm parents: 
42262diff
changeset | 285 | | astT (ast as Ast.Variable _, _) = [Ast.pretty_ast ast] | 
| 6280 | 286 | | astT (Ast.Appl ((c as Ast.Constant a) :: (args as _ :: _)), p) = combT (c, a, args, p) | 
| 5691 | 287 | | astT (Ast.Appl (f :: (args as _ :: _)), p) = astT (appT (f, args), p) | 
| 288 |       | astT (ast as Ast.Appl _, _) = raise Ast.AST ("pretty: malformed ast", [ast]);
 | |
| 40956 | 289 | in astT (ast0, Config.get ctxt pretty_priority) end; | 
| 0 | 290 | |
| 291 | ||
| 292 | (* pretty_term_ast *) | |
| 293 | ||
| 49655 | 294 | fun pretty_term_ast curried ctxt prtabs trf markup_trans extern ast = | 
| 295 | pretty false curried ctxt (mode_tabs prtabs (print_mode_value ())) trf markup_trans extern ast; | |
| 0 | 296 | |
| 297 | ||
| 298 | (* pretty_typ_ast *) | |
| 299 | ||
| 49655 | 300 | fun pretty_typ_ast ctxt prtabs trf markup_trans extern ast = | 
| 301 | pretty true false ctxt (mode_tabs prtabs (print_mode_value ())) trf markup_trans extern ast; | |
| 0 | 302 | |
| 303 | end; | |
| 42289 
dafae095d733
discontinued special status of structure Printer;
 wenzelm parents: 
42288diff
changeset | 304 | |
| 
dafae095d733
discontinued special status of structure Printer;
 wenzelm parents: 
42288diff
changeset | 305 | structure Basic_Printer: BASIC_PRINTER = Printer; | 
| 
dafae095d733
discontinued special status of structure Printer;
 wenzelm parents: 
42288diff
changeset | 306 | open Basic_Printer; | 
| 
dafae095d733
discontinued special status of structure Printer;
 wenzelm parents: 
42288diff
changeset | 307 |