src/HOL/SPARK/Tools/fdl_lexer.ML
author berghofe
Sat, 15 Jan 2011 12:35:29 +0100
changeset 41561 d1318f3c86ba
child 41584 2b07a4212d6d
permissions -rw-r--r--
Added new SPARK verification environment.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
     1
(*  Title:      HOL/SPARK/Tools/fdl_lexer.ML
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
     2
    Author:     Stefan Berghofer
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
     3
    Copyright:  secunet Security Networks AG
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
     4
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
     5
Lexical analyzer for fdl files.
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
     6
*)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
     7
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
     8
signature FDL_LEXER =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
     9
sig
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    10
  type T
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    11
  type chars
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    12
  type banner
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    13
  type date
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    14
  type time
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    15
  datatype kind = Keyword | Ident | Long_Ident | Traceability | Number | Comment | EOF
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    16
  val tokenize: (chars -> 'a * chars) -> (chars -> T * chars) ->
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    17
    Position.T -> string -> 'a * T list
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    18
  val position_of: T -> Position.T
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    19
  val pos_of: T -> string
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    20
  val is_eof: T -> bool
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    21
  val stopper: T Scan.stopper
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    22
  val kind_of: T -> kind
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    23
  val content_of: T -> string
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    24
  val unparse: T -> string
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    25
  val is_proper: T -> bool
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    26
  val is_digit: string -> bool
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    27
  val c_comment: chars -> T * chars
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    28
  val curly_comment: chars -> T * chars
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    29
  val percent_comment: chars -> T * chars
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    30
  val vcg_header: chars -> (banner * (date * time) option) * chars
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    31
  val siv_header: chars ->
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    32
    (banner * (date * time) * (date * time) * (string * string)) * chars
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    33
end;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    34
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    35
structure Fdl_Lexer: FDL_LEXER =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    36
struct
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    37
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    38
(** tokens **)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    39
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    40
datatype kind = Keyword | Ident | Long_Ident | Traceability | Number | Comment | EOF;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    41
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    42
datatype T = Token of kind * string * Position.T;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    43
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    44
fun make_token k xs = Token (k, implode (map fst xs),
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    45
  case xs of [] => Position.none | (_, p) :: _ => p);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    46
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    47
fun kind_of (Token (k, _, _)) = k;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    48
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    49
fun is_proper (Token (Comment, _, _)) = false
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    50
  | is_proper _ = true;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    51
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    52
fun content_of (Token (_, s, _)) = s;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    53
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    54
fun unparse (Token (Traceability, s, _)) = "For " ^ s ^ ":"
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    55
  | unparse (Token (_, s, _)) = s;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    56
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    57
fun position_of (Token (_, _, pos)) = pos;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    58
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    59
val pos_of = Position.str_of o position_of;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    60
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    61
fun is_eof (Token (EOF, _, _)) = true
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    62
  | is_eof _ = false;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    63
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    64
fun mk_eof pos = Token (EOF, "", pos);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    65
val eof = mk_eof Position.none;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    66
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    67
val stopper =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    68
  Scan.stopper (fn [] => eof | toks => mk_eof (position_of (List.last toks))) is_eof;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    69
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    70
fun leq_token (Token (_, s, _), Token (_, s', _)) = size s <= size s';
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    71
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    72
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    73
(** split up a string into a list of characters (with positions) **)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    74
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    75
type chars = (string * Position.T) list;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    76
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    77
(* a variant of Position.advance (see Pure/General/position.ML) *)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    78
fun advance x pos =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    79
  let
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    80
    fun incr i = i+1;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    81
    fun change_prop s f props = case Properties.get_int props s of
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    82
        NONE => props
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    83
      | SOME i => Properties.put (s, Int.toString (f i)) props;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    84
  in
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    85
    pos |>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    86
    Position.properties_of |>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    87
    change_prop "offset" incr |>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    88
    (case x of
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    89
       "\n" =>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    90
         change_prop "line" incr #>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    91
         change_prop "column" (K 1)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    92
     | _ => change_prop "column" incr) |>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    93
    Position.of_properties
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    94
  end;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    95
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    96
fun is_char_eof ("", _) = true
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    97
  | is_char_eof _ = false;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    98
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    99
val char_stopper = Scan.stopper (K ("", Position.none)) is_char_eof;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   100
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   101
fun symbol (x : string, _ : Position.T) = x;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   102
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   103
fun explode_pos s pos = fst (fold_map (fn x => fn pos =>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   104
  ((x, pos), advance x pos)) (raw_explode s) pos);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   105
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   106
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   107
(** scanners **)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   108
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   109
val any = Scan.one (not o Scan.is_stopper char_stopper);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   110
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   111
fun prfx [] = Scan.succeed []
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   112
  | prfx (x :: xs) = Scan.one (equal x o symbol) ::: prfx xs;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   113
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   114
val $$$ = prfx o raw_explode;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   115
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   116
val lexicon = Scan.make_lexicon (map raw_explode
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   117
  ["rule_family",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   118
   "title",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   119
   "For",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   120
   ":",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   121
   "[",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   122
   "]",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   123
   "(",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   124
   ")",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   125
   ",",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   126
   "&",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   127
   ";",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   128
   "=",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   129
   ".",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   130
   "..",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   131
   "requires",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   132
   "may_be_replaced_by",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   133
   "may_be_deduced",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   134
   "may_be_deduced_from",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   135
   "are_interchangeable",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   136
   "if",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   137
   "end",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   138
   "function",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   139
   "procedure",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   140
   "type",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   141
   "var",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   142
   "const",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   143
   "array",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   144
   "record",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   145
   ":=",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   146
   "of",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   147
   "**",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   148
   "*",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   149
   "/",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   150
   "div",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   151
   "mod",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   152
   "+",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   153
   "-",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   154
   "<>",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   155
   "<",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   156
   ">",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   157
   "<=",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   158
   ">=",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   159
   "<->",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   160
   "->",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   161
   "not",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   162
   "and",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   163
   "or",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   164
   "for_some",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   165
   "for_all",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   166
   "***",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   167
   "!!!",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   168
   "element",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   169
   "update",
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   170
   "pending"]);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   171
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   172
fun keyword s = Scan.literal lexicon :|--
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   173
  (fn xs => if map symbol xs = raw_explode s then Scan.succeed xs else Scan.fail);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   174
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   175
fun is_digit x = "0" <= x andalso x <= "9";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   176
fun is_alpha x = "a" <= x andalso x <= "z" orelse "A" <= x andalso x <= "Z";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   177
val is_underscore = equal "_";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   178
val is_tilde = equal "~";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   179
val is_newline = equal "\n";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   180
val is_tab = equal "\t";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   181
val is_space = equal " ";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   182
val is_whitespace = is_space orf is_tab orf is_newline;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   183
val is_whitespace' = is_space orf is_tab;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   184
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   185
val number = Scan.many1 (is_digit o symbol);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   186
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   187
val identifier =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   188
  Scan.one (is_alpha o symbol) :::
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   189
  Scan.many
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   190
    ((is_alpha orf is_digit orf is_underscore) o symbol) @@@
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   191
   Scan.optional (Scan.one (is_tilde o symbol) >> single) [];
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   192
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   193
val long_identifier =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   194
  identifier @@@ (Scan.repeat1 ($$$ "." @@@ identifier) >> flat);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   195
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   196
val whitespace = Scan.many (is_whitespace o symbol);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   197
val whitespace' = Scan.many (is_whitespace' o symbol);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   198
val newline = Scan.one (is_newline o symbol);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   199
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   200
fun beginning n cs =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   201
  let
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   202
    val drop_blanks = #1 o take_suffix is_whitespace;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   203
    val all_cs = drop_blanks cs;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   204
    val dots = if length all_cs > n then " ..." else "";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   205
  in
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   206
    (drop_blanks (take n all_cs)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   207
      |> map (fn c => if is_whitespace c then " " else c)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   208
      |> implode) ^ dots
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   209
  end;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   210
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   211
fun !!! text scan =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   212
  let
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   213
    fun get_pos [] = " (past end-of-text!)"
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   214
      | get_pos ((_, pos) :: _) = Position.str_of pos;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   215
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   216
    fun err (syms, msg) =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   217
      text ^ get_pos syms ^ " at " ^ beginning 10 (map symbol syms) ^
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   218
      (case msg of NONE => "" | SOME s => "\n" ^ s);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   219
  in Scan.!! err scan end;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   220
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   221
val any_line' =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   222
  Scan.many (not o (Scan.is_stopper char_stopper orf (is_newline o symbol)));
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   223
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   224
val any_line = whitespace' |-- any_line' --|
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   225
  newline >> (implode o map symbol);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   226
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   227
fun gen_comment a b = $$$ a |-- !!! "missing end of comment"
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   228
  (Scan.repeat (Scan.unless ($$$ b) any) --| $$$ b) >> make_token Comment;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   229
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   230
val c_comment = gen_comment "/*" "*/";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   231
val curly_comment = gen_comment "{" "}";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   232
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   233
val percent_comment = $$$ "%" |-- any_line' >> make_token Comment;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   234
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   235
fun repeatn 0 _ = Scan.succeed []
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   236
  | repeatn n p = Scan.one p ::: repeatn (n-1) p;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   237
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   238
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   239
(** header of *.vcg and *.siv files (see simplifier/load_provenance.pro) **)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   240
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   241
type banner = string * string * string;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   242
type date = string * string * string;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   243
type time = string * string * string * string option;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   244
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   245
val asterisks = Scan.repeat1 (Scan.one (equal "*" o symbol));
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   246
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   247
fun alphan n = repeatn n (is_alpha o symbol) >> (implode o map symbol);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   248
fun digitn n = repeatn n (is_digit o symbol) >> (implode o map symbol);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   249
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   250
val time =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   251
  digitn 2 --| $$$ ":" -- digitn 2 --| $$$ ":" -- digitn 2 --
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   252
  Scan.option ($$$ "." |-- digitn 2) >>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   253
    (fn (((hr, mi), s), ms) => (hr, mi, s, ms));
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   254
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   255
val date =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   256
  digitn 2 --| $$$ "-" -- alphan 3 --| $$$ "-" -- digitn 4 >>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   257
    (fn ((d, m), y) => (d, m, y));
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   258
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   259
val banner = 
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   260
  whitespace' |-- asterisks --| whitespace' --| newline :|-- (fn xs =>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   261
    (any_line -- any_line -- any_line >>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   262
       (fn ((l1, l2), l3) => (l1, l2, l3))) --|
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   263
    whitespace' --| prfx (map symbol xs) --| whitespace' --| newline);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   264
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   265
val vcg_header = banner -- Scan.option (whitespace |--
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   266
  $$$ "DATE :" |-- whitespace |-- date --| whitespace --|
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   267
  Scan.option ($$$ "TIME :" -- whitespace) -- time);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   268
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   269
val siv_header = banner --| whitespace --
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   270
  ($$$ "CREATED" |-- whitespace |-- (date --| $$$ "," --| whitespace -- time)) --|
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   271
  whitespace --
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   272
  ($$$ "SIMPLIFIED" |-- whitespace |-- (date --| $$$ "," --| whitespace -- time)) --|
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   273
  newline --| newline -- (any_line -- any_line) >>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   274
    (fn (((b, c), s), ls) => (b, c, s, ls));
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   275
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   276
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   277
(** the main tokenizer **)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   278
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   279
fun scan header comment =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   280
  !!! "bad header" header --| whitespace --
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   281
  Scan.repeat (Scan.unless (Scan.one is_char_eof)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   282
    (!!! "bad input"
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   283
       (   comment
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   284
        || (keyword "For" -- whitespace) |--
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   285
              Scan.repeat1 (Scan.unless (keyword ":") any) --|
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   286
              keyword ":" >> make_token Traceability
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   287
        || Scan.max leq_token
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   288
             (Scan.literal lexicon >> make_token Keyword)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   289
             (   long_identifier >> make_token Long_Ident
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   290
              || identifier >> make_token Ident)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   291
        || number >> make_token Number) --|
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   292
     whitespace));
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   293
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   294
fun tokenize header comment pos s =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   295
  fst (Scan.finite char_stopper
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   296
    (Scan.error (scan header comment)) (explode_pos s pos));
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   297
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   298
end;