28 val extern: T -> string -> xstring |
28 val extern: T -> string -> xstring |
29 val hide: bool -> string -> T -> T |
29 val hide: bool -> string -> T -> T |
30 val get_accesses: T -> string -> xstring list |
30 val get_accesses: T -> string -> xstring list |
31 val merge: T * T -> T |
31 val merge: T * T -> T |
32 type naming |
32 type naming |
|
33 val default_naming: naming |
|
34 val declare: naming -> Binding.T -> T -> string * T |
|
35 val full_name: naming -> Binding.T -> string |
|
36 val declare_base: naming -> string -> T -> T |
|
37 val external_names: naming -> string -> string list |
33 val path_of: naming -> string |
38 val path_of: naming -> string |
34 val external_names: naming -> string -> string list |
|
35 val full: naming -> bstring -> string |
|
36 val declare: naming -> string -> T -> T |
|
37 val default_naming: naming |
|
38 val add_path: string -> naming -> naming |
39 val add_path: string -> naming -> naming |
39 val no_base_names: naming -> naming |
40 val no_base_names: naming -> naming |
40 val qualified_names: naming -> naming |
41 val qualified_names: naming -> naming |
41 val sticky_prefix: string -> naming -> naming |
42 val sticky_prefix: string -> naming -> naming |
42 val full_binding: naming -> Binding.T -> string |
|
43 val declare_binding: naming -> Binding.T -> T -> string * T |
|
44 type 'a table = T * 'a Symtab.table |
43 type 'a table = T * 'a Symtab.table |
45 val empty_table: 'a table |
44 val empty_table: 'a table |
46 val table_declare: naming -> Binding.T * 'a |
45 val bind: naming -> Binding.T * 'a |
47 -> 'a table -> string * 'a table (*exception Symtab.DUP*) |
46 -> 'a table -> string * 'a table (*exception Symtab.DUP*) |
48 val table_declare_permissive: naming -> Binding.T * 'a |
|
49 -> 'a table -> string * 'a table |
|
50 val extend_table: naming -> (bstring * 'a) list -> 'a table -> 'a table |
|
51 val merge_tables: ('a * 'a -> bool) -> 'a table * 'a table -> 'a table |
47 val merge_tables: ('a * 'a -> bool) -> 'a table * 'a table -> 'a table |
52 val dest_table: 'a table -> (string * 'a) list |
48 val dest_table: 'a table -> (string * 'a) list |
53 val extern_table: 'a table -> (xstring * 'a) list |
49 val extern_table: 'a table -> (xstring * 'a) list |
|
50 val extend_table: naming -> (bstring * 'a) list -> 'a table -> 'a table |
54 end; |
51 end; |
55 |
52 |
56 structure NameSpace: NAME_SPACE = |
53 structure NameSpace: NAME_SPACE = |
57 struct |
54 struct |
58 |
55 |
267 |
264 |
268 (* declarations *) |
265 (* declarations *) |
269 |
266 |
270 fun full (Naming (path, (qualify, _))) = qualify path; |
267 fun full (Naming (path, (qualify, _))) = qualify path; |
271 |
268 |
272 fun declare naming name space = |
269 fun full_name naming b = |
|
270 let val (prefix, bname) = Binding.dest b |
|
271 in full (apply_prefix prefix naming) bname end; |
|
272 |
|
273 fun declare_base naming name space = |
273 if is_hidden name then |
274 if is_hidden name then |
274 error ("Attempt to declare hidden name " ^ quote name) |
275 error ("Attempt to declare hidden name " ^ quote name) |
275 else |
276 else |
276 let |
277 let |
277 val names = explode_name name; |
278 val names = explode_name name; |
279 orelse exists_string (fn s => s = "\"") name) andalso |
280 orelse exists_string (fn s => s = "\"") name) andalso |
280 error ("Bad name declaration " ^ quote name); |
281 error ("Bad name declaration " ^ quote name); |
281 val (accs, accs') = pairself (map implode_name) (accesses naming names); |
282 val (accs, accs') = pairself (map implode_name) (accesses naming names); |
282 in space |> fold (add_name name) accs |> put_accesses name accs' end; |
283 in space |> fold (add_name name) accs |> put_accesses name accs' end; |
283 |
284 |
284 fun declare_binding bnaming b = |
285 fun declare bnaming b = |
285 let |
286 let |
286 val (prefix, bname) = Binding.dest_binding b; |
287 val (prefix, bname) = Binding.dest b; |
287 val naming = apply_prefix prefix bnaming; |
288 val naming = apply_prefix prefix bnaming; |
288 val name = full naming bname; |
289 val name = full naming bname; |
289 in declare naming name #> pair name end; |
290 in declare_base naming name #> pair name end; |
290 |
291 |
291 |
292 |
292 |
293 |
293 (** name spaces coupled with symbol tables **) |
294 (** name spaces coupled with symbol tables **) |
294 |
295 |
295 type 'a table = T * 'a Symtab.table; |
296 type 'a table = T * 'a Symtab.table; |
296 |
297 |
297 val empty_table = (empty, Symtab.empty); |
298 val empty_table = (empty, Symtab.empty); |
298 |
299 |
299 fun gen_table_declare update naming (binding, x) (space, tab) = |
300 fun bind naming (b, x) (space, tab) = |
300 let |
301 let |
301 val (name, space') = declare_binding naming binding space; |
302 val (name, space') = declare naming b space; |
302 in (name, (space', update (name, x) tab)) end; |
303 in (name, (space', Symtab.update_new (name, x) tab)) end; |
303 |
|
304 fun table_declare naming = gen_table_declare Symtab.update_new naming; |
|
305 fun table_declare_permissive naming = gen_table_declare Symtab.update naming; |
|
306 |
|
307 fun full_binding naming b = |
|
308 let val (prefix, bname) = Binding.dest_binding b |
|
309 in full (apply_prefix prefix naming) bname end; |
|
310 |
304 |
311 fun extend_table naming bentries (space, tab) = |
305 fun extend_table naming bentries (space, tab) = |
312 let val entries = map (apfst (full naming)) bentries |
306 let val entries = map (apfst (full naming)) bentries |
313 in (fold (declare naming o #1) entries space, Symtab.extend (tab, entries)) end; |
307 in (fold (declare_base naming o #1) entries space, Symtab.extend (tab, entries)) end; |
314 |
308 |
315 fun merge_tables eq ((space1, tab1), (space2, tab2)) = |
309 fun merge_tables eq ((space1, tab1), (space2, tab2)) = |
316 (merge (space1, space2), Symtab.merge eq (tab1, tab2)); |
310 (merge (space1, space2), Symtab.merge eq (tab1, tab2)); |
317 |
311 |
318 fun ext_table (space, tab) = |
312 fun ext_table (space, tab) = |