src/Pure/Isar/args.ML
changeset 53113 d9ba3417cb41
parent 53112 04d8af9ff64b
child 53168 d998de7f0efc
equal deleted inserted replaced
53112:04d8af9ff64b 53113:d9ba3417cb41
   223 fun goal_spec x = Scan.lift (Scan.optional goal (fn tac => tac 1)) x;
   223 fun goal_spec x = Scan.lift (Scan.optional goal (fn tac => tac 1)) x;
   224 
   224 
   225 
   225 
   226 (* arguments within outer syntax *)
   226 (* arguments within outer syntax *)
   227 
   227 
       
   228 val argument_kinds =
       
   229  [Token.Ident, Token.LongIdent, Token.SymIdent, Token.Var, Token.TypeIdent, Token.TypeVar,
       
   230   Token.Nat, Token.Float, Token.String, Token.AltString, Token.Verbatim];
       
   231 
   228 fun parse_args is_symid =
   232 fun parse_args is_symid =
   229   let
   233   let
   230     val keyword_symid = token (Parse.keyword_with is_symid);
   234     fun argument blk =
   231     fun atom blk = Parse.group (fn () => "argument")
   235       Parse.group (fn () => "argument")
   232       (ident || keyword_symid || string || alt_string || token Parse.float_number ||
   236         (Scan.one (fn tok =>
   233         (if blk then token (Parse.$$$ ",") else Scan.fail));
   237           let val kind = Token.kind_of tok in
       
   238             member (op =) argument_kinds kind orelse
       
   239             Token.keyword_with is_symid tok orelse
       
   240             (blk andalso Token.keyword_with (fn s => s = ",") tok)
       
   241           end));
   234 
   242 
   235     fun args blk x = Scan.optional (args1 blk) [] x
   243     fun args blk x = Scan.optional (args1 blk) [] x
   236     and args1 blk x =
   244     and args1 blk x =
   237       ((Scan.repeat1
   245       ((Scan.repeat1
   238         (Scan.repeat1 (atom blk) ||
   246         (Scan.repeat1 (argument blk) ||
   239           argsp "(" ")" ||
   247           argsp "(" ")" ||
   240           argsp "[" "]")) >> flat) x
   248           argsp "[" "]")) >> flat) x
   241     and argsp l r x =
   249     and argsp l r x =
   242       (token (Parse.$$$ l) ::: Parse.!!! (args true @@@ (token (Parse.$$$ r) >> single))) x;
   250       (token (Parse.$$$ l) ::: Parse.!!! (args true @@@ (token (Parse.$$$ r) >> single))) x;
   243   in (args, args1) end;
   251   in (args, args1) end;