src/Pure/Isar/args.ML
changeset 18037 1095d2213b9d
parent 17104 89d5bbb2f746
child 18635 58bbff56a914
equal deleted inserted replaced
18036:d5d5ad4b78c5 18037:1095d2213b9d
    12     Attribute of theory attribute * ProofContext.context attribute
    12     Attribute of theory attribute * ProofContext.context attribute
    13   type T
    13   type T
    14   val string_of: T -> string
    14   val string_of: T -> string
    15   val mk_ident: string * Position.T -> T
    15   val mk_ident: string * Position.T -> T
    16   val mk_string: string * Position.T -> T
    16   val mk_string: string * Position.T -> T
       
    17   val mk_alt_string: string * Position.T -> T
    17   val mk_keyword: string * Position.T -> T
    18   val mk_keyword: string * Position.T -> T
    18   val mk_name: string -> T
    19   val mk_name: string -> T
    19   val mk_typ: typ -> T
    20   val mk_typ: typ -> T
    20   val mk_term: term -> T
    21   val mk_term: term -> T
    21   val mk_fact: thm list -> T
    22   val mk_fact: thm list -> T
    44   val parens: (T list -> 'a * T list) -> T list -> 'a * T list
    45   val parens: (T list -> 'a * T list) -> T list -> 'a * T list
    45   val bracks: (T list -> 'a * T list) -> T list -> 'a * T list
    46   val bracks: (T list -> 'a * T list) -> T list -> 'a * T list
    46   val mode: string -> 'a * T list -> bool * ('a * T list)
    47   val mode: string -> 'a * T list -> bool * ('a * T list)
    47   val maybe: (T list -> 'a * T list) -> T list -> 'a option * T list
    48   val maybe: (T list -> 'a * T list) -> T list -> 'a option * T list
    48   val name: T list -> string * T list
    49   val name: T list -> string * T list
       
    50   val alt_name: T list -> string * T list
    49   val symbol: T list -> string * T list
    51   val symbol: T list -> string * T list
    50   val liberal_name: T list -> string * T list
    52   val liberal_name: T list -> string * T list
    51   val nat: T list -> int * T list
    53   val nat: T list -> int * T list
    52   val int: T list -> int * T list
    54   val int: T list -> int * T list
    53   val var: T list -> indexname * T list
    55   val var: T list -> indexname * T list
   100 (*An argument token is a symbol (with raw string value), together with
   102 (*An argument token is a symbol (with raw string value), together with
   101   an optional assigned internal value.  Note that an assignable ref
   103   an optional assigned internal value.  Note that an assignable ref
   102   designates an intermediate state of internalization -- it is NOT
   104   designates an intermediate state of internalization -- it is NOT
   103   meant to persist.*)
   105   meant to persist.*)
   104 
   106 
   105 datatype kind = Ident | String | Keyword | EOF;
   107 datatype kind = Ident | String | AltString | Keyword | EOF;
   106 
   108 
   107 type symbol = kind * string * Position.T;
   109 type symbol = kind * string * Position.T;
   108 
   110 
   109 datatype value =
   111 datatype value =
   110   Name of string |
   112   Name of string |
   119   Assignable of value option ref;
   121   Assignable of value option ref;
   120 
   122 
   121 datatype T = Arg of symbol * slot;
   123 datatype T = Arg of symbol * slot;
   122 
   124 
   123 fun string_of (Arg ((Ident, x, _), _)) = x
   125 fun string_of (Arg ((Ident, x, _), _)) = x
   124   | string_of (Arg ((String, x, _), _)) = Library.quote x
   126   | string_of (Arg ((String, x, _), _)) = quote x
       
   127   | string_of (Arg ((AltString, x, _), _)) = enclose "`" "`" x
   125   | string_of (Arg ((Keyword, x, _), _)) = x
   128   | string_of (Arg ((Keyword, x, _), _)) = x
   126   | string_of (Arg ((EOF, _, _), _)) = "";
   129   | string_of (Arg ((EOF, _, _), _)) = "";
   127 
   130 
   128 fun sym_of (Arg ((_, x, _), _)) = x;
   131 fun sym_of (Arg ((_, x, _), _)) = x;
   129 fun pos_of (Arg ((_, _, pos), _)) = pos;
   132 fun pos_of (Arg ((_, _, pos), _)) = pos;
   134 fun mk_symbol k (x, p) = Arg ((k, x, p), Empty);
   137 fun mk_symbol k (x, p) = Arg ((k, x, p), Empty);
   135 fun mk_value k v = Arg ((Keyword, k, Position.none), Value (SOME v));
   138 fun mk_value k v = Arg ((Keyword, k, Position.none), Value (SOME v));
   136 
   139 
   137 val mk_ident = mk_symbol Ident;
   140 val mk_ident = mk_symbol Ident;
   138 val mk_string = mk_symbol String;
   141 val mk_string = mk_symbol String;
       
   142 val mk_alt_string = mk_symbol AltString;
   139 val mk_keyword = mk_symbol Keyword;
   143 val mk_keyword = mk_symbol Keyword;
   140 val mk_name = mk_value "<name>" o Name;
   144 val mk_name = mk_value "<name>" o Name;
   141 val mk_typ = mk_value "<typ>" o Typ;
   145 val mk_typ = mk_value "<typ>" o Typ;
   142 val mk_term = mk_value "<term>" o Term;
   146 val mk_term = mk_value "<term>" o Term;
   143 val mk_fact = mk_value "<fact>" o Fact;
   147 val mk_fact = mk_value "<fact>" o Fact;
   224 fun some_ident f =
   228 fun some_ident f =
   225   touch (Scan.some (fn Arg ((Ident, x, _), _) => f x | _ => NONE));
   229   touch (Scan.some (fn Arg ((Ident, x, _), _) => f x | _ => NONE));
   226 
   230 
   227 val named =
   231 val named =
   228   touch (Scan.one (fn Arg ((k, _, _), _) => k = Ident orelse k = String));
   232   touch (Scan.one (fn Arg ((k, _, _), _) => k = Ident orelse k = String));
       
   233 
       
   234 val alt_string =
       
   235   touch (Scan.one (fn Arg ((k, _, _), _) => k = AltString));
   229 
   236 
   230 val symbolic =
   237 val symbolic =
   231   touch (Scan.one (fn Arg ((k, x, _), _) => k = Keyword andalso OuterLex.is_sid x));
   238   touch (Scan.one (fn Arg ((k, x, _), _) => k = Keyword andalso OuterLex.is_sid x));
   232 
   239 
   233 fun &&& x =
   240 fun &&& x =
   249 fun bracks scan = $$$ "[" |-- scan --| $$$ "]";
   256 fun bracks scan = $$$ "[" |-- scan --| $$$ "]";
   250 fun mode s = Scan.lift (Scan.optional (parens ($$$ s) >> K true) false);
   257 fun mode s = Scan.lift (Scan.optional (parens ($$$ s) >> K true) false);
   251 fun maybe scan = $$$ "_" >> K NONE || scan >> SOME;
   258 fun maybe scan = $$$ "_" >> K NONE || scan >> SOME;
   252 
   259 
   253 val name = named >> sym_of;
   260 val name = named >> sym_of;
       
   261 val alt_name = alt_string >> sym_of;
   254 val symbol = symbolic >> sym_of;
   262 val symbol = symbolic >> sym_of;
   255 val liberal_name = symbol || name;
   263 val liberal_name = symbol || name;
   256 
   264 
   257 val nat = some_ident Syntax.read_nat;
   265 val nat = some_ident Syntax.read_nat;
   258 val int = Scan.optional ($$$ "-" >> K ~1) 1 -- nat >> op *;
   266 val int = Scan.optional ($$$ "-" >> K ~1) 1 -- nat >> op *;
   287 val internal_attribute = value (fn Attribute att => att);
   295 val internal_attribute = value (fn Attribute att => att);
   288 
   296 
   289 fun named_name intern = internal_name || named >> evaluate Name intern;
   297 fun named_name intern = internal_name || named >> evaluate Name intern;
   290 fun named_typ readT = internal_typ || named >> evaluate Typ readT;
   298 fun named_typ readT = internal_typ || named >> evaluate Typ readT;
   291 fun named_term read = internal_term || named >> evaluate Term read;
   299 fun named_term read = internal_term || named >> evaluate Term read;
   292 fun named_fact get = internal_fact || named >> evaluate Fact get;
   300 fun named_fact get = internal_fact || (alt_string || named) >> evaluate Fact get;
   293 
   301 
   294 
   302 
   295 (* terms and types *)
   303 (* terms and types *)
   296 
   304 
   297 val global_typ_abbrev = Scan.peek (named_typ o ProofContext.read_typ_abbrev o ProofContext.init);
   305 val global_typ_abbrev = Scan.peek (named_typ o ProofContext.read_typ_abbrev o ProofContext.init);