src/HOL/SPARK/Tools/fdl_parser.ML
author berghofe
Fri, 02 Nov 2012 12:00:51 +0100
changeset 49998 ad8a6db0b480
parent 48911 5debc3e4fa81
permissions -rw-r--r--
Allow parentheses around left-hand sides of array associations
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_parser.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
Parser 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_PARSER =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
     9
sig
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    10
  datatype expr =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    11
      Ident of string
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    12
    | Number of int
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    13
    | Quantifier of string * string list * string * expr
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    14
    | Funct of string * expr list
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    15
    | Element of expr * expr list
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    16
    | Update of expr * expr list * expr
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    17
    | Record of string * (string * expr) list
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    18
    | Array of string * expr option *
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    19
        ((expr * expr option) list list * expr) list;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    20
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    21
  datatype fdl_type =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    22
      Basic_Type of string
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    23
    | Enum_Type of string list
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    24
    | Array_Type of string list * string
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    25
    | Record_Type of (string list * string) list
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    26
    | Pending_Type;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    27
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    28
  datatype fdl_rule =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    29
      Inference_Rule of expr list * expr
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    30
    | Substitution_Rule of expr list * expr * expr;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    31
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    32
  type rules =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    33
    ((string * int) * fdl_rule) list *
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    34
    (string * (expr * (string * string) list) list) list;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    35
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    36
  type vcs = (string * (string *
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    37
    ((string * expr) list * (string * expr) list)) list) list;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    38
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    39
  type 'a tab = 'a Symtab.table * (string * 'a) list;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    40
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    41
  val lookup: 'a tab -> string -> 'a option;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    42
  val update: string * 'a -> 'a tab -> 'a tab;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    43
  val items: 'a tab -> (string * 'a) list;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    44
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    45
  type decls =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    46
    {types: fdl_type tab,
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    47
     vars: string tab,
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    48
     consts: string tab,
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    49
     funs: (string list * string) tab};
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    50
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    51
  val parse_vcs: (Fdl_Lexer.chars -> 'a * Fdl_Lexer.chars) -> Position.T ->
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    52
    string -> 'a * ((string * string) * vcs);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    53
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    54
  val parse_declarations:  Position.T -> string -> (string * string) * decls;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    55
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    56
  val parse_rules: Position.T -> string -> rules;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    57
end;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    58
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    59
structure Fdl_Parser: FDL_PARSER =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    60
struct
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    61
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    62
(** error handling **)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    63
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    64
fun beginning n cs =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    65
  let val dots = if length cs > n then " ..." else "";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    66
  in
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    67
    space_implode " " (take n cs) ^ dots
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    68
  end;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    69
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    70
fun !!! scan =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    71
  let
48911
5debc3e4fa81 tuned messages: end-of-input rarely means physical end-of-file from the past;
wenzelm
parents: 47083
diff changeset
    72
    fun get_pos [] = " (end-of-input)"
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    73
      | get_pos (tok :: _) = Fdl_Lexer.pos_of tok;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    74
43947
9b00f09f7721 defer evaluation of Scan.message, for improved performance in the frequent situation where failure is handled later (e.g. via ||);
wenzelm
parents: 41620
diff changeset
    75
    fun err (syms, msg) = fn () =>
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    76
      "Syntax error" ^ get_pos syms ^ " at " ^
43947
9b00f09f7721 defer evaluation of Scan.message, for improved performance in the frequent situation where failure is handled later (e.g. via ||);
wenzelm
parents: 41620
diff changeset
    77
        beginning 10 (map Fdl_Lexer.unparse syms) ^
9b00f09f7721 defer evaluation of Scan.message, for improved performance in the frequent situation where failure is handled later (e.g. via ||);
wenzelm
parents: 41620
diff changeset
    78
        (case msg of NONE => "" | SOME m => "\n" ^ m () ^ " expected");
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    79
  in Scan.!! err scan end;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    80
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    81
fun parse_all p =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    82
  Scan.repeat (Scan.unless (Scan.one Fdl_Lexer.is_eof) (!!! p));
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    83
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    84
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    85
(** parsers **)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    86
43947
9b00f09f7721 defer evaluation of Scan.message, for improved performance in the frequent situation where failure is handled later (e.g. via ||);
wenzelm
parents: 41620
diff changeset
    87
fun group s p = p || Scan.fail_with (K (fn () => s));
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    88
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    89
fun $$$ s = group s
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    90
  (Scan.one (fn t => Fdl_Lexer.kind_of t = Fdl_Lexer.Keyword andalso
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    91
     Fdl_Lexer.content_of t = s) >> K s);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    92
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    93
val identifier = group "identifier"
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    94
  (Scan.one (fn t => Fdl_Lexer.kind_of t = Fdl_Lexer.Ident) >>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    95
     Fdl_Lexer.content_of);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    96
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    97
val long_identifier = group "long identifier"
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    98
  (Scan.one (fn t => Fdl_Lexer.kind_of t = Fdl_Lexer.Long_Ident) >>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
    99
     Fdl_Lexer.content_of);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   100
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   101
fun the_identifier s = group s
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   102
  (Scan.one (fn t => Fdl_Lexer.kind_of t = Fdl_Lexer.Ident andalso
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   103
     Fdl_Lexer.content_of t = s) >> K s);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   104
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   105
fun prfx_identifier g s = group g
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   106
  (Scan.one (fn t => Fdl_Lexer.kind_of t = Fdl_Lexer.Ident andalso
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   107
     can (unprefix s) (Fdl_Lexer.content_of t)) >>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   108
     (unprefix s o Fdl_Lexer.content_of));
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   109
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   110
val mk_identifier = prfx_identifier "identifier \"mk__...\"" "mk__";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   111
val hyp_identifier = prfx_identifier "hypothesis identifer" "H";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   112
val concl_identifier = prfx_identifier "conclusion identifier" "C";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   113
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   114
val number = group "number"
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   115
  (Scan.one (fn t => Fdl_Lexer.kind_of t = Fdl_Lexer.Number) >>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   116
     (the o Int.fromString o Fdl_Lexer.content_of));
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   117
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   118
val traceability = group "traceability information"
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   119
  (Scan.one (fn t => Fdl_Lexer.kind_of t = Fdl_Lexer.Traceability) >>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   120
     Fdl_Lexer.content_of);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   121
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   122
fun enum1 sep scan = scan ::: Scan.repeat ($$$ sep |-- !!! scan);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   123
fun enum sep scan = enum1 sep scan || Scan.succeed [];
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   124
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   125
fun list1 scan = enum1 "," scan;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   126
fun list scan = enum "," scan;
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
(* expressions, see section 4.4 of SPARK Proof Manual *)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   130
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   131
datatype expr =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   132
    Ident of string
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   133
  | Number of int
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   134
  | Quantifier of string * string list * string * expr
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   135
  | Funct of string * expr list
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   136
  | Element of expr * expr list
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   137
  | Update of expr * expr list * expr
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   138
  | Record of string * (string * expr) list
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   139
  | Array of string * expr option *
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   140
      ((expr * expr option) list list * expr) list;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   141
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   142
fun unop (f, x) = Funct (f, [x]);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   143
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   144
fun binop p q = p :|-- (fn x => Scan.optional
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   145
  (q -- !!! p >> (fn (f, y) => Funct (f, [x, y]))) x);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   146
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   147
(* left-associative *)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   148
fun binops opp argp =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   149
  argp -- Scan.repeat (opp -- !!! argp) >> (fn (x, fys) =>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   150
    fold (fn (f, y) => fn x => Funct (f, [x, y])) fys x);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   151
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   152
(* right-associative *)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   153
fun binops' f p = enum1 f p >> foldr1 (fn (x, y) => Funct (f, [x, y]));
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   154
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   155
val multiplying_operator = $$$ "*" || $$$ "/" || $$$ "div" || $$$ "mod";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   156
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   157
val adding_operator = $$$ "+" || $$$ "-";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   158
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   159
val relational_operator =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   160
     $$$ "=" || $$$ "<>"
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   161
  || $$$ "<" || $$$ ">"
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   162
  || $$$ "<="|| $$$ ">=";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   163
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   164
val quantification_kind = $$$ "for_all" || $$$ "for_some";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   165
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   166
val quantification_generator =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   167
  list1 identifier --| $$$ ":" -- identifier;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   168
49998
ad8a6db0b480 Allow parentheses around left-hand sides of array associations
berghofe
parents: 48911
diff changeset
   169
fun opt_parens p = $$$ "(" |-- p --| $$$ ")" || p;
ad8a6db0b480 Allow parentheses around left-hand sides of array associations
berghofe
parents: 48911
diff changeset
   170
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   171
fun expression xs = group "expression"
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   172
  (binop disjunction ($$$ "->" || $$$ "<->")) xs
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   173
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   174
and disjunction xs = binops' "or" conjunction xs
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   175
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   176
and conjunction xs = binops' "and" negation xs
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   177
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   178
and negation xs =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   179
  (   $$$ "not" -- !!! relation >> unop
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   180
   || relation) xs
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   181
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   182
and relation xs = binop sum relational_operator xs
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   183
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   184
and sum xs = binops adding_operator term xs
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   185
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   186
and term xs = binops multiplying_operator factor xs
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   187
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   188
and factor xs =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   189
  (   $$$ "+" |-- !!! primary
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   190
   || $$$ "-" -- !!! primary >> unop
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   191
   || binop primary ($$$ "**")) xs
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   192
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   193
and primary xs = group "primary"
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   194
  (   number >> Number
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   195
   || $$$ "(" |-- !!! (expression --| $$$ ")")
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   196
   || quantified_expression
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   197
   || function_designator
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   198
   || identifier >> Ident) xs
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   199
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   200
and quantified_expression xs = (quantification_kind --
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   201
  !!! ($$$ "(" |-- quantification_generator --|  $$$ "," --
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   202
    expression --| $$$ ")") >> (fn (q, ((xs, T), e)) =>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   203
      Quantifier (q, xs, T, e))) xs
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   204
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   205
and function_designator xs =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   206
  (   mk_identifier --| $$$ "(" :|--
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   207
        (fn s => record_args s || array_args s) --| $$$ ")"
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   208
   || $$$ "element" |-- !!! ($$$ "(" |-- expression --| $$$ "," --| $$$ "[" --
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   209
        list1 expression --| $$$ "]" --| $$$ ")") >> Element
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   210
   || $$$ "update" |-- !!! ($$$ "(" |-- expression --| $$$ "," --| $$$ "[" --
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   211
        list1 expression --| $$$ "]" --| $$$ "," -- expression --| $$$ ")") >>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   212
          (fn ((A, xs), x) => Update (A, xs, x))
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   213
   || identifier --| $$$ "(" -- !!! (list1 expression --| $$$ ")") >> Funct) xs
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   214
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   215
and record_args s xs =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   216
  (list1 (identifier --| $$$ ":=" -- !!! expression) >> (pair s #> Record)) xs
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   217
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   218
and array_args s xs =
49998
ad8a6db0b480 Allow parentheses around left-hand sides of array associations
berghofe
parents: 48911
diff changeset
   219
  (   array_associations >> (fn assocs => Array (s, NONE, assocs))
ad8a6db0b480 Allow parentheses around left-hand sides of array associations
berghofe
parents: 48911
diff changeset
   220
   || expression -- Scan.optional ($$$ "," |-- !!! array_associations) [] >>
ad8a6db0b480 Allow parentheses around left-hand sides of array associations
berghofe
parents: 48911
diff changeset
   221
        (fn (default, assocs) => Array (s, SOME default, assocs))) xs
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   222
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   223
and array_associations xs =
49998
ad8a6db0b480 Allow parentheses around left-hand sides of array associations
berghofe
parents: 48911
diff changeset
   224
  (list1 (opt_parens (enum1 "&" ($$$ "[" |--
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   225
     !!! (list1 (expression -- Scan.option ($$$ ".." |-- !!! expression)) --|
49998
ad8a6db0b480 Allow parentheses around left-hand sides of array associations
berghofe
parents: 48911
diff changeset
   226
       $$$ "]"))) --| $$$ ":=" -- expression)) xs;
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   227
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   228
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   229
(* verification conditions *)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   230
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   231
type vcs = (string * (string *
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   232
  ((string * expr) list * (string * expr) list)) list) list;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   233
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   234
val vc =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   235
  identifier --| $$$ "." -- !!!
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   236
    (   $$$ "***" |-- !!! (the_identifier "true" --| $$$ ".") >>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   237
          (Ident #> pair "1" #> single #> pair [])
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   238
     || $$$ "!!!" |-- !!! (the_identifier "false" --| $$$ ".") >>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   239
          (Ident #> pair "1" #> single #> pair [])
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   240
     || Scan.repeat1 (hyp_identifier --
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   241
          !!! ($$$ ":" |-- expression --| $$$ ".")) --| $$$ "->" --
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   242
        Scan.repeat1 (concl_identifier --
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   243
          !!! ($$$ ":" |-- expression --| $$$ ".")));
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   244
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   245
val subprogram_kind = $$$ "function" || $$$ "procedure";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   246
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   247
val vcs =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   248
  subprogram_kind -- (long_identifier || identifier) --
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   249
  parse_all (traceability -- !!! (Scan.repeat1 vc));
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   250
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   251
fun parse_vcs header pos s =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   252
  s |>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   253
  Fdl_Lexer.tokenize header Fdl_Lexer.c_comment pos ||>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   254
  filter Fdl_Lexer.is_proper ||>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   255
  Scan.finite Fdl_Lexer.stopper (Scan.error (!!! vcs)) ||>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   256
  fst;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   257
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   258
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   259
(* fdl declarations, see section 4.3 of SPARK Proof Manual *)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   260
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   261
datatype fdl_type =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   262
    Basic_Type of string
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   263
  | Enum_Type of string list
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   264
  | Array_Type of string list * string
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   265
  | Record_Type of (string list * string) list
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   266
  | Pending_Type;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   267
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   268
(* also store items in a list to preserve order *)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   269
type 'a tab = 'a Symtab.table * (string * 'a) list;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   270
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   271
fun lookup ((tab, _) : 'a tab) = Symtab.lookup tab;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   272
fun update decl (tab, items) = (Symtab.update_new decl tab, decl :: items);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   273
fun items ((_, items) : 'a tab) = rev items;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   274
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   275
type decls =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   276
  {types: fdl_type tab,
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   277
   vars: string tab,
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   278
   consts: string tab,
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   279
   funs: (string list * string) tab};
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   280
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   281
val empty_decls : decls =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   282
  {types = (Symtab.empty, []), vars = (Symtab.empty, []),
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   283
   consts = (Symtab.empty, []), funs = (Symtab.empty, [])};
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   284
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   285
fun add_type_decl decl {types, vars, consts, funs} =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   286
  {types = update decl types,
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   287
   vars = vars, consts = consts, funs = funs}
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   288
  handle Symtab.DUP s => error ("Duplicate type " ^ s);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   289
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   290
fun add_var_decl (vs, ty) {types, vars, consts, funs} =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   291
  {types = types,
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   292
   vars = fold (update o rpair ty) vs vars,
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   293
   consts = consts, funs = funs}
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   294
  handle Symtab.DUP s => error ("Duplicate variable " ^ s);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   295
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   296
fun add_const_decl decl {types, vars, consts, funs} =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   297
  {types = types, vars = vars,
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   298
   consts = update decl consts,
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   299
   funs = funs}
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   300
  handle Symtab.DUP s => error ("Duplicate constant " ^ s);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   301
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   302
fun add_fun_decl decl {types, vars, consts, funs} =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   303
  {types = types, vars = vars, consts = consts,
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   304
   funs = update decl funs}
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   305
  handle Symtab.DUP s => error ("Duplicate function " ^ s);
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   306
41620
f88eca2e9ebd made SML/NJ happy;
wenzelm
parents: 41561
diff changeset
   307
fun type_decl x = ($$$ "type" |-- !!! (identifier --| $$$ "=" --
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   308
  (   identifier >> Basic_Type
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   309
   || $$$ "(" |-- !!! (list1 identifier --| $$$ ")") >> Enum_Type
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   310
   || $$$ "array" |-- !!! ($$$ "[" |-- list1 identifier --| $$$ "]" --|
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   311
        $$$ "of" -- identifier) >> Array_Type
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   312
   || $$$ "record" |-- !!! (enum1 ";"
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   313
        (list1 identifier -- !!! ($$$ ":" |-- identifier)) --|
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   314
           $$$ "end") >> Record_Type
41620
f88eca2e9ebd made SML/NJ happy;
wenzelm
parents: 41561
diff changeset
   315
   || $$$ "pending" >> K Pending_Type)) >> add_type_decl) x;
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   316
41620
f88eca2e9ebd made SML/NJ happy;
wenzelm
parents: 41561
diff changeset
   317
fun const_decl x = ($$$ "const" |-- !!! (identifier --| $$$ ":" -- identifier --|
f88eca2e9ebd made SML/NJ happy;
wenzelm
parents: 41561
diff changeset
   318
  $$$ "=" --| $$$ "pending") >> add_const_decl) x;
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   319
41620
f88eca2e9ebd made SML/NJ happy;
wenzelm
parents: 41561
diff changeset
   320
fun var_decl x = ($$$ "var" |-- !!! (list1 identifier --| $$$ ":" -- identifier) >>
f88eca2e9ebd made SML/NJ happy;
wenzelm
parents: 41561
diff changeset
   321
  add_var_decl) x;
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   322
41620
f88eca2e9ebd made SML/NJ happy;
wenzelm
parents: 41561
diff changeset
   323
fun fun_decl x = ($$$ "function" |-- !!! (identifier --
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   324
  (Scan.optional ($$$ "(" |-- !!! (list1 identifier --| $$$ ")")) [] --|
41620
f88eca2e9ebd made SML/NJ happy;
wenzelm
parents: 41561
diff changeset
   325
   $$$ ":" -- identifier)) >> add_fun_decl) x;
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   326
41620
f88eca2e9ebd made SML/NJ happy;
wenzelm
parents: 41561
diff changeset
   327
fun declarations x =
47083
d04b38d4035b No longer treat "title" as FDL keyword
berghofe
parents: 46778
diff changeset
   328
 (the_identifier "title" |-- subprogram_kind -- identifier --| $$$ ";" --
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   329
  (Scan.repeat ((type_decl || const_decl || var_decl || fun_decl) --|
46778
wenzelm
parents: 43947
diff changeset
   330
     !!! ($$$ ";")) >> (fn ds => fold I ds empty_decls)) --|
41620
f88eca2e9ebd made SML/NJ happy;
wenzelm
parents: 41561
diff changeset
   331
  $$$ "end" --| $$$ ";") x;
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   332
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   333
fun parse_declarations pos s =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   334
  s |>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   335
  Fdl_Lexer.tokenize (Scan.succeed ()) Fdl_Lexer.curly_comment pos |>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   336
  snd |> filter Fdl_Lexer.is_proper |>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   337
  Scan.finite Fdl_Lexer.stopper (Scan.error (!!! declarations)) |>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   338
  fst;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   339
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   340
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   341
(* rules, see section 5 of SPADE Proof Checker Rules Manual *)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   342
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   343
datatype fdl_rule =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   344
    Inference_Rule of expr list * expr
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   345
  | Substitution_Rule of expr list * expr * expr;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   346
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   347
type rules =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   348
  ((string * int) * fdl_rule) list *
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   349
  (string * (expr * (string * string) list) list) list;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   350
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   351
val condition_list = $$$ "[" |-- list expression --| $$$ "]";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   352
val if_condition_list = $$$ "if" |-- !!! condition_list;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   353
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   354
val rule =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   355
  identifier -- !!! ($$$ "(" |-- number --| $$$ ")" --| $$$ ":" --
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   356
  (expression :|-- (fn e =>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   357
        $$$ "may_be_deduced" >> K (Inference_Rule ([], e))
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   358
     || $$$ "may_be_deduced_from" |--
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   359
          !!! condition_list >> (Inference_Rule o rpair e)
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   360
     || $$$ "may_be_replaced_by" |-- !!! (expression --
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   361
          Scan.optional if_condition_list []) >> (fn (e', cs) =>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   362
            Substitution_Rule (cs, e, e'))
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   363
     || $$$ "&" |-- !!! (expression --| $$$ "are_interchangeable" --
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   364
          Scan.optional if_condition_list []) >> (fn (e', cs) =>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   365
            Substitution_Rule (cs, e, e')))) --| $$$ ".") >>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   366
    (fn (id, (n, rl)) => ((id, n), rl));
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   367
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   368
val rule_family = 
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   369
  $$$ "rule_family" |-- identifier --| $$$ ":" --
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   370
  enum1 "&" (expression -- !!! ($$$ "requires" |-- $$$ "[" |--
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   371
    list (identifier -- !!! ($$$ ":" |-- identifier)) --| $$$ "]")) --|
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   372
  $$$ ".";
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   373
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   374
val rules =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   375
  parse_all (rule >> (apfst o cons) || rule_family >> (apsnd o cons)) >>
46778
wenzelm
parents: 43947
diff changeset
   376
  (fn rls => fold_rev I rls ([], []));
41561
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   377
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   378
fun parse_rules pos s =
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   379
  s |>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   380
  Fdl_Lexer.tokenize (Scan.succeed ())
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   381
    (Fdl_Lexer.c_comment || Fdl_Lexer.percent_comment) pos |>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   382
  snd |> filter Fdl_Lexer.is_proper |>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   383
  Scan.finite Fdl_Lexer.stopper (Scan.error (!!! rules)) |>
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   384
  fst;
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   385
d1318f3c86ba Added new SPARK verification environment.
berghofe
parents:
diff changeset
   386
end;