equal
deleted
inserted
replaced
35 val spec: spec -> T |
35 val spec: spec -> T |
36 val command_spec: (string * spec) * Position.T -> (string * T) * Position.T |
36 val command_spec: (string * spec) * Position.T -> (string * T) * Position.T |
37 type keywords |
37 type keywords |
38 val minor_keywords: keywords -> Scan.lexicon |
38 val minor_keywords: keywords -> Scan.lexicon |
39 val major_keywords: keywords -> Scan.lexicon |
39 val major_keywords: keywords -> Scan.lexicon |
|
40 val no_command_keywords: keywords -> keywords |
40 val empty_keywords: keywords |
41 val empty_keywords: keywords |
41 val merge_keywords: keywords * keywords -> keywords |
42 val merge_keywords: keywords * keywords -> keywords |
42 val no_command_keywords: keywords -> keywords |
43 val add_keywords: string * T option -> keywords -> keywords |
43 val add: string * T option -> keywords -> keywords |
|
44 val define: string * T option -> unit |
44 val define: string * T option -> unit |
45 val get_keywords: unit -> keywords |
45 val get_keywords: unit -> keywords |
46 val is_keyword: keywords -> string -> bool |
46 val is_keyword: keywords -> string -> bool |
47 val command_keyword: string -> T option |
47 val command_keyword: string -> T option |
48 val command_files: string -> Path.T -> Path.T list |
48 val command_files: string -> Path.T -> Path.T list |
140 Keywords {minor = minor, major = major, commands = commands}; |
140 Keywords {minor = minor, major = major, commands = commands}; |
141 |
141 |
142 fun map_keywords f (Keywords {minor, major, commands}) = |
142 fun map_keywords f (Keywords {minor, major, commands}) = |
143 make_keywords (f (minor, major, commands)); |
143 make_keywords (f (minor, major, commands)); |
144 |
144 |
|
145 val no_command_keywords = |
|
146 map_keywords (fn (minor, _, _) => (minor, Scan.empty_lexicon, Symtab.empty)); |
|
147 |
|
148 |
|
149 (* build keywords *) |
|
150 |
145 val empty_keywords = |
151 val empty_keywords = |
146 make_keywords (Scan.empty_lexicon, Scan.empty_lexicon, Symtab.empty); |
152 make_keywords (Scan.empty_lexicon, Scan.empty_lexicon, Symtab.empty); |
147 |
153 |
148 fun merge_keywords |
154 fun merge_keywords |
149 (Keywords {minor = minor1, major = major1, commands = commands1}, |
155 (Keywords {minor = minor1, major = major1, commands = commands1}, |
151 make_keywords |
157 make_keywords |
152 (Scan.merge_lexicons (minor1, minor2), |
158 (Scan.merge_lexicons (minor1, minor2), |
153 Scan.merge_lexicons (major1, major2), |
159 Scan.merge_lexicons (major1, major2), |
154 Symtab.merge (K true) (commands1, commands2)); |
160 Symtab.merge (K true) (commands1, commands2)); |
155 |
161 |
156 val no_command_keywords = |
162 fun add_keywords (name, opt_kind) = map_keywords (fn (minor, major, commands) => |
157 map_keywords (fn (minor, _, _) => (minor, Scan.empty_lexicon, Symtab.empty)); |
|
158 |
|
159 |
|
160 (* add keywords *) |
|
161 |
|
162 fun add (name, opt_kind) = map_keywords (fn (minor, major, commands) => |
|
163 (case opt_kind of |
163 (case opt_kind of |
164 NONE => |
164 NONE => |
165 let |
165 let |
166 val minor' = Scan.extend_lexicon (Symbol.explode name) minor; |
166 val minor' = Scan.extend_lexicon (Symbol.explode name) minor; |
167 in (minor', major, commands) end |
167 in (minor', major, commands) end |
174 |
174 |
175 (* global state *) |
175 (* global state *) |
176 |
176 |
177 local val global_keywords = Unsynchronized.ref empty_keywords in |
177 local val global_keywords = Unsynchronized.ref empty_keywords in |
178 |
178 |
179 fun define decl = CRITICAL (fn () => Unsynchronized.change global_keywords (add decl)); |
179 fun define decl = CRITICAL (fn () => Unsynchronized.change global_keywords (add_keywords decl)); |
180 fun get_keywords () = ! global_keywords; |
180 fun get_keywords () = ! global_keywords; |
181 |
181 |
182 end; |
182 end; |
183 |
183 |
184 fun get_commands () = commands (get_keywords ()); |
184 fun get_commands () = commands (get_keywords ()); |