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; |