src/HOL/Tools/string_syntax.ML
changeset 42224 578a51fae383
parent 40627 becf5d5187cc
child 42248 04bffad68aa4
equal deleted inserted replaced
42223:098c86e53153 42224:578a51fae383
    14 
    14 
    15 
    15 
    16 (* nibble *)
    16 (* nibble *)
    17 
    17 
    18 val mk_nib =
    18 val mk_nib =
    19   Syntax.Constant o Syntax.mark_const o
    19   Ast.Constant o Syntax.mark_const o
    20     fst o Term.dest_Const o HOLogic.mk_nibble;
    20     fst o Term.dest_Const o HOLogic.mk_nibble;
    21 
    21 
    22 fun dest_nib (Syntax.Constant s) =
    22 fun dest_nib (Ast.Constant s) =
    23   (case try Syntax.unmark_const s of
    23   (case try Syntax.unmark_const s of
    24     NONE => raise Match
    24     NONE => raise Match
    25   | SOME c => (HOLogic.dest_nibble (Const (c, HOLogic.nibbleT)) handle TERM _ => raise Match));
    25   | SOME c => (HOLogic.dest_nibble (Const (c, HOLogic.nibbleT)) handle TERM _ => raise Match));
    26 
    26 
    27 
    27 
    28 (* char *)
    28 (* char *)
    29 
    29 
    30 fun mk_char s =
    30 fun mk_char s =
    31   if Symbol.is_ascii s then
    31   if Symbol.is_ascii s then
    32     Syntax.Appl [Syntax.Constant @{const_syntax Char}, mk_nib (ord s div 16), mk_nib (ord s mod 16)]
    32     Ast.Appl [Ast.Constant @{const_syntax Char}, mk_nib (ord s div 16), mk_nib (ord s mod 16)]
    33   else error ("Non-ASCII symbol: " ^ quote s);
    33   else error ("Non-ASCII symbol: " ^ quote s);
    34 
    34 
    35 val specials = raw_explode "\\\"`'";
    35 val specials = raw_explode "\\\"`'";
    36 
    36 
    37 fun dest_chr c1 c2 =
    37 fun dest_chr c1 c2 =
    38   let val c = chr (dest_nib c1 * 16 + dest_nib c2) in
    38   let val c = chr (dest_nib c1 * 16 + dest_nib c2) in
    39     if not (member (op =) specials c) andalso Symbol.is_ascii c andalso Symbol.is_printable c
    39     if not (member (op =) specials c) andalso Symbol.is_ascii c andalso Symbol.is_printable c
    40     then c else raise Match
    40     then c else raise Match
    41   end;
    41   end;
    42 
    42 
    43 fun dest_char (Syntax.Appl [Syntax.Constant @{const_syntax Char}, c1, c2]) = dest_chr c1 c2
    43 fun dest_char (Ast.Appl [Ast.Constant @{const_syntax Char}, c1, c2]) = dest_chr c1 c2
    44   | dest_char _ = raise Match;
    44   | dest_char _ = raise Match;
    45 
    45 
    46 fun syntax_string cs =
    46 fun syntax_string cs =
    47   Syntax.Appl
    47   Ast.Appl [Ast.Constant @{syntax_const "_inner_string"}, Ast.Variable (Syntax.implode_xstr cs)];
    48     [Syntax.Constant @{syntax_const "_inner_string"},
       
    49       Syntax.Variable (Syntax.implode_xstr cs)];
       
    50 
    48 
    51 
    49 
    52 fun char_ast_tr [Syntax.Variable xstr] =
    50 fun char_ast_tr [Ast.Variable xstr] =
    53     (case Syntax.explode_xstr xstr of
    51       (case Syntax.explode_xstr xstr of
    54       [c] => mk_char c
    52         [c] => mk_char c
    55     | _ => error ("Single character expected: " ^ xstr))
    53       | _ => error ("Single character expected: " ^ xstr))
    56   | char_ast_tr asts = raise AST ("char_ast_tr", asts);
    54   | char_ast_tr asts = raise Ast.AST ("char_ast_tr", asts);
    57 
    55 
    58 fun char_ast_tr' [c1, c2] =
    56 fun char_ast_tr' [c1, c2] =
    59       Syntax.Appl [Syntax.Constant @{syntax_const "_Char"}, syntax_string [dest_chr c1 c2]]
    57       Ast.Appl [Ast.Constant @{syntax_const "_Char"}, syntax_string [dest_chr c1 c2]]
    60   | char_ast_tr' _ = raise Match;
    58   | char_ast_tr' _ = raise Match;
    61 
    59 
    62 
    60 
    63 (* string *)
    61 (* string *)
    64 
    62 
    65 fun mk_string [] = Syntax.Constant @{const_syntax Nil}
    63 fun mk_string [] = Ast.Constant @{const_syntax Nil}
    66   | mk_string (c :: cs) =
    64   | mk_string (c :: cs) =
    67       Syntax.Appl [Syntax.Constant @{const_syntax Cons}, mk_char c, mk_string cs];
    65       Ast.Appl [Ast.Constant @{const_syntax Cons}, mk_char c, mk_string cs];
    68 
    66 
    69 fun string_ast_tr [Syntax.Variable xstr] =
    67 fun string_ast_tr [Ast.Variable xstr] =
    70     (case Syntax.explode_xstr xstr of
    68       (case Syntax.explode_xstr xstr of
    71       [] =>
    69         [] =>
    72         Syntax.Appl
    70           Ast.Appl
    73           [Syntax.Constant Syntax.constrainC,
    71             [Ast.Constant Syntax.constrainC,
    74             Syntax.Constant @{const_syntax Nil}, Syntax.Constant @{type_syntax string}]
    72               Ast.Constant @{const_syntax Nil}, Ast.Constant @{type_syntax string}]
    75     | cs => mk_string cs)
    73       | cs => mk_string cs)
    76   | string_ast_tr asts = raise AST ("string_tr", asts);
    74   | string_ast_tr asts = raise Ast.AST ("string_tr", asts);
    77 
    75 
    78 fun list_ast_tr' [args] =
    76 fun list_ast_tr' [args] =
    79       Syntax.Appl [Syntax.Constant @{syntax_const "_String"},
    77       Ast.Appl [Ast.Constant @{syntax_const "_String"},
    80         syntax_string (map dest_char (Syntax.unfold_ast @{syntax_const "_args"} args))]
    78         syntax_string (map dest_char (Ast.unfold_ast @{syntax_const "_args"} args))]
    81   | list_ast_tr' ts = raise Match;
    79   | list_ast_tr' ts = raise Match;
    82 
    80 
    83 
    81 
    84 (* theory setup *)
    82 (* theory setup *)
    85 
    83