| author | wenzelm | 
| Sun, 15 Oct 2023 14:22:37 +0200 | |
| changeset 78782 | c44171d372a1 | 
| parent 74887 | 56247fdb8bbb | 
| child 80307 | 718daea1cf99 | 
| permissions | -rw-r--r-- | 
| 22106 | 1 | (* Title: Pure/Thy/thy_header.ML | 
| 46939 | 2 | Author: Makarius | 
| 22106 | 3 | |
| 46939 | 4 | Static theory header information. | 
| 22106 | 5 | *) | 
| 6 | ||
| 7 | signature THY_HEADER = | |
| 8 | sig | |
| 63429 | 9 | type keywords = ((string * Position.T) * Keyword.spec) list | 
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46737diff
changeset | 10 | type header = | 
| 48927 
ef462b5558eb
theory def/ref position reports, which enable hyperlinks etc.;
 wenzelm parents: 
48881diff
changeset | 11 |    {name: string * Position.T,
 | 
| 
ef462b5558eb
theory def/ref position reports, which enable hyperlinks etc.;
 wenzelm parents: 
48881diff
changeset | 12 | imports: (string * Position.T) list, | 
| 51294 
0850d43cb355
discontinued obsolete header "files" -- these are loaded explicitly after exploring dependencies;
 wenzelm parents: 
51293diff
changeset | 13 | keywords: keywords} | 
| 
0850d43cb355
discontinued obsolete header "files" -- these are loaded explicitly after exploring dependencies;
 wenzelm parents: 
51293diff
changeset | 14 | val make: string * Position.T -> (string * Position.T) list -> keywords -> header | 
| 59735 | 15 | val theoryN: string | 
| 58928 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 16 | val bootstrap_keywords: Keyword.keywords | 
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 17 | val add_keywords: keywords -> theory -> theory | 
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 18 | val get_keywords: theory -> Keyword.keywords | 
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 19 | val get_keywords': Proof.context -> Keyword.keywords | 
| 62895 
54c2abe7e9a4
treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
 wenzelm parents: 
62849diff
changeset | 20 | val ml_bootstrapN: string | 
| 62932 
db12de2367ca
support ROOT0.ML as well -- independently of ROOT.ML;
 wenzelm parents: 
62895diff
changeset | 21 | val ml_roots: string list | 
| 63022 | 22 | val bootstrap_thys: string list | 
| 66771 
925d10a7a610
clarified error for bad session-qualified imports;
 wenzelm parents: 
65999diff
changeset | 23 | val is_base_name: string -> bool | 
| 65452 | 24 | val import_name: string -> string | 
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46737diff
changeset | 25 | val args: header parser | 
| 67500 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 26 | val read_tokens: Position.T -> Token.T list -> header | 
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46737diff
changeset | 27 | val read: Position.T -> string -> header | 
| 22106 | 28 | end; | 
| 29 | ||
| 32466 | 30 | structure Thy_Header: THY_HEADER = | 
| 22106 | 31 | struct | 
| 32 | ||
| 58928 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 33 | (** keyword declarations **) | 
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 34 | |
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 35 | (* header *) | 
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 36 | |
| 63429 | 37 | type keywords = ((string * Position.T) * Keyword.spec) list; | 
| 48874 
ff9cd47be39b
refined Thy_Load.check_thy: find more uses in body text, based on keywords;
 wenzelm parents: 
48864diff
changeset | 38 | |
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46737diff
changeset | 39 | type header = | 
| 48927 
ef462b5558eb
theory def/ref position reports, which enable hyperlinks etc.;
 wenzelm parents: 
48881diff
changeset | 40 |  {name: string * Position.T,
 | 
| 
ef462b5558eb
theory def/ref position reports, which enable hyperlinks etc.;
 wenzelm parents: 
48881diff
changeset | 41 | imports: (string * Position.T) list, | 
| 51294 
0850d43cb355
discontinued obsolete header "files" -- these are loaded explicitly after exploring dependencies;
 wenzelm parents: 
51293diff
changeset | 42 | keywords: keywords}; | 
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46737diff
changeset | 43 | |
| 51294 
0850d43cb355
discontinued obsolete header "files" -- these are loaded explicitly after exploring dependencies;
 wenzelm parents: 
51293diff
changeset | 44 | fun make name imports keywords : header = | 
| 
0850d43cb355
discontinued obsolete header "files" -- these are loaded explicitly after exploring dependencies;
 wenzelm parents: 
51293diff
changeset | 45 |   {name = name, imports = imports, keywords = keywords};
 | 
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46737diff
changeset | 46 | |
| 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46737diff
changeset | 47 | |
| 58928 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 48 | (* bootstrap keywords *) | 
| 22106 | 49 | |
| 58868 
c5e1cce7ace3
uniform heading commands work in any context, even in theory header;
 wenzelm parents: 
58864diff
changeset | 50 | val chapterN = "chapter"; | 
| 
c5e1cce7ace3
uniform heading commands work in any context, even in theory header;
 wenzelm parents: 
58864diff
changeset | 51 | val sectionN = "section"; | 
| 
c5e1cce7ace3
uniform heading commands work in any context, even in theory header;
 wenzelm parents: 
58864diff
changeset | 52 | val subsectionN = "subsection"; | 
| 
c5e1cce7ace3
uniform heading commands work in any context, even in theory header;
 wenzelm parents: 
58864diff
changeset | 53 | val subsubsectionN = "subsubsection"; | 
| 61463 | 54 | val paragraphN = "paragraph"; | 
| 55 | val subparagraphN = "subparagraph"; | |
| 58999 
ed09ae4ea2d8
uniform treatment of all document markup commands: 'text' and 'txt' merely differ in LaTeX style;
 wenzelm parents: 
58932diff
changeset | 56 | val textN = "text"; | 
| 
ed09ae4ea2d8
uniform treatment of all document markup commands: 'text' and 'txt' merely differ in LaTeX style;
 wenzelm parents: 
58932diff
changeset | 57 | val txtN = "txt"; | 
| 
ed09ae4ea2d8
uniform treatment of all document markup commands: 'text' and 'txt' merely differ in LaTeX style;
 wenzelm parents: 
58932diff
changeset | 58 | val text_rawN = "text_raw"; | 
| 58868 
c5e1cce7ace3
uniform heading commands work in any context, even in theory header;
 wenzelm parents: 
58864diff
changeset | 59 | |
| 22106 | 60 | val theoryN = "theory"; | 
| 61 | val importsN = "imports"; | |
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46737diff
changeset | 62 | val keywordsN = "keywords"; | 
| 63579 | 63 | val abbrevsN = "abbrevs"; | 
| 22106 | 64 | val beginN = "begin"; | 
| 65 | ||
| 58928 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 66 | val bootstrap_keywords = | 
| 58903 | 67 | Keyword.empty_keywords | 
| 58928 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 68 | |> Keyword.add_keywords | 
| 64556 | 69 |     [(("%", \<^here>), Keyword.no_spec),
 | 
| 70 |      (("(", \<^here>), Keyword.no_spec),
 | |
| 71 |      ((")", \<^here>), Keyword.no_spec),
 | |
| 72 |      ((",", \<^here>), Keyword.no_spec),
 | |
| 73 |      (("::", \<^here>), Keyword.no_spec),
 | |
| 74 |      (("=", \<^here>), Keyword.no_spec),
 | |
| 75 |      (("and", \<^here>), Keyword.no_spec),
 | |
| 76 | ((beginN, \<^here>), Keyword.quasi_command_spec), | |
| 77 | ((importsN, \<^here>), Keyword.quasi_command_spec), | |
| 78 | ((keywordsN, \<^here>), Keyword.quasi_command_spec), | |
| 79 | ((abbrevsN, \<^here>), Keyword.quasi_command_spec), | |
| 67139 
8fe0aba577af
explicit tag for document commands: avoid implicit use of document_tags;
 wenzelm parents: 
67136diff
changeset | 80 | ((chapterN, \<^here>), Keyword.document_heading_spec), | 
| 
8fe0aba577af
explicit tag for document commands: avoid implicit use of document_tags;
 wenzelm parents: 
67136diff
changeset | 81 | ((sectionN, \<^here>), Keyword.document_heading_spec), | 
| 
8fe0aba577af
explicit tag for document commands: avoid implicit use of document_tags;
 wenzelm parents: 
67136diff
changeset | 82 | ((subsectionN, \<^here>), Keyword.document_heading_spec), | 
| 
8fe0aba577af
explicit tag for document commands: avoid implicit use of document_tags;
 wenzelm parents: 
67136diff
changeset | 83 | ((subsubsectionN, \<^here>), Keyword.document_heading_spec), | 
| 
8fe0aba577af
explicit tag for document commands: avoid implicit use of document_tags;
 wenzelm parents: 
67136diff
changeset | 84 | ((paragraphN, \<^here>), Keyword.document_heading_spec), | 
| 
8fe0aba577af
explicit tag for document commands: avoid implicit use of document_tags;
 wenzelm parents: 
67136diff
changeset | 85 | ((subparagraphN, \<^here>), Keyword.document_heading_spec), | 
| 
8fe0aba577af
explicit tag for document commands: avoid implicit use of document_tags;
 wenzelm parents: 
67136diff
changeset | 86 | ((textN, \<^here>), Keyword.document_body_spec), | 
| 
8fe0aba577af
explicit tag for document commands: avoid implicit use of document_tags;
 wenzelm parents: 
67136diff
changeset | 87 | ((txtN, \<^here>), Keyword.document_body_spec), | 
| 74671 | 88 | ((text_rawN, \<^here>), Keyword.command_spec (Keyword.document_raw, ["document"])), | 
| 89 | ((theoryN, \<^here>), Keyword.command_spec (Keyword.thy_begin, ["theory"])), | |
| 90 |      (("ML", \<^here>), Keyword.command_spec (Keyword.thy_decl, ["ML"]))];
 | |
| 58928 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 91 | |
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 92 | |
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 93 | (* theory data *) | 
| 22106 | 94 | |
| 58928 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 95 | structure Data = Theory_Data | 
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 96 | ( | 
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 97 | type T = Keyword.keywords; | 
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 98 | val empty = bootstrap_keywords; | 
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 99 | val merge = Keyword.merge_keywords; | 
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 100 | ); | 
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 101 | |
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 102 | val add_keywords = Data.map o Keyword.add_keywords; | 
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 103 | |
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 104 | val get_keywords = Data.get; | 
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 105 | val get_keywords' = get_keywords o Proof_Context.theory_of; | 
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 106 | |
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 107 | |
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 108 | |
| 
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
 wenzelm parents: 
58924diff
changeset | 109 | (** concrete syntax **) | 
| 22106 | 110 | |
| 62895 
54c2abe7e9a4
treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
 wenzelm parents: 
62849diff
changeset | 111 | (* names *) | 
| 
54c2abe7e9a4
treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
 wenzelm parents: 
62849diff
changeset | 112 | |
| 
54c2abe7e9a4
treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
 wenzelm parents: 
62849diff
changeset | 113 | val ml_bootstrapN = "ML_Bootstrap"; | 
| 62932 
db12de2367ca
support ROOT0.ML as well -- independently of ROOT.ML;
 wenzelm parents: 
62895diff
changeset | 114 | val ml_roots = ["ML_Root0", "ML_Root"]; | 
| 63022 | 115 | val bootstrap_thys = ["Bootstrap_Pure", "Bootstrap_ML_Bootstrap"]; | 
| 62932 
db12de2367ca
support ROOT0.ML as well -- independently of ROOT.ML;
 wenzelm parents: 
62895diff
changeset | 116 | |
| 66771 
925d10a7a610
clarified error for bad session-qualified imports;
 wenzelm parents: 
65999diff
changeset | 117 | fun is_base_name s = | 
| 
925d10a7a610
clarified error for bad session-qualified imports;
 wenzelm parents: 
65999diff
changeset | 118 | s <> "" andalso not (exists_string (member (op =) ["/", "\\", ":"]) s) | 
| 
925d10a7a610
clarified error for bad session-qualified imports;
 wenzelm parents: 
65999diff
changeset | 119 | |
| 67164 | 120 | fun import_name s = | 
| 121 | if String.isSuffix ".thy" s then | |
| 122 |     error ("Malformed theory import: " ^ quote s)
 | |
| 69366 | 123 | else Path.file_name (Path.explode s); | 
| 62895 
54c2abe7e9a4
treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
 wenzelm parents: 
62849diff
changeset | 124 | |
| 
54c2abe7e9a4
treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
 wenzelm parents: 
62849diff
changeset | 125 | |
| 22106 | 126 | (* header args *) | 
| 127 | ||
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46737diff
changeset | 128 | local | 
| 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46737diff
changeset | 129 | |
| 59694 | 130 | fun imports name = | 
| 131 | if name = Context.PureN then Scan.succeed [] | |
| 69349 
7cef9e386ffe
more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
 wenzelm parents: 
67722diff
changeset | 132 | else Parse.$$$ importsN |-- Parse.!!! (Scan.repeat1 Parse.theory_name); | 
| 53962 
65bca53daf70
more robust parser: 'imports' are mandatory except for bootstrapping Pure;
 wenzelm parents: 
51627diff
changeset | 133 | |
| 72765 | 134 | val load_command = | 
| 74671 | 135 |   Scan.optional (Parse.$$$ "(" |-- Parse.!!! (Parse.position Parse.name) --| Parse.$$$ ")")
 | 
| 136 |     ("", Position.none);
 | |
| 50128 
599c935aac82
alternative completion for outer syntax keywords;
 wenzelm parents: 
48992diff
changeset | 137 | |
| 48864 
3ee314ae1e0a
added keyword kind "thy_load" (with optional list of file extensions);
 wenzelm parents: 
48707diff
changeset | 138 | val keyword_spec = | 
| 
3ee314ae1e0a
added keyword kind "thy_load" (with optional list of file extensions);
 wenzelm parents: 
48707diff
changeset | 139 | Parse.group (fn () => "outer syntax keyword specification") | 
| 74671 | 140 | ((Parse.name -- load_command) -- Document_Source.old_tags) >> | 
| 141 |       (fn ((a, b), c) => {kind = a, load_command = b, tags = c});
 | |
| 48864 
3ee314ae1e0a
added keyword kind "thy_load" (with optional list of file extensions);
 wenzelm parents: 
48707diff
changeset | 142 | |
| 46939 | 143 | val keyword_decl = | 
| 69349 
7cef9e386ffe
more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
 wenzelm parents: 
67722diff
changeset | 144 | Scan.repeat1 Parse.string_position -- | 
| 63579 | 145 | Scan.optional (Parse.$$$ "::" |-- Parse.!!! keyword_spec) Keyword.no_spec | 
| 146 | >> (fn (names, spec) => map (rpair spec) names); | |
| 147 | ||
| 67722 
012f1e8a1209
allow multiple entries of and_list (on both sides);
 wenzelm parents: 
67500diff
changeset | 148 | val abbrevs = | 
| 
012f1e8a1209
allow multiple entries of and_list (on both sides);
 wenzelm parents: 
67500diff
changeset | 149 | Parse.and_list1 | 
| 74887 | 150 | (Scan.repeat1 Parse.embedded -- (Parse.$$$ "=" |-- Parse.!!! (Scan.repeat1 Parse.embedded)) | 
| 67722 
012f1e8a1209
allow multiple entries of and_list (on both sides);
 wenzelm parents: 
67500diff
changeset | 151 | >> uncurry (map_product pair)) >> flat; | 
| 50128 
599c935aac82
alternative completion for outer syntax keywords;
 wenzelm parents: 
48992diff
changeset | 152 | |
| 46939 | 153 | val keyword_decls = Parse.and_list1 keyword_decl >> flat; | 
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46737diff
changeset | 154 | |
| 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46737diff
changeset | 155 | in | 
| 22106 | 156 | |
| 157 | val args = | |
| 69349 
7cef9e386ffe
more accurate positions for "name" (quoted string) and "embedded" (cartouche): refer to content without delimiters, which is e.g. relevant for systematic selection/renaming of scope groups;
 wenzelm parents: 
67722diff
changeset | 158 | Parse.theory_name :|-- (fn (name, pos) => | 
| 59694 | 159 | imports name -- | 
| 53962 
65bca53daf70
more robust parser: 'imports' are mandatory except for bootstrapping Pure;
 wenzelm parents: 
51627diff
changeset | 160 | Scan.optional (Parse.$$$ keywordsN |-- Parse.!!! keyword_decls) [] --| | 
| 63579 | 161 | (Scan.optional (Parse.$$$ abbrevsN |-- Parse.!!! abbrevs) [] -- Parse.$$$ beginN) | 
| 162 | >> (fn (imports, keywords) => make (name, pos) imports keywords)); | |
| 46938 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46737diff
changeset | 163 | |
| 
cda018294515
some support for outer syntax keyword declarations within theory header;
 wenzelm parents: 
46737diff
changeset | 164 | end; | 
| 22106 | 165 | |
| 166 | ||
| 167 | (* read header *) | |
| 168 | ||
| 58868 
c5e1cce7ace3
uniform heading commands work in any context, even in theory header;
 wenzelm parents: 
58864diff
changeset | 169 | val heading = | 
| 67136 | 170 | (Parse.command_name chapterN || | 
| 171 | Parse.command_name sectionN || | |
| 172 | Parse.command_name subsectionN || | |
| 173 | Parse.command_name subsubsectionN || | |
| 174 | Parse.command_name paragraphN || | |
| 175 | Parse.command_name subparagraphN || | |
| 176 | Parse.command_name textN || | |
| 177 | Parse.command_name txtN || | |
| 178 | Parse.command_name text_rawN) -- | |
| 69891 
def3ec9cdb7e
document markers are formal comments, and may thus occur anywhere in the command-span;
 wenzelm parents: 
69887diff
changeset | 179 | (Document_Source.annotation |-- Parse.!!! Parse.document_source); | 
| 58868 
c5e1cce7ace3
uniform heading commands work in any context, even in theory header;
 wenzelm parents: 
58864diff
changeset | 180 | |
| 67500 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 181 | val parse_header = | 
| 69891 
def3ec9cdb7e
document markers are formal comments, and may thus occur anywhere in the command-span;
 wenzelm parents: 
69887diff
changeset | 182 | (Scan.repeat heading -- Parse.command_name theoryN --| Document_Source.annotation) | 
| 69887 | 183 | |-- Parse.!!! args; | 
| 22106 | 184 | |
| 67500 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 185 | fun read_tokens pos toks = | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 186 | filter Token.is_proper toks | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 187 | |> Source.of_list | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 188 | |> Source.source Token.stopper (Scan.single (Scan.error (Parse.!!! parse_header))) | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 189 | |> Source.get_single | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 190 |   |> (fn SOME (header, _) => header | NONE => error ("Unexpected end of input" ^ Position.here pos));
 | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 191 | |
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 192 | local | 
| 48927 
ef462b5558eb
theory def/ref position reports, which enable hyperlinks etc.;
 wenzelm parents: 
48881diff
changeset | 193 | |
| 67500 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 194 | fun read_header pos text = | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 195 | Symbol_Pos.explode (text, pos) | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 196 |   |> Token.tokenize bootstrap_keywords {strict = false}
 | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 197 | |> read_tokens pos; | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 198 | |
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 199 | val approx_length = 1024; | 
| 22106 | 200 | |
| 67500 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 201 | in | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 202 | |
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 203 | fun read pos text = | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 204 | if size text <= approx_length then read_header pos text | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 205 | else | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 206 | let val approx_text = String.substring (text, 0, approx_length) in | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 207 | if String.isSuffix "begin" approx_text then read_header pos text | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 208 | else (read_header pos approx_text handle ERROR _ => read_header pos text) | 
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 209 | end; | 
| 48927 
ef462b5558eb
theory def/ref position reports, which enable hyperlinks etc.;
 wenzelm parents: 
48881diff
changeset | 210 | |
| 22106 | 211 | end; | 
| 67500 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 212 | |
| 
dfde99d59f6e
tuned: prefer list operations over Source.source;
 wenzelm parents: 
67164diff
changeset | 213 | end; |