src/HOL/Tools/string_syntax.ML
author blanchet
Mon, 23 Nov 2009 18:29:00 +0100
changeset 33877 e779bea3d337
parent 31048 ac146fc38b51
child 35115 446c5063e4fd
permissions -rw-r--r--
fix Nitpick soundness bug related to "finite (UNIV::'a set)" where "'a" is constrained by a sort to be infinite
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
21759
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/Tools/string_syntax.ML
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
     3
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
     4
Concrete syntax for hex chars and strings.
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
     5
*)
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
     6
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
     7
signature STRING_SYNTAX =
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
     8
sig
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
     9
  val setup: theory -> theory
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    10
end;
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    11
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    12
structure StringSyntax: STRING_SYNTAX =
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    13
struct
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    14
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    15
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    16
(* nibble *)
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    17
31048
ac146fc38b51 refined HOL string theories and corresponding ML fragments
haftmann
parents: 29317
diff changeset
    18
val nib_prefix = "String.nibble.";
ac146fc38b51 refined HOL string theories and corresponding ML fragments
haftmann
parents: 29317
diff changeset
    19
21759
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    20
val mk_nib =
31048
ac146fc38b51 refined HOL string theories and corresponding ML fragments
haftmann
parents: 29317
diff changeset
    21
  Syntax.Constant o unprefix nib_prefix o
21759
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    22
  fst o Term.dest_Const o HOLogic.mk_nibble;
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    23
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    24
fun dest_nib (Syntax.Constant c) =
31048
ac146fc38b51 refined HOL string theories and corresponding ML fragments
haftmann
parents: 29317
diff changeset
    25
  HOLogic.dest_nibble (Const (nib_prefix ^ c, dummyT))
21759
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    26
    handle TERM _ => raise Match;
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    27
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    28
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    29
(* char *)
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    30
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    31
fun mk_char s =
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    32
  if Symbol.is_ascii s then
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    33
    Syntax.Appl [Syntax.Constant "Char", mk_nib (ord s div 16), mk_nib (ord s mod 16)]
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    34
  else error ("Non-ASCII symbol: " ^ quote s);
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    35
21775
8be8da44ee56 specials: include single quote;
wenzelm
parents: 21759
diff changeset
    36
val specials = explode "\\\"`'";
21759
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    37
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    38
fun dest_chr c1 c2 =
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    39
  let val c = chr (dest_nib c1 * 16 + dest_nib c2) in
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    40
    if not (member (op =) specials c) andalso Symbol.is_ascii c andalso Symbol.is_printable c
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    41
    then c else raise Match
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    42
  end;
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    43
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    44
fun dest_char (Syntax.Appl [Syntax.Constant "Char", c1, c2]) = dest_chr c1 c2
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    45
  | dest_char _ = raise Match;
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    46
29317
9faf1dfb4e7c renamed token markup "_xstr" to "_inner_string";
wenzelm
parents: 24712
diff changeset
    47
fun syntax_string cs =
9faf1dfb4e7c renamed token markup "_xstr" to "_inner_string";
wenzelm
parents: 24712
diff changeset
    48
  Syntax.Appl [Syntax.Constant "_inner_string", Syntax.Variable (Syntax.implode_xstr cs)];
21759
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    49
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    50
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    51
fun char_ast_tr [Syntax.Variable xstr] =
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    52
    (case Syntax.explode_xstr xstr of
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    53
      [c] => mk_char c
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    54
    | _ => error ("Single character expected: " ^ xstr))
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    55
  | char_ast_tr asts = raise AST ("char_ast_tr", asts);
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    56
29317
9faf1dfb4e7c renamed token markup "_xstr" to "_inner_string";
wenzelm
parents: 24712
diff changeset
    57
fun char_ast_tr' [c1, c2] = Syntax.Appl [Syntax.Constant "_Char", syntax_string [dest_chr c1 c2]]
21759
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    58
  | char_ast_tr' _ = raise Match;
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    59
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    60
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    61
(* string *)
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    62
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    63
fun mk_string [] = Syntax.Constant "Nil"
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    64
  | mk_string (c :: cs) = Syntax.Appl [Syntax.Constant "Cons", mk_char c, mk_string cs];
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    65
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    66
fun string_ast_tr [Syntax.Variable xstr] =
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    67
    (case Syntax.explode_xstr xstr of
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    68
      [] => Syntax.Appl
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    69
        [Syntax.Constant Syntax.constrainC, Syntax.Constant "Nil", Syntax.Constant "string"]
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    70
    | cs => mk_string cs)
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    71
  | string_ast_tr asts = raise AST ("string_tr", asts);
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    72
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    73
fun list_ast_tr' [args] = Syntax.Appl [Syntax.Constant "_String",
29317
9faf1dfb4e7c renamed token markup "_xstr" to "_inner_string";
wenzelm
parents: 24712
diff changeset
    74
        syntax_string (map dest_char (Syntax.unfold_ast "_args" args))]
21759
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    75
  | list_ast_tr' ts = raise Match;
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    76
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    77
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    78
(* theory setup *)
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    79
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    80
val setup =
24712
64ed05609568 proper Sign operations instead of Theory aliases;
wenzelm
parents: 21775
diff changeset
    81
  Sign.add_trfuns
21759
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    82
    ([("_Char", char_ast_tr), ("_String", string_ast_tr)], [], [],
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    83
      [("Char", char_ast_tr'), ("@list", list_ast_tr')]);
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    84
f4b20360751f Concrete syntax for hex chars and strings.
wenzelm
parents:
diff changeset
    85
end;