src/Pure/Tools/codegen_serializer.ML
changeset 23859 fc44fa554ca8
parent 23809 6104514a1f5f
child 23931 4d82207fb251
equal deleted inserted replaced
23858:5500610fe1e5 23859:fc44fa554ca8
    21   val add_undefined: string -> string -> string -> theory -> theory;
    21   val add_undefined: string -> string -> string -> theory -> theory;
    22   val add_pretty_list: string -> string -> string -> theory -> theory;
    22   val add_pretty_list: string -> string -> string -> theory -> theory;
    23   val add_pretty_list_string: string -> string -> string
    23   val add_pretty_list_string: string -> string -> string
    24     -> string -> string list -> theory -> theory;
    24     -> string -> string list -> theory -> theory;
    25   val add_pretty_char: string -> string -> string list -> theory -> theory
    25   val add_pretty_char: string -> string -> string list -> theory -> theory
    26   val add_pretty_numeral: string -> string * typ -> string -> string -> string
    26   val add_pretty_numeral: string -> bool -> string * typ -> string -> string -> string
    27     -> string -> string -> theory -> theory;
    27     -> string -> string -> theory -> theory;
    28   val add_pretty_ml_string: string -> string -> string list -> string
    28   val add_pretty_ml_string: string -> string -> string list -> string
    29     -> string -> string -> theory -> theory;
    29     -> string -> string -> theory -> theory;
    30   val add_pretty_imperative_monad_bind: string -> string -> theory -> theory;
    30   val add_pretty_imperative_monad_bind: string -> string -> theory -> theory;
    31 
    31 
  1633 local
  1633 local
  1634 
  1634 
  1635 val pretty : (string * {
  1635 val pretty : (string * {
  1636     pretty_char: string -> string,
  1636     pretty_char: string -> string,
  1637     pretty_string: string -> string,
  1637     pretty_string: string -> string,
  1638     pretty_numeral: IntInf.int -> string,
  1638     pretty_numeral: bool -> IntInf.int -> string,
  1639     pretty_list: Pretty.T list -> Pretty.T,
  1639     pretty_list: Pretty.T list -> Pretty.T,
  1640     infix_cons: int * string
  1640     infix_cons: int * string
  1641   }) list = [
  1641   }) list = [
  1642   ("SML", { pretty_char = prefix "#" o quote o ML_Syntax.print_char,
  1642   ("SML", { pretty_char = prefix "#" o quote o ML_Syntax.print_char,
  1643       pretty_string = ML_Syntax.print_string,
  1643       pretty_string = ML_Syntax.print_string,
  1644       pretty_numeral = fn k => "(" ^ IntInf.toString k ^ " : IntInf.int)",
  1644       pretty_numeral = fn unbounded => fn k =>
       
  1645         if unbounded then "(" ^ IntInf.toString k ^ " : IntInf.int)"
       
  1646         else IntInf.toString k,
  1645       pretty_list = Pretty.enum "," "[" "]",
  1647       pretty_list = Pretty.enum "," "[" "]",
  1646       infix_cons = (7, "::")}),
  1648       infix_cons = (7, "::")}),
  1647   ("OCaml", { pretty_char = fn c => enclose "'" "'"
  1649   ("OCaml", { pretty_char = fn c => enclose "'" "'"
  1648         (let val i = ord c
  1650         (let val i = ord c
  1649           in if i < 32 orelse i = 39 orelse i = 92
  1651           in if i < 32 orelse i = 39 orelse i = 92
  1650             then prefix "\\" (string_of_int i)
  1652             then prefix "\\" (string_of_int i)
  1651             else c
  1653             else c
  1652           end),
  1654           end),
  1653       pretty_string = (fn _ => error "OCaml: no pretty strings"),
  1655       pretty_string = (fn _ => error "OCaml: no pretty strings"),
  1654       pretty_numeral = fn k => if k >= IntInf.fromInt 0 then
  1656       pretty_numeral = fn unbounded => fn k => if k >= IntInf.fromInt 0 then
  1655             "(Big_int.big_int_of_int " ^ IntInf.toString k ^ ")"
  1657             if unbounded then
       
  1658               "(Big_int.big_int_of_int " ^ IntInf.toString k ^ ")"
       
  1659             else IntInf.toString k
  1656           else
  1660           else
  1657             "(Big_int.big_int_of_int " ^ (enclose "(" ")" o prefix "-"
  1661             if unbounded then
  1658               o IntInf.toString o op ~) k ^ ")",
  1662               "(Big_int.big_int_of_int " ^ (enclose "(" ")" o prefix "-"
       
  1663                 o IntInf.toString o op ~) k ^ ")"
       
  1664             else (enclose "(" ")" o prefix "-" o IntInf.toString o op ~) k,
  1659       pretty_list = Pretty.enum ";" "[" "]",
  1665       pretty_list = Pretty.enum ";" "[" "]",
  1660       infix_cons = (6, "::")}),
  1666       infix_cons = (6, "::")}),
  1661   ("Haskell", { pretty_char = fn c => enclose "'" "'"
  1667   ("Haskell", { pretty_char = fn c => enclose "'" "'"
  1662         (let val i = ord c
  1668         (let val i = ord c
  1663           in if i < 32 orelse i = 39 orelse i = 92
  1669           in if i < 32 orelse i = 39 orelse i = 92
  1664             then Library.prefix "\\" (string_of_int i)
  1670             then Library.prefix "\\" (string_of_int i)
  1665             else c
  1671             else c
  1666           end),
  1672           end),
  1667       pretty_string = ML_Syntax.print_string,
  1673       pretty_string = ML_Syntax.print_string,
  1668       pretty_numeral = fn k => if k >= IntInf.fromInt 0 then
  1674       pretty_numeral = fn unbounded => fn k => if k >= IntInf.fromInt 0 then
  1669             IntInf.toString k
  1675             IntInf.toString k
  1670           else
  1676           else
  1671             (enclose "(" ")" o Library.prefix "-" o IntInf.toString o IntInf.~) k,
  1677             (enclose "(" ")" o Library.prefix "-" o IntInf.toString o IntInf.~) k,
  1672       pretty_list = Pretty.enum "," "[" "]",
  1678       pretty_list = Pretty.enum "," "[" "]",
  1673       infix_cons = (5, ":")})
  1679       infix_cons = (5, ":")})
  1717       case decode_char c_nibbles (t1, t2)
  1723       case decode_char c_nibbles (t1, t2)
  1718        of SOME c => (str o mk_char) c
  1724        of SOME c => (str o mk_char) c
  1719         | NONE => error "Illegal character expression";
  1725         | NONE => error "Illegal character expression";
  1720   in (2, pretty) end;
  1726   in (2, pretty) end;
  1721 
  1727 
  1722 fun pretty_numeral c_bit0 c_bit1 c_pls c_min c_bit target =
  1728 fun pretty_numeral unbounded c_bit0 c_bit1 c_pls c_min c_bit target =
  1723   let
  1729   let
  1724     val mk_numeral = #pretty_numeral (pr_pretty target);
  1730     val mk_numeral = #pretty_numeral (pr_pretty target);
  1725     fun pretty _ _ _ [(t, _)] =
  1731     fun pretty _ _ _ [(t, _)] =
  1726       case implode_numeral c_bit0 c_bit1 c_pls c_min c_bit t
  1732       case implode_numeral c_bit0 c_bit1 c_pls c_min c_bit t
  1727        of SOME k => (str o mk_numeral) k
  1733        of SOME k => (str o mk_numeral unbounded) k
  1728         | NONE => error "Illegal numeral expression";
  1734         | NONE => error "Illegal numeral expression";
  1729   in (1, pretty) end;
  1735   in (1, pretty) end;
  1730 
  1736 
  1731 fun pretty_ml_string c_char c_nibbles c_nil c_cons target =
  1737 fun pretty_ml_string c_char c_nibbles c_nil c_cons target =
  1732   let
  1738   let
  1992   in
  1998   in
  1993     thy
  1999     thy
  1994     |> add_syntax_const target charr' (SOME pr)
  2000     |> add_syntax_const target charr' (SOME pr)
  1995   end;
  2001   end;
  1996 
  2002 
  1997 fun add_pretty_numeral target number_of b0 b1 pls min bit thy =
  2003 fun add_pretty_numeral target unbounded number_of b0 b1 pls min bit thy =
  1998   let
  2004   let
  1999     val number_of' = CodegenConsts.const_of_cexpr thy number_of;
  2005     val number_of' = CodegenConsts.const_of_cexpr thy number_of;
  2000     val (_, b0'') = idfs_of_const thy b0;
  2006     val (_, b0'') = idfs_of_const thy b0;
  2001     val (_, b1'') = idfs_of_const thy b1;
  2007     val (_, b1'') = idfs_of_const thy b1;
  2002     val (_, pls'') = idfs_of_const thy pls;
  2008     val (_, pls'') = idfs_of_const thy pls;
  2003     val (_, min'') = idfs_of_const thy min;
  2009     val (_, min'') = idfs_of_const thy min;
  2004     val (_, bit'') = idfs_of_const thy bit;
  2010     val (_, bit'') = idfs_of_const thy bit;
  2005     val pr = pretty_numeral b0'' b1'' pls'' min'' bit'' target;
  2011     val pr = pretty_numeral unbounded b0'' b1'' pls'' min'' bit'' target;
  2006   in
  2012   in
  2007     thy
  2013     thy
  2008     |> add_syntax_const target number_of' (SOME pr)
  2014     |> add_syntax_const target number_of' (SOME pr)
  2009   end;
  2015   end;
  2010 
  2016