| author | Fabian Huch <huch@in.tum.de> | 
| Fri, 15 Mar 2024 17:57:03 +0100 | |
| changeset 79899 | c73a36081b1c | 
| parent 74373 | 6e4093927dbb | 
| permissions | -rw-r--r-- | 
| 30587 
ad19c99529eb
moved Isar/antiquote.ML to General/antiquote.ML, which is loaded early;
 wenzelm parents: 
30573diff
changeset | 1 | (* Title: Pure/General/antiquote.ML | 
| 55511 
984e210d412e
antiquotations within plain text: Scala version in accordance to ML;
 wenzelm parents: 
55107diff
changeset | 2 | Author: Makarius | 
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 3 | |
| 55511 
984e210d412e
antiquotations within plain text: Scala version in accordance to ML;
 wenzelm parents: 
55107diff
changeset | 4 | Antiquotations within plain text. | 
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 5 | *) | 
| 
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 | signature ANTIQUOTE = | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 8 | sig | 
| 61473 
34d1913f0b20
clarified control antiquotations: decode control symbol to get name;
 wenzelm parents: 
61471diff
changeset | 9 |   type control = {range: Position.range, name: string * Position.T, body: Symbol_Pos.T list}
 | 
| 74373 
6e4093927dbb
outer syntax: support for control-cartouche tokens;
 wenzelm parents: 
73551diff
changeset | 10 | val no_control: control | 
| 
6e4093927dbb
outer syntax: support for control-cartouche tokens;
 wenzelm parents: 
73551diff
changeset | 11 | val control_symbols: control -> Symbol_Pos.T list | 
| 61473 
34d1913f0b20
clarified control antiquotations: decode control symbol to get name;
 wenzelm parents: 
61471diff
changeset | 12 |   type antiq = {start: Position.T, stop: Position.T, range: Position.range, body: Symbol_Pos.T list}
 | 
| 
34d1913f0b20
clarified control antiquotations: decode control symbol to get name;
 wenzelm parents: 
61471diff
changeset | 13 | datatype 'a antiquote = Text of 'a | Control of control | Antiq of antiq | 
| 73551 | 14 | val is_text: 'a antiquote -> bool | 
| 15 | val the_text: string -> 'a antiquote -> 'a | |
| 61434 | 16 | type text_antiquote = Symbol_Pos.T list antiquote | 
| 67467 | 17 | val text_antiquote_range: text_antiquote -> Position.range | 
| 18 | val text_range: text_antiquote list -> Position.range | |
| 61434 | 19 | val split_lines: text_antiquote list -> text_antiquote list list | 
| 61457 | 20 | val antiq_reports: 'a antiquote list -> Position.report list | 
| 69592 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 21 | val update_reports: bool -> Position.T -> string list -> Position.report_text list | 
| 74373 
6e4093927dbb
outer syntax: support for control-cartouche tokens;
 wenzelm parents: 
73551diff
changeset | 22 | val err_prefix: string | 
| 
6e4093927dbb
outer syntax: support for control-cartouche tokens;
 wenzelm parents: 
73551diff
changeset | 23 | val scan_control: string -> control scanner | 
| 67426 | 24 | val scan_antiq: antiq scanner | 
| 25 | val scan_antiquote: text_antiquote scanner | |
| 67571 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 26 | val scan_antiquote_comments: text_antiquote scanner | 
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 27 | val parse_comments: Position.T -> Symbol_Pos.T list -> text_antiquote list | 
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 28 | val read_comments: Input.source -> text_antiquote list | 
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 29 | end; | 
| 
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 | structure Antiquote: ANTIQUOTE = | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 32 | struct | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 33 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 34 | (* datatype antiquote *) | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 35 | |
| 61473 
34d1913f0b20
clarified control antiquotations: decode control symbol to get name;
 wenzelm parents: 
61471diff
changeset | 36 | type control = {range: Position.range, name: string * Position.T, body: Symbol_Pos.T list};
 | 
| 74373 
6e4093927dbb
outer syntax: support for control-cartouche tokens;
 wenzelm parents: 
73551diff
changeset | 37 | val no_control = {range = Position.no_range, name = ("", Position.none), body = []};
 | 
| 
6e4093927dbb
outer syntax: support for control-cartouche tokens;
 wenzelm parents: 
73551diff
changeset | 38 | fun control_symbols ({name = (name, pos), body, ...}: control) =
 | 
| 
6e4093927dbb
outer syntax: support for control-cartouche tokens;
 wenzelm parents: 
73551diff
changeset | 39 | (Symbol.encode (Symbol.Control name), pos) :: body; | 
| 
6e4093927dbb
outer syntax: support for control-cartouche tokens;
 wenzelm parents: 
73551diff
changeset | 40 | |
| 61473 
34d1913f0b20
clarified control antiquotations: decode control symbol to get name;
 wenzelm parents: 
61471diff
changeset | 41 | type antiq = {start: Position.T, stop: Position.T, range: Position.range, body: Symbol_Pos.T list};
 | 
| 
34d1913f0b20
clarified control antiquotations: decode control symbol to get name;
 wenzelm parents: 
61471diff
changeset | 42 | datatype 'a antiquote = Text of 'a | Control of control | Antiq of antiq; | 
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 43 | |
| 73551 | 44 | val is_text = fn Text _ => true | _ => false; | 
| 45 | ||
| 46 | fun the_text msg antiq = | |
| 47 | let fun err pos = error (msg ^ Position.here pos) in | |
| 48 | (case antiq of | |
| 49 | Text x => x | |
| 50 |     | Control {range, ...} => err (#1 range)
 | |
| 51 |     | Antiq {range, ...} => err (#1 range))
 | |
| 52 | end; | |
| 73550 
2f6855142a8c
support for ML special forms: modified evaluation similar to Scheme;
 wenzelm parents: 
69891diff
changeset | 53 | |
| 61434 | 54 | type text_antiquote = Symbol_Pos.T list antiquote; | 
| 55 | ||
| 67467 | 56 | fun text_antiquote_range (Text ss) = Symbol_Pos.range ss | 
| 57 |   | text_antiquote_range (Control {range, ...}) = range
 | |
| 58 |   | text_antiquote_range (Antiq {range, ...}) = range;
 | |
| 61450 | 59 | |
| 67467 | 60 | fun text_range ants = | 
| 61450 | 61 | if null ants then Position.no_range | 
| 67467 | 62 | else | 
| 63 | Position.range (#1 (text_antiquote_range (hd ants)), #2 (text_antiquote_range (List.last ants))); | |
| 61450 | 64 | |
| 61434 | 65 | |
| 66 | (* split lines *) | |
| 67 | ||
| 68 | fun split_lines input = | |
| 69 | let | |
| 70 | fun add a (line, lines) = (a :: line, lines); | |
| 71 | fun flush (line, lines) = ([], rev line :: lines); | |
| 72 | fun split (a as Text ss) = | |
| 67522 | 73 |           (case chop_prefix (fn ("\n", _) => false | _ => true) ss of
 | 
| 61434 | 74 | ([], []) => I | 
| 75 | | (_, []) => add a | |
| 76 | | ([], _ :: rest) => flush #> split (Text rest) | |
| 77 | | (prefix, _ :: rest) => add (Text prefix) #> flush #> split (Text rest)) | |
| 78 | | split a = add a; | |
| 61440 | 79 | in if null input then [] else rev (#2 (flush (fold split input ([], [])))) end; | 
| 61434 | 80 | |
| 27342 | 81 | |
| 44736 | 82 | (* reports *) | 
| 30641 
72980f8d7ee8
export report -- version that actually covers all cases;
 wenzelm parents: 
30635diff
changeset | 83 | |
| 61457 | 84 | fun antiq_reports ants = ants |> maps | 
| 61471 | 85 | (fn Text _ => [] | 
| 61473 
34d1913f0b20
clarified control antiquotations: decode control symbol to get name;
 wenzelm parents: 
61471diff
changeset | 86 |     | Control {range = (pos, _), ...} => [(pos, Markup.antiquoted)]
 | 
| 
34d1913f0b20
clarified control antiquotations: decode control symbol to get name;
 wenzelm parents: 
61471diff
changeset | 87 |     | Antiq {start, stop, range = (pos, _), ...} =>
 | 
| 61471 | 88 | [(start, Markup.antiquote), | 
| 89 | (stop, Markup.antiquote), | |
| 90 | (pos, Markup.antiquoted), | |
| 91 | (pos, Markup.language_antiquotation)]); | |
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 92 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 93 | |
| 69592 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 94 | (* update *) | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 95 | |
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 96 | fun update_reports embedded pos src = | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 97 | let | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 98 | val n = length src; | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 99 | val no_arg = n = 1; | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 100 | val embedded_arg = n = 2 andalso embedded; | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 101 | val control = | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 102 | (case src of | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 103 | name :: _ => | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 104 | if Symbol.is_ascii_identifier name andalso name <> "cartouche" andalso | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 105 | (no_arg orelse embedded_arg) | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 106 | then SOME (Symbol.control_prefix ^ name ^ Symbol.control_suffix) | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 107 | else NONE | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 108 | | [] => NONE); | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 109 | val arg = if embedded_arg then cartouche (nth src 1) else ""; | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 110 | in | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 111 | (case control of | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 112 | SOME sym => [((pos, Markup.update), sym ^ arg)] | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 113 | | NONE => []) | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 114 | end; | 
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 115 | |
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 116 | |
| 
a80d8ec6c998
support for isabelle update -u control_cartouches;
 wenzelm parents: 
67735diff
changeset | 117 | |
| 30590 
1d9c9fcf8513
parameterized datatype antiquote and read operation;
 wenzelm parents: 
30589diff
changeset | 118 | (* scan *) | 
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 119 | |
| 30573 | 120 | open Basic_Symbol_Pos; | 
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 121 | |
| 74373 
6e4093927dbb
outer syntax: support for control-cartouche tokens;
 wenzelm parents: 
73551diff
changeset | 122 | val err_prefix = "Antiquotation lexical error: "; | 
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 123 | |
| 74373 
6e4093927dbb
outer syntax: support for control-cartouche tokens;
 wenzelm parents: 
73551diff
changeset | 124 | local | 
| 48764 | 125 | |
| 67193 | 126 | val scan_nl = Scan.one (fn (s, _) => s = "\n") >> single; | 
| 67571 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 127 | val scan_nl_opt = Scan.optional scan_nl []; | 
| 67193 | 128 | |
| 67571 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 129 | val scan_plain_txt = | 
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 130 | Scan.many1 (fn (s, _) => | 
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 131 | not (Comment.is_symbol s) andalso | 
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 132 | not (Symbol.is_control s) andalso | 
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 133 | s <> Symbol.open_ andalso | 
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 134 | s <> "@" andalso | 
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 135 | s <> "\n" andalso | 
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 136 | Symbol.not_eof s) || | 
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 137 | Scan.one (Comment.is_symbol o Symbol_Pos.symbol) >> single || | 
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 138 |   $$$ "@" --| Scan.ahead (~$$ "{");
 | 
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 139 | |
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 140 | val scan_text = | 
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 141 | scan_nl || Scan.repeats1 scan_plain_txt @@@ scan_nl_opt; | 
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 142 | |
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 143 | val scan_text_comments = | 
| 69891 
def3ec9cdb7e
document markers are formal comments, and may thus occur anywhere in the command-span;
 wenzelm parents: 
69592diff
changeset | 144 | scan_nl || Scan.repeats1 (Comment.scan_inner >> #2 || scan_plain_txt) @@@ scan_nl_opt; | 
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 145 | |
| 55512 | 146 | val scan_antiq_body = | 
| 48764 | 147 | Scan.trace (Symbol_Pos.scan_string_qq err_prefix || Symbol_Pos.scan_string_bq err_prefix) >> #2 || | 
| 61481 | 148 | Symbol_Pos.scan_cartouche err_prefix || | 
| 69891 
def3ec9cdb7e
document markers are formal comments, and may thus occur anywhere in the command-span;
 wenzelm parents: 
69592diff
changeset | 149 | Comment.scan_inner -- | 
| 67735 
e2e002d4a4de
clarified syntax: reject formal comments explicitly, instead of ignoring them silently;
 wenzelm parents: 
67571diff
changeset | 150 | Symbol_Pos.!!! (fn () => err_prefix ^ "bad formal comment in antiquote body") Scan.fail | 
| 
e2e002d4a4de
clarified syntax: reject formal comments explicitly, instead of ignoring them silently;
 wenzelm parents: 
67571diff
changeset | 151 | >> K [] || | 
| 58854 | 152 | Scan.one (fn (s, _) => s <> "}" andalso Symbol.not_eof s) >> single; | 
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 153 | |
| 61491 
97261e6c1d42
another antiquotation short form: undecorated cartouche as alias for @{text};
 wenzelm parents: 
61481diff
changeset | 154 | fun control_name sym = (case Symbol.decode sym of Symbol.Control name => name); | 
| 
97261e6c1d42
another antiquotation short form: undecorated cartouche as alias for @{text};
 wenzelm parents: 
61481diff
changeset | 155 | |
| 42508 
e21362bf1d93
allow nested @{antiq} (nonterminal) and @@{antiq} terminal;
 wenzelm parents: 
42503diff
changeset | 156 | in | 
| 
e21362bf1d93
allow nested @{antiq} (nonterminal) and @@{antiq} terminal;
 wenzelm parents: 
42503diff
changeset | 157 | |
| 74373 
6e4093927dbb
outer syntax: support for control-cartouche tokens;
 wenzelm parents: 
73551diff
changeset | 158 | fun scan_control err = | 
| 61491 
97261e6c1d42
another antiquotation short form: undecorated cartouche as alias for @{text};
 wenzelm parents: 
61481diff
changeset | 159 | Scan.option (Scan.one (Symbol.is_control o Symbol_Pos.symbol)) -- | 
| 74373 
6e4093927dbb
outer syntax: support for control-cartouche tokens;
 wenzelm parents: 
73551diff
changeset | 160 | Symbol_Pos.scan_cartouche err >> | 
| 61491 
97261e6c1d42
another antiquotation short form: undecorated cartouche as alias for @{text};
 wenzelm parents: 
61481diff
changeset | 161 | (fn (opt_control, body) => | 
| 61473 
34d1913f0b20
clarified control antiquotations: decode control symbol to get name;
 wenzelm parents: 
61471diff
changeset | 162 | let | 
| 61491 
97261e6c1d42
another antiquotation short form: undecorated cartouche as alias for @{text};
 wenzelm parents: 
61481diff
changeset | 163 | val (name, range) = | 
| 
97261e6c1d42
another antiquotation short form: undecorated cartouche as alias for @{text};
 wenzelm parents: 
61481diff
changeset | 164 | (case opt_control of | 
| 
97261e6c1d42
another antiquotation short form: undecorated cartouche as alias for @{text};
 wenzelm parents: 
61481diff
changeset | 165 | SOME (sym, pos) => ((control_name sym, pos), Symbol_Pos.range ((sym, pos) :: body)) | 
| 
97261e6c1d42
another antiquotation short form: undecorated cartouche as alias for @{text};
 wenzelm parents: 
61481diff
changeset | 166 |           | NONE => (("cartouche", #2 (hd body)), Symbol_Pos.range body));
 | 
| 61595 | 167 |       in {name = name, range = range, body = body} end) ||
 | 
| 168 | Scan.one (Symbol.is_control o Symbol_Pos.symbol) >> | |
| 169 | (fn (sym, pos) => | |
| 170 |       {name = (control_name sym, pos), range = Symbol_Pos.range [(sym, pos)], body = []});
 | |
| 61471 | 171 | |
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 172 | val scan_antiq = | 
| 55526 | 173 |   Symbol_Pos.scan_pos -- ($$ "@" |-- $$ "{" |-- Symbol_Pos.scan_pos --
 | 
| 48764 | 174 | Symbol_Pos.!!! (fn () => err_prefix ^ "missing closing brace") | 
| 61476 | 175 | (Scan.repeats scan_antiq_body -- Symbol_Pos.scan_pos -- ($$ "}" |-- Symbol_Pos.scan_pos))) >> | 
| 61473 
34d1913f0b20
clarified control antiquotations: decode control symbol to get name;
 wenzelm parents: 
61471diff
changeset | 176 | (fn (pos1, (pos2, ((body, pos3), pos4))) => | 
| 62797 | 177 |       {start = Position.range_position (pos1, pos2),
 | 
| 178 | stop = Position.range_position (pos3, pos4), | |
| 179 | range = Position.range (pos1, pos4), | |
| 61476 | 180 | body = body}); | 
| 30590 
1d9c9fcf8513
parameterized datatype antiquote and read operation;
 wenzelm parents: 
30589diff
changeset | 181 | |
| 61471 | 182 | val scan_antiquote = | 
| 74373 
6e4093927dbb
outer syntax: support for control-cartouche tokens;
 wenzelm parents: 
73551diff
changeset | 183 | scan_text >> Text || scan_control err_prefix >> Control || scan_antiq >> Antiq; | 
| 67571 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 184 | |
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 185 | val scan_antiquote_comments = | 
| 74373 
6e4093927dbb
outer syntax: support for control-cartouche tokens;
 wenzelm parents: 
73551diff
changeset | 186 | scan_text_comments >> Text || scan_control err_prefix >> Control || scan_antiq >> Antiq; | 
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 187 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 188 | end; | 
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 189 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 190 | |
| 67571 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 191 | (* parse and read (with formal comments) *) | 
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 192 | |
| 67571 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 193 | fun parse_comments pos syms = | 
| 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 194 | (case Scan.read Symbol_Pos.stopper (Scan.repeat scan_antiquote_comments) syms of | 
| 62749 | 195 | SOME ants => ants | 
| 61456 | 196 |   | NONE => error ("Malformed quotation/antiquotation source" ^ Position.here pos));
 | 
| 197 | ||
| 67571 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 198 | fun read_comments source = | 
| 62749 | 199 | let | 
| 67571 
f858fe5531ac
more uniform treatment of formal comments within document source;
 wenzelm parents: 
67522diff
changeset | 200 | val ants = parse_comments (Input.pos_of source) (Input.source_explode source); | 
| 62749 | 201 | val _ = Position.reports (antiq_reports ants); | 
| 202 | in ants end; | |
| 9138 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 203 | |
| 
6a4fae41a75f
Text with antiquotations of inner items (terms, types etc.).
 wenzelm parents: diff
changeset | 204 | end; |