4 Mastering target language namespaces. |
4 Mastering target language namespaces. |
5 *) |
5 *) |
6 |
6 |
7 signature CODE_NAMESPACE = |
7 signature CODE_NAMESPACE = |
8 sig |
8 sig |
|
9 val dest_name: string -> string * string |
9 datatype ('a, 'b) node = |
10 datatype ('a, 'b) node = |
10 Dummy |
11 Dummy |
11 | Stmt of 'a |
12 | Stmt of 'a |
12 | Module of ('b * (string * ('a, 'b) node) Graph.T); |
13 | Module of ('b * (string * ('a, 'b) node) Graph.T); |
13 val hierarchical_program: (string -> string) -> { module_alias: string -> string option, |
14 val hierarchical_program: (string -> string) -> { module_alias: string -> string option, |
21 end; |
22 end; |
22 |
23 |
23 structure Code_Namespace : CODE_NAMESPACE = |
24 structure Code_Namespace : CODE_NAMESPACE = |
24 struct |
25 struct |
25 |
26 |
26 (* hierarchical program structure *) |
27 (** splitting names in module and base part **) |
|
28 |
|
29 val dest_name = |
|
30 apfst Long_Name.implode o split_last o fst o split_last o Long_Name.explode; |
|
31 |
|
32 |
|
33 (** hierarchical program structure **) |
27 |
34 |
28 datatype ('a, 'b) node = |
35 datatype ('a, 'b) node = |
29 Dummy |
36 Dummy |
30 | Stmt of 'a |
37 | Stmt of 'a |
31 | Module of ('b * (string * ('a, 'b) node) Graph.T); |
38 | Module of ('b * (string * ('a, 'b) node) Graph.T); |
44 (* building module name hierarchy *) |
51 (* building module name hierarchy *) |
45 fun alias_fragments name = case module_alias name |
52 fun alias_fragments name = case module_alias name |
46 of SOME name' => Long_Name.explode name' |
53 of SOME name' => Long_Name.explode name' |
47 | NONE => map (fn name => fst (yield_singleton Name.variants name reserved)) |
54 | NONE => map (fn name => fst (yield_singleton Name.variants name reserved)) |
48 (Long_Name.explode name); |
55 (Long_Name.explode name); |
49 val module_names = Graph.fold (insert (op =) o fst o Code_Printer.dest_name o fst) program []; |
56 val module_names = Graph.fold (insert (op =) o fst o dest_name o fst) program []; |
50 val fragments_tab = fold (fn name => Symtab.update |
57 val fragments_tab = fold (fn name => Symtab.update |
51 (name, alias_fragments name)) module_names Symtab.empty; |
58 (name, alias_fragments name)) module_names Symtab.empty; |
52 val dest_name = Code_Printer.dest_name #>> (the o Symtab.lookup fragments_tab); |
59 val dest_name = dest_name #>> (the o Symtab.lookup fragments_tab); |
53 |
60 |
54 (* building empty module hierarchy *) |
61 (* building empty module hierarchy *) |
55 val empty_module = (empty_data, Graph.empty); |
62 val empty_module = (empty_data, Graph.empty); |
56 fun ensure_module name_fragment (data, nodes) = |
63 fun ensure_module name_fragment (data, nodes) = |
57 if can (Graph.get_node nodes) name_fragment then (data, nodes) |
64 if can (Graph.get_node nodes) name_fragment then (data, nodes) |