175 TSig {classes = classes, default = default, types = types, log_types = log_types}; |
175 TSig {classes = classes, default = default, types = types, log_types = log_types}; |
176 |
176 |
177 fun build_tsig (classes, default, types) = |
177 fun build_tsig (classes, default, types) = |
178 let |
178 let |
179 val log_types = |
179 val log_types = |
180 Symtab.fold (fn (c, LogicalType n) => cons (c, n) | _ => I) (snd types) [] |
180 Name_Space.fold_table (fn (c, LogicalType n) => cons (c, n) | _ => I) types [] |
181 |> Library.sort (int_ord o pairself snd) |> map fst; |
181 |> Library.sort (int_ord o pairself snd) |> map fst; |
182 in make_tsig (classes, default, types, log_types) end; |
182 in make_tsig (classes, default, types, log_types) end; |
183 |
183 |
184 fun map_tsig f (TSig {classes, default, types, log_types = _}) = |
184 fun map_tsig f (TSig {classes, default, types, log_types = _}) = |
185 build_tsig (f (classes, default, types)); |
185 build_tsig (f (classes, default, types)); |
235 fun restore_mode ctxt = set_mode (get_mode ctxt); |
235 fun restore_mode ctxt = set_mode (get_mode ctxt); |
236 |
236 |
237 |
237 |
238 (* types *) |
238 (* types *) |
239 |
239 |
240 val type_space = #1 o #types o rep_tsig; |
240 val type_space = Name_Space.space_of_table o #types o rep_tsig; |
241 |
241 |
242 fun type_alias naming binding name = map_tsig (fn (classes, default, (space, types)) => |
242 fun type_alias naming binding name = map_tsig (fn (classes, default, types) => |
243 (classes, default, (Name_Space.alias naming binding name space, types))); |
243 (classes, default, (Name_Space.alias_table naming binding name types))); |
244 |
244 |
245 val is_logtype = member (op =) o logical_types; |
245 val is_logtype = member (op =) o logical_types; |
246 |
246 |
247 |
247 |
248 fun undecl_type c = "Undeclared type constructor: " ^ quote c; |
248 fun undecl_type c = "Undeclared type constructor: " ^ quote c; |
249 |
249 |
250 fun lookup_type (TSig {types = (_, types), ...}) = Symtab.lookup types; |
250 fun lookup_type (TSig {types, ...}) = Option.map #2 o Name_Space.lookup_key types; |
251 |
251 |
252 fun check_decl context (TSig {types, ...}) (c, pos) = |
252 fun check_decl context (TSig {types, ...}) (c, pos) = |
253 Name_Space.check_reports context types (c, [pos]); |
253 Name_Space.check_reports context types (c, [pos]); |
254 |
254 |
255 fun the_decl tsig (c, pos) = |
255 fun the_decl tsig (c, pos) = |
637 fun new_decl context (c, decl) types = |
637 fun new_decl context (c, decl) types = |
638 (Binding.check c; #2 (Name_Space.define context true (c, decl) types)); |
638 (Binding.check c; #2 (Name_Space.define context true (c, decl) types)); |
639 |
639 |
640 fun map_types f = map_tsig (fn (classes, default, types) => |
640 fun map_types f = map_tsig (fn (classes, default, types) => |
641 let |
641 let |
642 val (space', tab') = f types; |
642 val types' = f types; |
643 val _ = Name_Space.intern space' "dummy" = "dummy" orelse |
643 val _ = |
644 error "Illegal declaration of dummy type"; |
644 Name_Space.intern (Name_Space.space_of_table types') "dummy" = "dummy" orelse |
645 in (classes, default, (space', tab')) end); |
645 error "Illegal declaration of dummy type"; |
646 |
646 in (classes, default, types') end); |
647 fun syntactic types (Type (c, Ts)) = |
647 |
648 (case Symtab.lookup types c of SOME Nonterminal => true | _ => false) |
648 fun syntactic tsig (Type (c, Ts)) = |
649 orelse exists (syntactic types) Ts |
649 (case lookup_type tsig c of SOME Nonterminal => true | _ => false) |
|
650 orelse exists (syntactic tsig) Ts |
650 | syntactic _ _ = false; |
651 | syntactic _ _ = false; |
651 |
652 |
652 in |
653 in |
653 |
654 |
654 fun add_type context (c, n) = |
655 fun add_type context (c, n) = |
667 | dups => err ("Duplicate variables on lhs: " ^ commas_quote dups)); |
668 | dups => err ("Duplicate variables on lhs: " ^ commas_quote dups)); |
668 val _ = |
669 val _ = |
669 (case subtract (op =) vs (map #1 (Term.add_tfreesT rhs' [])) of |
670 (case subtract (op =) vs (map #1 (Term.add_tfreesT rhs' [])) of |
670 [] => [] |
671 [] => [] |
671 | extras => err ("Extra variables on rhs: " ^ commas_quote extras)); |
672 | extras => err ("Extra variables on rhs: " ^ commas_quote extras)); |
672 in types |> new_decl context (a, Abbreviation (vs, rhs', syntactic (#2 types) rhs')) end); |
673 in types |> new_decl context (a, Abbreviation (vs, rhs', syntactic tsig rhs')) end); |
673 |
674 |
674 fun add_nonterminal context = map_types o new_decl context o rpair Nonterminal; |
675 fun add_nonterminal context = map_types o new_decl context o rpair Nonterminal; |
675 |
676 |
676 end; |
677 end; |
677 |
678 |
678 fun hide_type fully c = map_tsig (fn (classes, default, (space, types)) => |
679 fun hide_type fully c = map_tsig (fn (classes, default, types) => |
679 (classes, default, (Name_Space.hide fully c space, types))); |
680 (classes, default, Name_Space.hide_table fully c types)); |
680 |
681 |
681 |
682 |
682 (* merge type signatures *) |
683 (* merge type signatures *) |
683 |
684 |
684 fun merge_tsig pp (tsig1, tsig2) = |
685 fun merge_tsig pp (tsig1, tsig2) = |