| author | nipkow | 
| Wed, 02 Feb 2005 10:16:33 +0100 | |
| changeset 15485 | e93a3badc2bc | 
| parent 14981 | e73f8140af78 | 
| child 19305 | 5c16895d548b | 
| permissions | -rw-r--r-- | 
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 1 | (* Title: Pure/Isar/antiquote.ML | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 2 | ID: $Id$ | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 3 | Author: Markus Wenzel, TU Muenchen | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 4 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 5 | Text with antiquotations of inner items (terms, types etc.). | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 6 | *) | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 7 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 8 | signature ANTIQUOTE = | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 9 | sig | 
| 12881 | 10 | exception ANTIQUOTE_FAIL of (string * Position.T) * exn | 
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 11 | datatype antiquote = Text of string | Antiq of string * Position.T | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 12 | val is_antiq: antiquote -> bool | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 13 | val antiquotes_of: string * Position.T -> antiquote list | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 14 | end; | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 15 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 16 | structure Antiquote: ANTIQUOTE = | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 17 | struct | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 18 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 19 | (* datatype antiquote *) | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 20 | |
| 12881 | 21 | exception ANTIQUOTE_FAIL of (string * Position.T) * exn; | 
| 22 | ||
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 23 | datatype antiquote = | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 24 | Text of string | | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 25 | Antiq of string * Position.T; | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 26 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 27 | fun is_antiq (Text _) = false | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 28 | | is_antiq (Antiq _) = true; | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 29 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 30 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 31 | (* scan_antiquote *) | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 32 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 33 | local | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 34 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 35 | structure T = OuterLex; | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 36 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 37 | val scan_txt = | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 38 | T.scan_blank || | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 39 |   T.keep_line ($$ "@" --| Scan.ahead (Scan.one (not_equal "{"))) ||
 | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 40 | T.keep_line (Scan.one (not_equal "@" andf Symbol.not_sync andf Symbol.not_eof)); | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 41 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 42 | fun escape "\\" = "\\\\" | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 43 | | escape "\"" = "\\\"" | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 44 | | escape s = s; | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 45 | |
| 14598 
7009f59711e3
Replaced quote by Library.quote, since quote now refers to Symbol.quote
 berghofe parents: 
12881diff
changeset | 46 | val quote_escape = Library.quote o implode o map escape o Symbol.explode; | 
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 47 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 48 | val scan_ant = | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 49 | T.scan_blank || | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 50 | T.scan_string >> quote_escape || | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 51 | T.keep_line (Scan.one (not_equal "}" andf Symbol.not_sync andf Symbol.not_eof)); | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 52 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 53 | val scan_antiq = | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 54 |   T.keep_line ($$ "@" -- $$ "{") |--
 | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 55 | T.!!! "missing closing brace of antiquotation" | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 56 | (Scan.repeat scan_ant >> implode) --| T.keep_line ($$ "}"); | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 57 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 58 | in | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 59 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 60 | fun scan_antiquote (pos, ss) = (pos, ss) |> | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 61 | (Scan.repeat1 scan_txt >> (Text o implode) || | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 62 | scan_antiq >> (fn s => Antiq (s, pos))); | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 63 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 64 | end; | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 65 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 66 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 67 | (* antiquotes_of *) | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 68 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 69 | fun antiquotes_of (s, pos) = | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 70 | (case Scan.error (Scan.finite' Symbol.stopper (Scan.repeat scan_antiquote)) | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 71 | (pos, Symbol.explode s) of | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 72 | (xs, (_, [])) => xs | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 73 |   | (_, (pos', ss)) => error ("Malformed quotation/antiquotation text at: " ^
 | 
| 14729 | 74 | quote (Symbol.beginning 10 ss) ^ Position.str_of pos')); | 
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 75 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 76 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 77 | end; |