src/HOL/Tools/string_syntax.ML
author wenzelm
Sat, 23 Dec 2000 22:50:19 +0100
changeset 10732 d4fda7d05ce5
permissions -rw-r--r--
Tools/string_syntax.ML;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10732
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/Tools/string_syntax.ML
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel, TU Muenchen
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
     4
    License:    GPL (GNU GENERAL PUBLIC LICENSE)
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
     5
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
     6
Concrete syntax for hex chars and strings.  Assumes consts and syntax
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
     7
of theory HOL/String.
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
     8
*)
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
     9
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    10
signature STRING_SYNTAX =
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    11
sig
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    12
  val setup: (theory -> theory) list
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    13
end;
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    14
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    15
structure StringSyntax: STRING_SYNTAX =
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    16
struct
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    17
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    18
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    19
(* chars *)
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    20
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    21
fun syntax_xstr x = Syntax.const "_xstr" $ Syntax.free x;
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    22
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    23
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    24
val zero = ord "0";
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    25
val ten = ord "A" - 10;
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    26
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    27
fun mk_nib n =
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    28
  Syntax.const ("H0" ^ chr (n + (if n <= 9 then zero else ten)));
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    29
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    30
fun dest_nib (Const (c, _)) =
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    31
      (case explode c of
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    32
        ["H", "0", h] => ord h - (if h <= "9" then zero else ten)
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    33
      | _ => raise Match)
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    34
  | dest_nib _ = raise Match;
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    35
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    36
fun dest_nibs t1 t2 = chr (dest_nib t1 * 16 + dest_nib t2);
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    37
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    38
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    39
fun mk_char c =
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    40
  Syntax.const "Char" $ mk_nib (ord c div 16) $ mk_nib (ord c mod 16);
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    41
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    42
fun dest_char (Const ("Char", _) $ t1 $ t2) = dest_nibs t1 t2
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    43
  | dest_char _ = raise Match;
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    44
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    45
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    46
fun char_tr (*"_Char"*) [Free (xstr, _)] =
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    47
      (case Syntax.explode_xstr xstr of
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    48
        [c] => mk_char c
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    49
      | _ => error ("Single character expected: " ^ xstr))
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    50
  | char_tr (*"_Char"*) ts = raise TERM ("char_tr", ts);
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    51
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    52
fun char_tr' (*"Char"*) [t1, t2] =
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    53
      Syntax.const "_Char" $ syntax_xstr (Syntax.implode_xstr [dest_nibs t1 t2])
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    54
  | char_tr' (*"Char"*) _ = raise Match;
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    55
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    56
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    57
(* strings *)
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    58
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    59
fun mk_string [] = Syntax.const Syntax.constrainC $ Syntax.const "Nil" $ Syntax.const "string"
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    60
  | mk_string (t :: ts) = Syntax.const "Cons" $ t $ mk_string ts;
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    61
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    62
fun dest_string (Const ("Nil", _)) = []
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    63
  | dest_string (Const ("Cons", _) $ c $ cs) = dest_char c :: dest_string cs
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    64
  | dest_string _ = raise Match;
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    65
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    66
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    67
fun string_tr (*"_String"*) [Free (xstr, _)] =
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    68
      mk_string (map mk_char (Syntax.explode_xstr xstr))
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    69
  | string_tr (*"_String"*) ts = raise TERM ("string_tr", ts);
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    70
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    71
fun cons_tr' (*"Cons"*) [c, cs] =
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    72
      Syntax.const "_String" $
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    73
        syntax_xstr (Syntax.implode_xstr (dest_char c :: dest_string cs))
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    74
  | cons_tr' (*"Cons"*) ts = raise Match;
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    75
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    76
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    77
(* theory setup *)
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    78
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    79
val setup =
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    80
  [Theory.add_trfuns
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    81
    ([], [("_Char", char_tr), ("_String", string_tr)],
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    82
    [("Char", char_tr'), ("Cons", cons_tr')], [])];
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    83
d4fda7d05ce5 Tools/string_syntax.ML;
wenzelm
parents:
diff changeset
    84
end;