| author | wenzelm | 
| Fri, 02 Nov 2001 22:02:41 +0100 | |
| changeset 12021 | 8809efda06d3 | 
| parent 11503 | 4c25eef6f325 | 
| child 14174 | f3cafd2929d5 | 
| permissions | -rw-r--r-- | 
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 1 | (* Title: Pure/Isar/args.ML | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 2 | ID: $Id$ | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 3 | Author: Markus Wenzel, TU Muenchen | 
| 8803 | 4 | License: GPL (GNU GENERAL PUBLIC LICENSE) | 
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 5 | |
| 5878 | 6 | Concrete argument syntax (of attributes and methods). | 
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 7 | *) | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 8 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 9 | signature ARGS = | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 10 | sig | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 11 | type T | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 12 | val val_of: T -> string | 
| 5878 | 13 | val pos_of: T -> Position.T | 
| 14 | val str_of: T -> string | |
| 9748 | 15 | val string_of: T -> string | 
| 5878 | 16 | val ident: string * Position.T -> T | 
| 17 | val string: string * Position.T -> T | |
| 18 | val keyword: string * Position.T -> T | |
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 19 | val stopper: T * (T -> bool) | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 20 | val not_eof: T -> bool | 
| 5878 | 21 |   val position: (T list -> 'a * 'b) -> T list -> ('a * Position.T) * 'b
 | 
| 22 | val !!! : (T list -> 'a) -> T list -> 'a | |
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 23 | val $$$ : string -> T list -> string * T list | 
| 10035 | 24 | val add: T list -> string * T list | 
| 25 | val del: T list -> string * T list | |
| 8803 | 26 | val colon: T list -> string * T list | 
| 10035 | 27 | val query: T list -> string * T list | 
| 28 | val bang: T list -> string * T list | |
| 29 | val query_colon: T list -> string * T list | |
| 30 | val bang_colon: T list -> string * T list | |
| 8803 | 31 | val parens: (T list -> 'a * T list) -> T list -> 'a * T list | 
| 10150 | 32 | val bracks: (T list -> 'a * T list) -> T list -> 'a * T list | 
| 9809 | 33 |   val mode: string -> 'a * T list -> bool * ('a * T list)
 | 
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 34 | val name: T list -> string * T list | 
| 8687 | 35 | val name_dummy: T list -> string option * T list | 
| 5878 | 36 | val nat: T list -> int * T list | 
| 9538 | 37 | val int: T list -> int * T list | 
| 5878 | 38 | val var: T list -> indexname * T list | 
| 6447 | 39 |   val enum: string -> ('a * T list -> 'b * ('a * T list)) -> 'a * T list -> 'b list * ('a * T list)
 | 
| 40 |   val enum1: string -> ('a * T list -> 'b * ('a * T list)) -> 'a * T list -> 'b list * ('a * T list)
 | |
| 41 |   val and_list: ('a * T list -> 'b * ('a * T list)) -> 'a * T list -> 'b list * ('a * T list)
 | |
| 42 |   val and_list1: ('a * T list -> 'b * ('a * T list)) -> 'a * T list -> 'b list * ('a * T list)
 | |
| 9504 | 43 | val global_typ_no_norm: theory * T list -> typ * (theory * T list) | 
| 5878 | 44 | val global_typ: theory * T list -> typ * (theory * T list) | 
| 45 | val global_term: theory * T list -> term * (theory * T list) | |
| 46 | val global_prop: theory * T list -> term * (theory * T list) | |
| 9504 | 47 | val local_typ_no_norm: Proof.context * T list -> typ * (Proof.context * T list) | 
| 5878 | 48 | val local_typ: Proof.context * T list -> typ * (Proof.context * T list) | 
| 49 | val local_term: Proof.context * T list -> term * (Proof.context * T list) | |
| 50 | val local_prop: Proof.context * T list -> term * (Proof.context * T list) | |
| 7553 | 51 | val bang_facts: Proof.context * T list -> thm list * (Proof.context * T list) | 
| 8536 | 52 |   val goal_spec: ((int -> tactic) -> tactic) -> ('a * T list)
 | 
| 53 |     -> ((int -> tactic) -> tactic) * ('a * T list)
 | |
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 54 | type src | 
| 5878 | 55 | val src: (string * T list) * Position.T -> src | 
| 56 | val dest_src: src -> (string * T list) * Position.T | |
| 57 | val attribs: T list -> src list * T list | |
| 58 | val opt_attribs: T list -> src list * T list | |
| 8282 | 59 |   val syntax: string -> ('a * T list -> 'b * ('a * T list)) -> src -> 'a -> 'a * 'b
 | 
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 60 | end; | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 61 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 62 | structure Args: ARGS = | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 63 | struct | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 64 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 65 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 66 | (** datatype T **) | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 67 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 68 | datatype kind = Ident | String | Keyword | EOF; | 
| 5878 | 69 | datatype T = Arg of kind * (string * Position.T); | 
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 70 | |
| 5878 | 71 | fun val_of (Arg (_, (x, _))) = x; | 
| 72 | fun pos_of (Arg (_, (_, pos))) = pos; | |
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 73 | |
| 9901 | 74 | fun str_of (Arg (Ident, (x, _))) = x | 
| 5878 | 75 | | str_of (Arg (String, (x, _))) = quote x | 
| 76 | | str_of (Arg (Keyword, (x, _))) = x | |
| 77 | | str_of (Arg (EOF, _)) = "end-of-text"; | |
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 78 | |
| 9748 | 79 | fun string_of (Arg (Ident, (x, _))) = x | 
| 80 | | string_of (Arg (String, (x, _))) = quote x | |
| 81 | | string_of (Arg (Keyword, (x, _))) = x | |
| 82 | | string_of (Arg (EOF, _)) = ""; | |
| 83 | ||
| 5878 | 84 | fun arg kind x_pos = Arg (kind, x_pos); | 
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 85 | val ident = arg Ident; | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 86 | val string = arg String; | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 87 | val keyword = arg Keyword; | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 88 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 89 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 90 | (* eof *) | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 91 | |
| 5878 | 92 | val eof = arg EOF ("", Position.none);
 | 
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 93 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 94 | fun is_eof (Arg (EOF, _)) = true | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 95 | | is_eof _ = false; | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 96 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 97 | val stopper = (eof, is_eof); | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 98 | val not_eof = not o is_eof; | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 99 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 100 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 101 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 102 | (** scanners **) | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 103 | |
| 5878 | 104 | (* position *) | 
| 105 | ||
| 106 | fun position scan = (Scan.ahead (Scan.one not_eof) >> pos_of) -- scan >> Library.swap; | |
| 107 | ||
| 108 | ||
| 109 | (* cut *) | |
| 110 | ||
| 111 | fun !!! scan = | |
| 112 | let | |
| 113 | fun get_pos [] = " (past end-of-text!)" | |
| 114 | | get_pos (Arg (_, (_, pos)) :: _) = Position.str_of pos; | |
| 115 | ||
| 116 | fun err (args, None) = "Argument syntax error" ^ get_pos args | |
| 117 | | err (args, Some msg) = "Argument syntax error" ^ get_pos args ^ ": " ^ msg; | |
| 118 | in Scan.!! err scan end; | |
| 119 | ||
| 120 | ||
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 121 | (* basic *) | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 122 | |
| 5878 | 123 | fun $$$$ x = Scan.one (fn Arg (k, (y, _)) => (k = Ident orelse k = Keyword) andalso x = y); | 
| 124 | fun $$$ x = $$$$ x >> val_of; | |
| 125 | ||
| 10035 | 126 | val add = $$$ "add"; | 
| 127 | val del = $$$ "del"; | |
| 8803 | 128 | val colon = $$$ ":"; | 
| 10035 | 129 | val query = $$$ "?"; | 
| 130 | val bang = $$$ "!"; | |
| 131 | val query_colon = $$$ "?:"; | |
| 132 | val bang_colon = $$$ "!:"; | |
| 133 | ||
| 8803 | 134 | fun parens scan = $$$ "(" |-- scan --| $$$ ")";
 | 
| 10150 | 135 | fun bracks scan = $$$ "[" |-- scan --| $$$ "]"; | 
| 9809 | 136 | fun mode s = Scan.lift (Scan.optional (parens ($$$$ s) >> K true) false); | 
| 8803 | 137 | |
| 5878 | 138 | val name = Scan.one (fn Arg (k, (x, _)) => k = Ident orelse k = String) >> val_of; | 
| 8687 | 139 | val name_dummy = $$$ "_" >> K None || name >> Some; | 
| 5878 | 140 | |
| 8233 | 141 | val keyword_symid = | 
| 142 | Scan.one (fn Arg (k, (x, _)) => k = Keyword andalso OuterLex.is_sid x) >> val_of; | |
| 143 | ||
| 5878 | 144 | fun kind f = Scan.one (K true) :-- | 
| 145 | (fn Arg (Ident, (x, _)) => | |
| 146 | (case f x of Some y => Scan.succeed y | _ => Scan.fail) | |
| 147 | | _ => Scan.fail) >> #2; | |
| 148 | ||
| 149 | val nat = kind Syntax.read_nat; | |
| 9538 | 150 | val int = Scan.optional ($$$ "-" >> K ~1) 1 -- nat >> op *; | 
| 5878 | 151 | val var = kind (apsome #1 o try Term.dest_Var o Syntax.read_var); | 
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 152 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 153 | |
| 5878 | 154 | (* enumerations *) | 
| 155 | ||
| 6447 | 156 | fun enum1 sep scan = scan -- Scan.repeat (Scan.lift ($$$ sep) |-- scan) >> op ::; | 
| 5878 | 157 | fun enum sep scan = enum1 sep scan || Scan.succeed []; | 
| 158 | ||
| 6447 | 159 | fun and_list1 scan = enum1 "and" scan; | 
| 160 | fun and_list scan = enum "and" scan; | |
| 5878 | 161 | |
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 162 | |
| 5878 | 163 | (* terms and types *) | 
| 164 | ||
| 165 | fun gen_item read = Scan.depend (fn st => name >> (pair st o read st)); | |
| 166 | ||
| 9504 | 167 | val global_typ_no_norm = gen_item (ProofContext.read_typ_no_norm o ProofContext.init); | 
| 5878 | 168 | val global_typ = gen_item (ProofContext.read_typ o ProofContext.init); | 
| 169 | val global_term = gen_item (ProofContext.read_term o ProofContext.init); | |
| 170 | val global_prop = gen_item (ProofContext.read_prop o ProofContext.init); | |
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 171 | |
| 9504 | 172 | val local_typ_no_norm = gen_item ProofContext.read_typ_no_norm; | 
| 5878 | 173 | val local_typ = gen_item ProofContext.read_typ; | 
| 174 | val local_term = gen_item ProofContext.read_term; | |
| 175 | val local_prop = gen_item ProofContext.read_prop; | |
| 176 | ||
| 177 | ||
| 7553 | 178 | (* bang facts *) | 
| 179 | ||
| 180 | val bang_facts = Scan.depend (fn ctxt => | |
| 181 | ($$$ "!" >> K (ProofContext.prems_of ctxt) || Scan.succeed []) >> pair ctxt); | |
| 182 | ||
| 183 | ||
| 8536 | 184 | (* goal specification *) | 
| 185 | ||
| 186 | (* range *) | |
| 8233 | 187 | |
| 8536 | 188 | val from_to = | 
| 189 | nat -- ($$$$ "-" |-- nat) >> (fn (i, j) => fn tac => Seq.INTERVAL tac i j) || | |
| 190 | nat --| $$$$ "-" >> (fn i => fn tac => fn st => Seq.INTERVAL tac i (Thm.nprems_of st) st) || | |
| 8549 | 191 | nat >> (fn i => fn tac => tac i) || | 
| 192 | $$$$ "!" >> K ALLGOALS; | |
| 8536 | 193 | |
| 194 | val goal = $$$$ "[" |-- !!! (from_to --| $$$$ "]"); | |
| 195 | fun goal_spec def = Scan.lift (Scan.optional goal def); | |
| 8233 | 196 | |
| 197 | ||
| 5878 | 198 | (* args *) | 
| 199 | ||
| 9126 | 200 | val exclude = explode "()[],"; | 
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 201 | |
| 5878 | 202 | fun atom_arg blk = Scan.one (fn Arg (k, (x, _)) => | 
| 203 | k <> Keyword orelse not (x mem exclude) orelse blk andalso x = ","); | |
| 204 | ||
| 205 | fun paren_args l r scan = $$$$ l -- !!! (scan true -- $$$$ r) | |
| 206 | >> (fn (x, (ys, z)) => x :: ys @ [z]); | |
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 207 | |
| 5878 | 208 | fun args blk x = Scan.optional (args1 blk) [] x | 
| 209 | and args1 blk x = | |
| 210 | ((Scan.repeat1 | |
| 211 | (Scan.repeat1 (atom_arg blk) || | |
| 212 |       paren_args "(" ")" args ||
 | |
| 213 | paren_args "[" "]" args)) >> flat) x; | |
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 214 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 215 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 216 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 217 | (** type src **) | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 218 | |
| 5878 | 219 | datatype src = Src of (string * T list) * Position.T; | 
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 220 | |
| 5878 | 221 | val src = Src; | 
| 222 | fun dest_src (Src src) = src; | |
| 223 | ||
| 224 | fun err_in_src kind msg (Src ((s, args), pos)) = | |
| 11503 | 225 | error (kind ^ " " ^ quote s ^ Position.str_of pos ^ ": " ^ msg ^ "\n " ^ | 
| 5878 | 226 | space_implode " " (map str_of args)); | 
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 227 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 228 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 229 | (* argument syntax *) | 
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 230 | |
| 8282 | 231 | fun syntax kind scan (src as Src ((s, args), pos)) st = | 
| 9901 | 232 | (case Scan.error (Scan.finite' stopper (Scan.option scan)) (st, args) of | 
| 233 | (Some x, (st', [])) => (st', x) | |
| 234 | | (_, (_, args')) => err_in_src kind "bad arguments" (Src ((s, args'), pos))); | |
| 5878 | 235 | |
| 236 | ||
| 237 | (* attribs *) | |
| 238 | ||
| 6447 | 239 | fun list1 scan = scan -- Scan.repeat ($$$ "," |-- scan) >> op ::; | 
| 240 | fun list scan = list1 scan || Scan.succeed []; | |
| 241 | ||
| 8233 | 242 | val attrib = position ((keyword_symid || name) -- !!! (args false)) >> src; | 
| 5878 | 243 | val attribs = $$$ "[" |-- !!! (list attrib --| $$$ "]"); | 
| 244 | val opt_attribs = Scan.optional attribs []; | |
| 5822 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 245 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 246 | |
| 
3f824514ad88
Concrete argument syntax (for attributes, methods etc.).
 wenzelm parents: diff
changeset | 247 | end; |