author | wenzelm |
Thu, 06 Jun 2024 12:53:02 +0200 | |
changeset 80268 | 979f3893aa37 |
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:
46737
diff
changeset
|
10 |
type header = |
48927
ef462b5558eb
theory def/ref position reports, which enable hyperlinks etc.;
wenzelm
parents:
48881
diff
changeset
|
11 |
{name: string * Position.T, |
ef462b5558eb
theory def/ref position reports, which enable hyperlinks etc.;
wenzelm
parents:
48881
diff
changeset
|
12 |
imports: (string * Position.T) list, |
51294
0850d43cb355
discontinued obsolete header "files" -- these are loaded explicitly after exploring dependencies;
wenzelm
parents:
51293
diff
changeset
|
13 |
keywords: keywords} |
0850d43cb355
discontinued obsolete header "files" -- these are loaded explicitly after exploring dependencies;
wenzelm
parents:
51293
diff
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:
58924
diff
changeset
|
16 |
val bootstrap_keywords: Keyword.keywords |
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
17 |
val add_keywords: keywords -> theory -> theory |
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
18 |
val get_keywords: theory -> Keyword.keywords |
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
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:
62849
diff
changeset
|
20 |
val ml_bootstrapN: string |
62932
db12de2367ca
support ROOT0.ML as well -- independently of ROOT.ML;
wenzelm
parents:
62895
diff
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:
65999
diff
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:
46737
diff
changeset
|
25 |
val args: header parser |
67500
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
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:
46737
diff
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:
58924
diff
changeset
|
33 |
(** keyword declarations **) |
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
34 |
|
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
35 |
(* header *) |
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
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:
48864
diff
changeset
|
38 |
|
46938
cda018294515
some support for outer syntax keyword declarations within theory header;
wenzelm
parents:
46737
diff
changeset
|
39 |
type header = |
48927
ef462b5558eb
theory def/ref position reports, which enable hyperlinks etc.;
wenzelm
parents:
48881
diff
changeset
|
40 |
{name: string * Position.T, |
ef462b5558eb
theory def/ref position reports, which enable hyperlinks etc.;
wenzelm
parents:
48881
diff
changeset
|
41 |
imports: (string * Position.T) list, |
51294
0850d43cb355
discontinued obsolete header "files" -- these are loaded explicitly after exploring dependencies;
wenzelm
parents:
51293
diff
changeset
|
42 |
keywords: keywords}; |
46938
cda018294515
some support for outer syntax keyword declarations within theory header;
wenzelm
parents:
46737
diff
changeset
|
43 |
|
51294
0850d43cb355
discontinued obsolete header "files" -- these are loaded explicitly after exploring dependencies;
wenzelm
parents:
51293
diff
changeset
|
44 |
fun make name imports keywords : header = |
0850d43cb355
discontinued obsolete header "files" -- these are loaded explicitly after exploring dependencies;
wenzelm
parents:
51293
diff
changeset
|
45 |
{name = name, imports = imports, keywords = keywords}; |
46938
cda018294515
some support for outer syntax keyword declarations within theory header;
wenzelm
parents:
46737
diff
changeset
|
46 |
|
cda018294515
some support for outer syntax keyword declarations within theory header;
wenzelm
parents:
46737
diff
changeset
|
47 |
|
58928
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
48 |
(* bootstrap keywords *) |
22106 | 49 |
|
58868
c5e1cce7ace3
uniform heading commands work in any context, even in theory header;
wenzelm
parents:
58864
diff
changeset
|
50 |
val chapterN = "chapter"; |
c5e1cce7ace3
uniform heading commands work in any context, even in theory header;
wenzelm
parents:
58864
diff
changeset
|
51 |
val sectionN = "section"; |
c5e1cce7ace3
uniform heading commands work in any context, even in theory header;
wenzelm
parents:
58864
diff
changeset
|
52 |
val subsectionN = "subsection"; |
c5e1cce7ace3
uniform heading commands work in any context, even in theory header;
wenzelm
parents:
58864
diff
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:
58932
diff
changeset
|
56 |
val textN = "text"; |
ed09ae4ea2d8
uniform treatment of all document markup commands: 'text' and 'txt' merely differ in LaTeX style;
wenzelm
parents:
58932
diff
changeset
|
57 |
val txtN = "txt"; |
ed09ae4ea2d8
uniform treatment of all document markup commands: 'text' and 'txt' merely differ in LaTeX style;
wenzelm
parents:
58932
diff
changeset
|
58 |
val text_rawN = "text_raw"; |
58868
c5e1cce7ace3
uniform heading commands work in any context, even in theory header;
wenzelm
parents:
58864
diff
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:
46737
diff
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:
58924
diff
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:
58924
diff
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:
67136
diff
changeset
|
80 |
((chapterN, \<^here>), Keyword.document_heading_spec), |
8fe0aba577af
explicit tag for document commands: avoid implicit use of document_tags;
wenzelm
parents:
67136
diff
changeset
|
81 |
((sectionN, \<^here>), Keyword.document_heading_spec), |
8fe0aba577af
explicit tag for document commands: avoid implicit use of document_tags;
wenzelm
parents:
67136
diff
changeset
|
82 |
((subsectionN, \<^here>), Keyword.document_heading_spec), |
8fe0aba577af
explicit tag for document commands: avoid implicit use of document_tags;
wenzelm
parents:
67136
diff
changeset
|
83 |
((subsubsectionN, \<^here>), Keyword.document_heading_spec), |
8fe0aba577af
explicit tag for document commands: avoid implicit use of document_tags;
wenzelm
parents:
67136
diff
changeset
|
84 |
((paragraphN, \<^here>), Keyword.document_heading_spec), |
8fe0aba577af
explicit tag for document commands: avoid implicit use of document_tags;
wenzelm
parents:
67136
diff
changeset
|
85 |
((subparagraphN, \<^here>), Keyword.document_heading_spec), |
8fe0aba577af
explicit tag for document commands: avoid implicit use of document_tags;
wenzelm
parents:
67136
diff
changeset
|
86 |
((textN, \<^here>), Keyword.document_body_spec), |
8fe0aba577af
explicit tag for document commands: avoid implicit use of document_tags;
wenzelm
parents:
67136
diff
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:
58924
diff
changeset
|
91 |
|
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
92 |
|
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
93 |
(* theory data *) |
22106 | 94 |
|
58928
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
95 |
structure Data = Theory_Data |
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
96 |
( |
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
97 |
type T = Keyword.keywords; |
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
98 |
val empty = bootstrap_keywords; |
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
99 |
val merge = Keyword.merge_keywords; |
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
100 |
); |
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
101 |
|
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
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:
58924
diff
changeset
|
103 |
|
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
104 |
val get_keywords = Data.get; |
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
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:
58924
diff
changeset
|
106 |
|
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
107 |
|
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
108 |
|
23d0ffd48006
plain value Keywords.keywords, which might be used outside theory for bootstrap purposes;
wenzelm
parents:
58924
diff
changeset
|
109 |
(** concrete syntax **) |
22106 | 110 |
|
62895
54c2abe7e9a4
treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
wenzelm
parents:
62849
diff
changeset
|
111 |
(* names *) |
54c2abe7e9a4
treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
wenzelm
parents:
62849
diff
changeset
|
112 |
|
54c2abe7e9a4
treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
wenzelm
parents:
62849
diff
changeset
|
113 |
val ml_bootstrapN = "ML_Bootstrap"; |
62932
db12de2367ca
support ROOT0.ML as well -- independently of ROOT.ML;
wenzelm
parents:
62895
diff
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:
62895
diff
changeset
|
116 |
|
66771
925d10a7a610
clarified error for bad session-qualified imports;
wenzelm
parents:
65999
diff
changeset
|
117 |
fun is_base_name s = |
925d10a7a610
clarified error for bad session-qualified imports;
wenzelm
parents:
65999
diff
changeset
|
118 |
s <> "" andalso not (exists_string (member (op =) ["/", "\\", ":"]) s) |
925d10a7a610
clarified error for bad session-qualified imports;
wenzelm
parents:
65999
diff
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:
62849
diff
changeset
|
124 |
|
54c2abe7e9a4
treat ROOT.ML as theory with header "theory ML_Root imports ML_Bootstrap begin";
wenzelm
parents:
62849
diff
changeset
|
125 |
|
22106 | 126 |
(* header args *) |
127 |
||
46938
cda018294515
some support for outer syntax keyword declarations within theory header;
wenzelm
parents:
46737
diff
changeset
|
128 |
local |
cda018294515
some support for outer syntax keyword declarations within theory header;
wenzelm
parents:
46737
diff
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:
67722
diff
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:
51627
diff
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:
48992
diff
changeset
|
137 |
|
48864
3ee314ae1e0a
added keyword kind "thy_load" (with optional list of file extensions);
wenzelm
parents:
48707
diff
changeset
|
138 |
val keyword_spec = |
3ee314ae1e0a
added keyword kind "thy_load" (with optional list of file extensions);
wenzelm
parents:
48707
diff
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:
48707
diff
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:
67722
diff
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:
67500
diff
changeset
|
148 |
val abbrevs = |
012f1e8a1209
allow multiple entries of and_list (on both sides);
wenzelm
parents:
67500
diff
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:
67500
diff
changeset
|
151 |
>> uncurry (map_product pair)) >> flat; |
50128
599c935aac82
alternative completion for outer syntax keywords;
wenzelm
parents:
48992
diff
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:
46737
diff
changeset
|
154 |
|
cda018294515
some support for outer syntax keyword declarations within theory header;
wenzelm
parents:
46737
diff
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:
67722
diff
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:
51627
diff
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:
46737
diff
changeset
|
163 |
|
cda018294515
some support for outer syntax keyword declarations within theory header;
wenzelm
parents:
46737
diff
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:
58864
diff
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:
69887
diff
changeset
|
179 |
(Document_Source.annotation |-- Parse.!!! Parse.document_source); |
58868
c5e1cce7ace3
uniform heading commands work in any context, even in theory header;
wenzelm
parents:
58864
diff
changeset
|
180 |
|
67500
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
181 |
val parse_header = |
69891
def3ec9cdb7e
document markers are formal comments, and may thus occur anywhere in the command-span;
wenzelm
parents:
69887
diff
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:
67164
diff
changeset
|
185 |
fun read_tokens pos toks = |
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
186 |
filter Token.is_proper toks |
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
187 |
|> Source.of_list |
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
188 |
|> Source.source Token.stopper (Scan.single (Scan.error (Parse.!!! parse_header))) |
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
189 |
|> Source.get_single |
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
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:
67164
diff
changeset
|
191 |
|
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
192 |
local |
48927
ef462b5558eb
theory def/ref position reports, which enable hyperlinks etc.;
wenzelm
parents:
48881
diff
changeset
|
193 |
|
67500
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
194 |
fun read_header pos text = |
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
195 |
Symbol_Pos.explode (text, pos) |
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
196 |
|> Token.tokenize bootstrap_keywords {strict = false} |
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
197 |
|> read_tokens pos; |
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
198 |
|
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
199 |
val approx_length = 1024; |
22106 | 200 |
|
67500
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
201 |
in |
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
202 |
|
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
203 |
fun read pos text = |
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
204 |
if size text <= approx_length then read_header pos text |
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
205 |
else |
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
206 |
let val approx_text = String.substring (text, 0, approx_length) in |
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
207 |
if String.isSuffix "begin" approx_text then read_header pos text |
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
208 |
else (read_header pos approx_text handle ERROR _ => read_header pos text) |
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
209 |
end; |
48927
ef462b5558eb
theory def/ref position reports, which enable hyperlinks etc.;
wenzelm
parents:
48881
diff
changeset
|
210 |
|
22106 | 211 |
end; |
67500
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
212 |
|
dfde99d59f6e
tuned: prefer list operations over Source.source;
wenzelm
parents:
67164
diff
changeset
|
213 |
end; |