src/Pure/General/xml_data.ML
author wenzelm
Fri, 17 Dec 2010 20:21:35 +0100
changeset 41253 42f24340ae53
parent 38269 cd6906d9199f
child 43698 91c4d7397f0e
permissions -rw-r--r--
more explicit references to structure Raw_Simplifier;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38266
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/General/xml_data.ML
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
     3
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
     4
XML as basic data representation language.
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
     5
*)
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
     6
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
     7
signature XML_DATA =
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
     8
sig
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
     9
  exception XML_ATOM of string
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    10
  exception XML_BODY of XML.body
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    11
  val make_properties: Properties.T -> XML.body
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    12
  val dest_properties: XML.body -> Properties.T
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    13
  val make_string: string -> XML.body
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    14
  val dest_string : XML.body -> string
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    15
  val make_int: int -> XML.body
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    16
  val dest_int : XML.body -> int
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    17
  val make_bool: bool -> XML.body
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    18
  val dest_bool: XML.body -> bool
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    19
  val make_unit: unit -> XML.body
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    20
  val dest_unit: XML.body -> unit
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    21
  val make_pair: ('a -> XML.body) -> ('b -> XML.body) -> 'a * 'b -> XML.body
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    22
  val dest_pair: (XML.body -> 'a) -> (XML.body -> 'b) -> XML.body -> 'a * 'b
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    23
  val make_triple:
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    24
    ('a -> XML.body) -> ('b -> XML.body) -> ('c -> XML.body) -> 'a * 'b * 'c -> XML.body
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    25
  val dest_triple:
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    26
    (XML.body -> 'a) -> (XML.body -> 'b) -> (XML.body -> 'c) -> XML.body -> 'a * 'b * 'c
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    27
  val make_list: ('a -> XML.body) -> 'a list -> XML.body
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    28
  val dest_list: (XML.body -> 'a) -> XML.body -> 'a list
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    29
  val make_option: ('a -> XML.body) -> 'a option -> XML.body
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    30
  val dest_option: (XML.body -> 'a) -> XML.body -> 'a option
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    31
end;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    32
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    33
structure XML_Data: XML_DATA =
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    34
struct
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    35
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    36
(* basic values *)
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    37
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    38
exception XML_ATOM of string;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    39
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    40
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    41
fun make_int_atom i = signed_string_of_int i;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    42
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    43
fun dest_int_atom s =
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    44
  (case Int.fromString s of
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    45
    SOME i => i
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    46
  | NONE => raise XML_ATOM s);
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    47
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    48
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    49
fun make_bool_atom false = "0"
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    50
  | make_bool_atom true = "1";
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    51
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    52
fun dest_bool_atom "0" = false
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    53
  | dest_bool_atom "1" = true
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    54
  | dest_bool_atom s = raise XML_ATOM s;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    55
38267
e50c283dd125 type XML.Body as basic data representation language (Scala version);
wenzelm
parents: 38266
diff changeset
    56
38266
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    57
fun make_unit_atom () = "";
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    58
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    59
fun dest_unit_atom "" = ()
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    60
  | dest_unit_atom s = raise XML_ATOM s;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    61
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    62
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    63
(* structural nodes *)
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    64
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    65
exception XML_BODY of XML.tree list;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    66
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    67
fun make_node ts = XML.Elem ((":", []), ts);
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    68
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    69
fun dest_node (XML.Elem ((":", []), ts)) = ts
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    70
  | dest_node t = raise XML_BODY [t];
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    71
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    72
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    73
(* representation of standard types *)
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    74
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    75
fun make_properties props = [XML.Elem ((":", props), [])];
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    76
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    77
fun dest_properties [XML.Elem ((":", props), [])] = props
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    78
  | dest_properties ts = raise XML_BODY ts;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    79
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    80
38269
cd6906d9199f proper handling of empty text;
wenzelm
parents: 38267
diff changeset
    81
fun make_string "" = []
cd6906d9199f proper handling of empty text;
wenzelm
parents: 38267
diff changeset
    82
  | make_string s = [XML.Text s];
38266
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    83
38269
cd6906d9199f proper handling of empty text;
wenzelm
parents: 38267
diff changeset
    84
fun dest_string [] = ""
cd6906d9199f proper handling of empty text;
wenzelm
parents: 38267
diff changeset
    85
  | dest_string [XML.Text s] = s
38266
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    86
  | dest_string ts = raise XML_BODY ts;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    87
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    88
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    89
val make_int = make_string o make_int_atom;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    90
val dest_int = dest_int_atom o dest_string;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    91
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    92
val make_bool = make_string o make_bool_atom;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    93
val dest_bool = dest_bool_atom o dest_string;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    94
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    95
val make_unit = make_string o make_unit_atom;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    96
val dest_unit = dest_unit_atom o dest_string;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    97
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    98
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
    99
fun make_pair make1 make2 (x, y) = [make_node (make1 x), make_node (make2 y)];
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   100
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   101
fun dest_pair dest1 dest2 [t1, t2] = (dest1 (dest_node t1), dest2 (dest_node t2))
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   102
  | dest_pair _ _ ts = raise XML_BODY ts;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   103
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   104
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   105
fun make_triple make1 make2 make3 (x, y, z) =
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   106
  [make_node (make1 x), make_node (make2 y), make_node (make3 z)];
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   107
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   108
fun dest_triple dest1 dest2 dest3 [t1, t2, t3] =
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   109
      (dest1 (dest_node t1), dest2 (dest_node t2), dest3 (dest_node t3))
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   110
  | dest_triple _ _ _ ts = raise XML_BODY ts;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   111
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   112
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   113
fun make_list make xs = map (make_node o make) xs;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   114
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   115
fun dest_list dest ts = map (dest o dest_node) ts;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   116
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   117
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   118
fun make_option make NONE = make_list make []
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   119
  | make_option make (SOME x) = make_list make [x];
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   120
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   121
fun dest_option dest ts =
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   122
  (case dest_list dest ts of
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   123
    [] => NONE
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   124
  | [x] => SOME x
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   125
  | _ => raise XML_BODY ts);
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   126
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   127
end;
492d377ecfe2 type XML.body as basic data representation language;
wenzelm
parents:
diff changeset
   128