src/Pure/Syntax/printer.ML
changeset 23630 bc22daeed49e
parent 23615 40ab945ef5ff
child 23660 18765718cf62
equal deleted inserted replaced
23629:8a0cbe8f0566 23630:bc22daeed49e
    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 
   186 
   186 
   187 datatype symb =
   187 datatype symb =
   188   Arg of int |
   188   Arg of int |
   189   TypArg of int |
   189   TypArg of int |
   190   String of string |
   190   String of string |
       
   191   Space of string |
   191   Break of int |
   192   Break of int |
   192   Block of int * symb list;
   193   Block of int * symb list;
   193 
   194 
   194 type prtabs = (string * ((symb list * int * int) list) Symtab.table) list;
   195 type prtabs = (string * ((symb list * int * int) list) Symtab.table) list;
   195 
   196 
   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
   228           | xsyms_to_syms [] = ([], []);
   226           | xsyms_to_syms [] = ([], []);
   229 
   227 
   230         fun nargs (Arg _ :: syms) = nargs syms + 1
   228         fun nargs (Arg _ :: syms) = nargs syms + 1
   231           | nargs (TypArg _ :: syms) = nargs syms + 1
   229           | nargs (TypArg _ :: syms) = nargs syms + 1
   232           | nargs (String _ :: syms) = nargs syms
   230           | nargs (String _ :: syms) = nargs syms
       
   231           | nargs (Space _ :: syms) = nargs syms
   233           | nargs (Break _ :: syms) = nargs syms
   232           | nargs (Break _ :: syms) = nargs syms
   234           | nargs (Block (_, bsyms) :: syms) = nargs syms + nargs bsyms
   233           | nargs (Block (_, bsyms) :: syms) = nargs syms + nargs bsyms
   235           | nargs [] = 0;
   234           | nargs [] = 0;
   236       in
   235       in
   237         (case xsyms_to_syms xsymbs of
   236         (case xsyms_to_syms xsymbs of
   265 
   264 
   266 fun is_chain [Block (_, pr)] = is_chain pr
   265 fun is_chain [Block (_, pr)] = is_chain pr
   267   | is_chain [Arg _] = true
   266   | is_chain [Arg _] = true
   268   | is_chain _  = false;
   267   | is_chain _  = false;
   269 
   268 
       
   269 fun const_markup c = Pretty.markup (Markup.const c) o single;
       
   270 
   270 fun pretty extern_const ctxt tabs trf tokentrf type_mode curried ast0 p0 =
   271 fun pretty extern_const ctxt tabs trf tokentrf type_mode curried ast0 p0 =
   271   let
   272   let
   272     val trans = apply_trans ctxt "print ast translation";
   273     val trans = apply_trans ctxt "print ast translation";
   273 
   274 
   274     fun token_trans c [Ast.Variable x] =
   275     fun token_trans c [Ast.Variable x] =
   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*)
   365 
   371 
   366 
   372 
   367 (* pretty_term_ast *)
   373 (* pretty_term_ast *)
   368 
   374 
   369 fun pretty_term_ast extern_const ctxt curried prtabs trf tokentrf ast =
   375 fun pretty_term_ast extern_const ctxt curried prtabs trf tokentrf ast =
   370   Pretty.blk (0, pretty extern_const ctxt (mode_tabs prtabs (! print_mode))
   376   pretty extern_const ctxt (mode_tabs prtabs (! print_mode))
   371     trf tokentrf false curried ast 0);
   377     trf tokentrf false curried ast 0;
   372 
   378 
   373 
   379 
   374 (* pretty_typ_ast *)
   380 (* pretty_typ_ast *)
   375 
   381 
   376 fun pretty_typ_ast ctxt _ prtabs trf tokentrf ast =
   382 fun pretty_typ_ast ctxt _ prtabs trf tokentrf ast =
   377   Pretty.blk (0, pretty I ctxt (mode_tabs prtabs (! print_mode))
   383   pretty I ctxt (mode_tabs prtabs (! print_mode))
   378     trf tokentrf true false ast 0);
   384     trf tokentrf true false ast 0;
   379 
   385 
   380 end;
   386 end;