src/HOL/Tools/string_syntax.ML
changeset 35115 446c5063e4fd
parent 31048 ac146fc38b51
child 35123 e286d5df187a
equal deleted inserted replaced
35114:b1fd1d756e20 35115:446c5063e4fd
    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;