src/Pure/Isar/outer_parse.ML
changeset 21371 6717630f080b
parent 21314 6d709b9bea1a
child 21400 4788fc8e66ea
--- a/src/Pure/Isar/outer_parse.ML	Tue Nov 14 22:17:01 2006 +0100
+++ b/src/Pure/Isar/outer_parse.ML	Tue Nov 14 22:17:03 2006 +0100
@@ -66,6 +66,7 @@
   val simple_fixes: token list -> (string * string option) list * token list
   val fixes: token list -> (string * string option * mixfix) list * token list
   val for_fixes: token list -> (string * string option * mixfix) list * token list
+  val for_simple_fixes: token list -> (string * string option) list * token list
   val term: token list -> string * token list
   val prop: token list -> string * token list
   val propp: token list -> (string * string list) * token list
@@ -90,8 +91,8 @@
   val locale_target: token list -> xstring * token list
   val opt_locale_target: token list -> xstring option * token list
   val locale_expr: token list -> Locale.expr * token list
-  val locale_expr_unless: (token list -> 'a * token list) -> 
-         token list -> Locale.expr * token list 
+  val locale_expr_unless: (token list -> 'a * token list) ->
+    token list -> Locale.expr * token list
   val locale_keyword: token list -> string * token list
   val locale_element: token list -> Element.context Locale.element * token list
   val context_element: token list -> Element.context * token list
@@ -100,6 +101,10 @@
   val general_statement: token list ->
     (Element.context Locale.element list * Element.statement) * OuterLex.token list
   val statement_keyword: token list -> string * token list
+  val specification: token list ->
+    (string *
+      (((bstring * Attrib.src list) * string list) list * (string * string option) list)) list *
+    token list
   val method: token list -> Method.text * token list
 end;
 
@@ -274,6 +279,7 @@
     params >> map Syntax.no_syn) >> flat;
 
 val for_fixes = Scan.optional ($$$ "for" |-- !!! fixes) [];
+val for_simple_fixes = Scan.optional ($$$ "for" |-- !!! simple_fixes) [];
 
 
 (* terms *)
@@ -381,7 +387,7 @@
 val rename = name -- Scan.option mixfix;
 
 fun expr test =
-  let 
+  let
     fun expr2 x = (xname >> Locale.Locale || $$$ "(" |-- !!! (expr0 --| $$$ ")")) x
     and expr1 x = (expr2 -- Scan.repeat1 (maybe rename) >> Locale.Rename || expr2) x
     and expr0 x = (plus1 test expr1 >> (fn [e] => e | es => Locale.Merge es)) x;
@@ -419,6 +425,11 @@
 val statement_keyword =  $$$ "obtains" || $$$ "shows";
 
 
+(* specifications *)
+
+val specification = enum1 "|" (parname -- (and_list1 spec -- for_simple_fixes));
+
+
 (* proof methods *)
 
 fun is_symid_meth s =