replaced simple_text by fully-featured parse_args;
authorwenzelm
Sat, 28 Jun 2008 21:21:17 +0200
changeset 27383 cbb4dafea38a
parent 27382 b1285021424e
child 27384 bbb68fea688f
replaced simple_text by fully-featured parse_args;
src/Pure/Isar/method.ML
--- a/src/Pure/Isar/method.ML	Sat Jun 28 21:21:15 2008 +0200
+++ b/src/Pure/Isar/method.ML	Sat Jun 28 21:21:17 2008 +0200
@@ -82,7 +82,6 @@
   val method_setup: bstring -> string * Position.T -> string -> theory -> theory
   val syntax: (Context.generic * Args.T list -> 'a * (Context.generic * Args.T list))
     -> src -> Proof.context -> 'a * Proof.context
-  val simple_text: Args.T list -> text * Args.T list
   val simple_args: (Args.T list -> 'a * Args.T list)
     -> ('a -> Proof.context -> method) -> src -> Proof.context -> method
   val ctxt_args: (Proof.context -> method) -> src -> Proof.context -> method
@@ -114,6 +113,7 @@
   val goal_args_ctxt': (Context.generic * Args.T list -> 'a * (Context.generic * Args.T list)) ->
     (Proof.context -> 'a -> int -> tactic) -> src -> Proof.context -> method
   val parse: OuterLex.token list -> text * OuterLex.token list
+  val parse_args: Args.T list -> text * Args.T list
 end;
 
 structure Method: METHOD =
@@ -474,11 +474,6 @@
 
 fun syntax scan = Args.context_syntax "method" scan;
 
-val simple_text = (Args.$$$ "(" |-- Args.name
-    -- Scan.repeat (Scan.one (fn x => not (Args.string_of x = ")"))) --| Args.$$$ ")"
-  || Args.name -- Scan.succeed [])
-  >> (fn (name, args) => Source (Args.src ((name, args), Position.none)));
-
 fun simple_args scan f src ctxt : method =
   fst (syntax (Scan.lift (scan >> (fn x => f x ctxt))) src ctxt);
 
@@ -603,14 +598,14 @@
 
 (* outer parser *)
 
-local
-
 structure T = OuterLex;
 structure P = OuterParse;
 
 fun is_symid_meth s =
   s <> "|" andalso s <> "?" andalso s <> "+" andalso T.is_sid s;
 
+local
+
 fun meth4 x =
  (P.position (P.xname >> rpair []) >> (Source o Args.src) ||
   P.$$$ "(" |-- P.!!! (meth0 --| P.$$$ ")")) x
@@ -620,7 +615,7 @@
   meth4 -- (P.$$$ "[" |-- Scan.optional P.nat 1 --| P.$$$ "]") >> (SelectGoals o swap) ||
   meth4) x
 and meth2 x =
- (P.position (P.xname -- P.args1 is_symid_meth false) >> (Source o Args.src) ||
+ (P.position (P.xname -- P.generic_args1 is_symid_meth) >> (Source o Args.src) ||
   meth3) x
 and meth1 x = (P.enum1 "," meth2 >> (fn [m] => m | ms => Then ms)) x
 and meth0 x = (P.enum1 "|" meth1 >> (fn [m] => m | ms => Orelse ms)) x;
@@ -628,6 +623,30 @@
 in val parse = meth3 end;
 
 
+(* args parser *)
+
+local
+
+fun enum1 sep scan = scan ::: Scan.repeat (Args.$$$ sep |-- scan);
+
+fun meth4 x =
+ (Args.position (Args.name >> rpair []) >> (Source o Args.src) ||
+  Args.$$$ "(" |-- Args.!!! (meth0 --| Args.$$$ ")")) x
+and meth3 x =
+ (meth4 --| Args.$$$ "?" >> Try ||
+  meth4 --| Args.$$$ "+" >> Repeat1 ||
+  meth4 -- (Args.$$$ "[" |-- Scan.optional Args.nat 1 --| Args.$$$ "]") >> (SelectGoals o swap) ||
+  meth4) x
+and meth2 x =
+ (Args.position (Args.name -- Args.generic_args1 is_symid_meth) >> (Source o Args.src) ||
+  meth3) x
+and meth1 x = (enum1 "," meth2 >> (fn [m] => m | ms => Then ms)) x
+and meth0 x = (enum1 "|" meth1 >> (fn [m] => m | ms => Orelse ms)) x;
+
+in val parse_args = meth3 end;
+
+
+
 (*final declarations of this structure!*)
 val unfold = unfold_meth;
 val fold = fold_meth;