| author | huffman | 
| Sat, 06 Jun 2009 10:28:34 -0700 | |
| changeset 31489 | 10080e31b294 | 
| parent 31048 | ac146fc38b51 | 
| child 35115 | 446c5063e4fd | 
| permissions | -rw-r--r-- | 
| 21759 | 1  | 
(* Title: HOL/Tools/string_syntax.ML  | 
2  | 
Author: Makarius  | 
|
3  | 
||
4  | 
Concrete syntax for hex chars and strings.  | 
|
5  | 
*)  | 
|
6  | 
||
7  | 
signature STRING_SYNTAX =  | 
|
8  | 
sig  | 
|
9  | 
val setup: theory -> theory  | 
|
10  | 
end;  | 
|
11  | 
||
12  | 
structure StringSyntax: STRING_SYNTAX =  | 
|
13  | 
struct  | 
|
14  | 
||
15  | 
||
16  | 
(* nibble *)  | 
|
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 | 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 | 22  | 
fst o Term.dest_Const o HOLogic.mk_nibble;  | 
23  | 
||
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 | 26  | 
handle TERM _ => raise Match;  | 
27  | 
||
28  | 
||
29  | 
(* char *)  | 
|
30  | 
||
31  | 
fun mk_char s =  | 
|
32  | 
if Symbol.is_ascii s then  | 
|
33  | 
Syntax.Appl [Syntax.Constant "Char", mk_nib (ord s div 16), mk_nib (ord s mod 16)]  | 
|
34  | 
  else error ("Non-ASCII symbol: " ^ quote s);
 | 
|
35  | 
||
| 21775 | 36  | 
val specials = explode "\\\"`'";  | 
| 21759 | 37  | 
|
38  | 
fun dest_chr c1 c2 =  | 
|
39  | 
let val c = chr (dest_nib c1 * 16 + dest_nib c2) in  | 
|
40  | 
if not (member (op =) specials c) andalso Symbol.is_ascii c andalso Symbol.is_printable c  | 
|
41  | 
then c else raise Match  | 
|
42  | 
end;  | 
|
43  | 
||
44  | 
fun dest_char (Syntax.Appl [Syntax.Constant "Char", c1, c2]) = dest_chr c1 c2  | 
|
45  | 
| dest_char _ = raise Match;  | 
|
46  | 
||
| 29317 | 47  | 
fun syntax_string cs =  | 
48  | 
Syntax.Appl [Syntax.Constant "_inner_string", Syntax.Variable (Syntax.implode_xstr cs)];  | 
|
| 21759 | 49  | 
|
50  | 
||
51  | 
fun char_ast_tr [Syntax.Variable xstr] =  | 
|
52  | 
(case Syntax.explode_xstr xstr of  | 
|
53  | 
[c] => mk_char c  | 
|
54  | 
    | _ => error ("Single character expected: " ^ xstr))
 | 
|
55  | 
  | char_ast_tr asts = raise AST ("char_ast_tr", asts);
 | 
|
56  | 
||
| 29317 | 57  | 
fun char_ast_tr' [c1, c2] = Syntax.Appl [Syntax.Constant "_Char", syntax_string [dest_chr c1 c2]]  | 
| 21759 | 58  | 
| char_ast_tr' _ = raise Match;  | 
59  | 
||
60  | 
||
61  | 
(* string *)  | 
|
62  | 
||
63  | 
fun mk_string [] = Syntax.Constant "Nil"  | 
|
64  | 
| mk_string (c :: cs) = Syntax.Appl [Syntax.Constant "Cons", mk_char c, mk_string cs];  | 
|
65  | 
||
66  | 
fun string_ast_tr [Syntax.Variable xstr] =  | 
|
67  | 
(case Syntax.explode_xstr xstr of  | 
|
68  | 
[] => Syntax.Appl  | 
|
69  | 
[Syntax.Constant Syntax.constrainC, Syntax.Constant "Nil", Syntax.Constant "string"]  | 
|
70  | 
| cs => mk_string cs)  | 
|
71  | 
  | string_ast_tr asts = raise AST ("string_tr", asts);
 | 
|
72  | 
||
73  | 
fun list_ast_tr' [args] = Syntax.Appl [Syntax.Constant "_String",  | 
|
| 29317 | 74  | 
syntax_string (map dest_char (Syntax.unfold_ast "_args" args))]  | 
| 21759 | 75  | 
| list_ast_tr' ts = raise Match;  | 
76  | 
||
77  | 
||
78  | 
(* theory setup *)  | 
|
79  | 
||
80  | 
val setup =  | 
|
| 
24712
 
64ed05609568
proper Sign operations instead of Theory aliases;
 
wenzelm 
parents: 
21775 
diff
changeset
 | 
81  | 
Sign.add_trfuns  | 
| 21759 | 82  | 
    ([("_Char", char_ast_tr), ("_String", string_ast_tr)], [], [],
 | 
83  | 
      [("Char", char_ast_tr'), ("@list", list_ast_tr')]);
 | 
|
84  | 
||
85  | 
end;  |