src/HOL/String.thy
changeset 10732 d4fda7d05ce5
parent 7224 e41e64476f9b
child 10909 2bbb1797bbe2
     1.1 --- a/src/HOL/String.thy	Sat Dec 23 22:49:39 2000 +0100
     1.2 +++ b/src/HOL/String.thy	Sat Dec 23 22:50:19 2000 +0100
     1.3 @@ -1,90 +1,25 @@
     1.4  (*  Title:      HOL/String.thy
     1.5      ID:         $Id$
     1.6 +    Author:     Markus Wenzel, TU Muenchen
     1.7 +    License:    GPL (GNU GENERAL PUBLIC LICENSE)
     1.8  
     1.9  Hex chars and strings.
    1.10  *)
    1.11  
    1.12 -String = List +
    1.13 +theory String = List
    1.14 +files "Tools/string_syntax.ML":
    1.15  
    1.16 -datatype
    1.17 -  nibble = H00 | H01 | H02 | H03 | H04 | H05 | H06 | H07
    1.18 -         | H08 | H09 | H0A | H0B | H0C | H0D | H0E | H0F
    1.19 +datatype nibble =
    1.20 +    H00 | H01 | H02 | H03 | H04 | H05 | H06 | H07
    1.21 +  | H08 | H09 | H0A | H0B | H0C | H0D | H0E | H0F
    1.22  
    1.23 -datatype
    1.24 -  char = Char nibble nibble
    1.25 -
    1.26 -types
    1.27 -  string = char list
    1.28 +datatype char = Char nibble nibble
    1.29 +types string = "char list"
    1.30  
    1.31  syntax
    1.32 -  "_Char"       :: xstr => char       ("CHR _")
    1.33 -  "_String"     :: xstr => string     ("_")
    1.34 +  "_Char" :: "xstr => char"    ("CHR _")
    1.35 +  "_String" :: "xstr => string"    ("_")
    1.36 +
    1.37 +setup StringSyntax.setup
    1.38  
    1.39  end
    1.40 -
    1.41 -
    1.42 -ML
    1.43 -
    1.44 -local
    1.45 -
    1.46 -  (* chars *)
    1.47 -
    1.48 -  fun syntax_xstr x = Syntax.const "_xstr" $ Syntax.free x;
    1.49 -
    1.50 -
    1.51 -  val zero = ord "0";
    1.52 -  val ten = ord "A" - 10;
    1.53 -
    1.54 -  fun mk_nib n =
    1.55 -    Syntax.const ("H0" ^ chr (n + (if n <= 9 then zero else ten)));
    1.56 -
    1.57 -  fun dest_nib (Const (c, _)) =
    1.58 -        (case explode c of
    1.59 -          ["H", "0", h] => ord h - (if h <= "9" then zero else ten)
    1.60 -        | _ => raise Match)
    1.61 -    | dest_nib _ = raise Match;
    1.62 -
    1.63 -  fun dest_nibs t1 t2 = chr (dest_nib t1 * 16 + dest_nib t2);
    1.64 -
    1.65 -
    1.66 -  fun mk_char c =
    1.67 -    Syntax.const "Char" $ mk_nib (ord c div 16) $ mk_nib (ord c mod 16);
    1.68 -
    1.69 -  fun dest_char (Const ("Char", _) $ t1 $ t2) = dest_nibs t1 t2
    1.70 -    | dest_char _ = raise Match;
    1.71 -
    1.72 -
    1.73 -  fun char_tr (*"_Char"*) [Free (xstr, _)] =
    1.74 -        (case Syntax.explode_xstr xstr of
    1.75 -          [c] => mk_char c
    1.76 -        | _ => error ("Single character expected: " ^ xstr))
    1.77 -    | char_tr (*"_Char"*) ts = raise TERM ("char_tr", ts);
    1.78 -
    1.79 -  fun char_tr' (*"Char"*) [t1, t2] =
    1.80 -        Syntax.const "_Char" $ syntax_xstr (Syntax.implode_xstr [dest_nibs t1 t2])
    1.81 -    | char_tr' (*"Char"*) _ = raise Match;
    1.82 -
    1.83 -
    1.84 -  (* strings *)
    1.85 -
    1.86 -  fun mk_string [] = Syntax.const Syntax.constrainC $ Syntax.const "Nil" $ Syntax.const "string"
    1.87 -    | mk_string (t :: ts) = Syntax.const "Cons" $ t $ mk_string ts;
    1.88 -
    1.89 -  fun dest_string (Const ("Nil", _)) = []
    1.90 -    | dest_string (Const ("Cons", _) $ c $ cs) = dest_char c :: dest_string cs
    1.91 -    | dest_string _ = raise Match;
    1.92 -
    1.93 -
    1.94 -  fun string_tr (*"_String"*) [Free (xstr, _)] =
    1.95 -        mk_string (map mk_char (Syntax.explode_xstr xstr))
    1.96 -    | string_tr (*"_String"*) ts = raise TERM ("string_tr", ts);
    1.97 -
    1.98 -  fun cons_tr' (*"Cons"*) [c, cs] =
    1.99 -        Syntax.const "_String" $
   1.100 -          syntax_xstr (Syntax.implode_xstr (dest_char c :: dest_string cs))
   1.101 -    | cons_tr' (*"Cons"*) ts = raise Match;
   1.102 -
   1.103 -in
   1.104 -  val parse_translation = [("_Char", char_tr), ("_String", string_tr)];
   1.105 -  val print_translation = [("Char", char_tr'), ("Cons", cons_tr')];
   1.106 -end;