28 |
28 |
29 (* char *) |
29 (* char *) |
30 |
30 |
31 fun mk_char s = |
31 fun mk_char s = |
32 if Symbol.is_ascii s then |
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)] |
33 Syntax.Appl [Syntax.Constant @{const_syntax Char}, mk_nib (ord s div 16), mk_nib (ord s mod 16)] |
34 else error ("Non-ASCII symbol: " ^ quote s); |
34 else error ("Non-ASCII symbol: " ^ quote s); |
35 |
35 |
36 val specials = explode "\\\"`'"; |
36 val specials = explode "\\\"`'"; |
37 |
37 |
38 fun dest_chr c1 c2 = |
38 fun dest_chr c1 c2 = |
39 let val c = chr (dest_nib c1 * 16 + dest_nib c2) in |
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 |
40 if not (member (op =) specials c) andalso Symbol.is_ascii c andalso Symbol.is_printable c |
41 then c else raise Match |
41 then c else raise Match |
42 end; |
42 end; |
43 |
43 |
44 fun dest_char (Syntax.Appl [Syntax.Constant "Char", c1, c2]) = dest_chr c1 c2 |
44 fun dest_char (Syntax.Appl [Syntax.Constant @{const_syntax Char}, c1, c2]) = dest_chr c1 c2 |
45 | dest_char _ = raise Match; |
45 | dest_char _ = raise Match; |
46 |
46 |
47 fun syntax_string cs = |
47 fun syntax_string cs = |
48 Syntax.Appl [Syntax.Constant "_inner_string", Syntax.Variable (Syntax.implode_xstr cs)]; |
48 Syntax.Appl |
|
49 [Syntax.Constant @{syntax_const "_inner_string"}, |
|
50 Syntax.Variable (Syntax.implode_xstr cs)]; |
49 |
51 |
50 |
52 |
51 fun char_ast_tr [Syntax.Variable xstr] = |
53 fun char_ast_tr [Syntax.Variable xstr] = |
52 (case Syntax.explode_xstr xstr of |
54 (case Syntax.explode_xstr xstr of |
53 [c] => mk_char c |
55 [c] => mk_char c |
54 | _ => error ("Single character expected: " ^ xstr)) |
56 | _ => error ("Single character expected: " ^ xstr)) |
55 | char_ast_tr asts = raise AST ("char_ast_tr", asts); |
57 | char_ast_tr asts = raise AST ("char_ast_tr", asts); |
56 |
58 |
57 fun char_ast_tr' [c1, c2] = Syntax.Appl [Syntax.Constant "_Char", syntax_string [dest_chr c1 c2]] |
59 fun char_ast_tr' [c1, c2] = |
|
60 Syntax.Appl [Syntax.Constant @{syntax_const "_Char"}, syntax_string [dest_chr c1 c2]] |
58 | char_ast_tr' _ = raise Match; |
61 | char_ast_tr' _ = raise Match; |
59 |
62 |
60 |
63 |
61 (* string *) |
64 (* string *) |
62 |
65 |
63 fun mk_string [] = Syntax.Constant "Nil" |
66 fun mk_string [] = Syntax.Constant @{const_syntax Nil} |
64 | mk_string (c :: cs) = Syntax.Appl [Syntax.Constant "Cons", mk_char c, mk_string cs]; |
67 | mk_string (c :: cs) = |
|
68 Syntax.Appl [Syntax.Constant @{const_syntax Cons}, mk_char c, mk_string cs]; |
65 |
69 |
66 fun string_ast_tr [Syntax.Variable xstr] = |
70 fun string_ast_tr [Syntax.Variable xstr] = |
67 (case Syntax.explode_xstr xstr of |
71 (case Syntax.explode_xstr xstr of |
68 [] => Syntax.Appl |
72 [] => |
69 [Syntax.Constant Syntax.constrainC, Syntax.Constant "Nil", Syntax.Constant "string"] |
73 Syntax.Appl |
|
74 [Syntax.Constant Syntax.constrainC, |
|
75 Syntax.Constant @{const_syntax Nil}, Syntax.Constant "string"] (* FIXME @{type_syntax} *) |
70 | cs => mk_string cs) |
76 | cs => mk_string cs) |
71 | string_ast_tr asts = raise AST ("string_tr", asts); |
77 | string_ast_tr asts = raise AST ("string_tr", asts); |
72 |
78 |
73 fun list_ast_tr' [args] = Syntax.Appl [Syntax.Constant "_String", |
79 fun list_ast_tr' [args] = |
74 syntax_string (map dest_char (Syntax.unfold_ast "_args" args))] |
80 Syntax.Appl [Syntax.Constant @{syntax_const "_String"}, |
|
81 syntax_string (map dest_char (Syntax.unfold_ast @{syntax_const "_args"} args))] |
75 | list_ast_tr' ts = raise Match; |
82 | list_ast_tr' ts = raise Match; |
76 |
83 |
77 |
84 |
78 (* theory setup *) |
85 (* theory setup *) |
79 |
86 |
80 val setup = |
87 val setup = |
81 Sign.add_trfuns |
88 Sign.add_trfuns |
82 ([("_Char", char_ast_tr), ("_String", string_ast_tr)], [], [], |
89 ([(@{syntax_const "_Char"}, char_ast_tr), (@{syntax_const "_String"}, string_ast_tr)], [], [], |
83 [("Char", char_ast_tr'), ("@list", list_ast_tr')]); |
90 [(@{const_syntax Char}, char_ast_tr'), (@{syntax_const "_list"}, list_ast_tr')]); |
84 |
91 |
85 end; |
92 end; |