34 |
34 |
35 type serializer |
35 type serializer |
36 type literals = Code_Printer.literals |
36 type literals = Code_Printer.literals |
37 type language |
37 type language |
38 type ancestry |
38 type ancestry |
|
39 val assert_target: theory -> string -> string |
39 val add_language: string * language -> theory -> theory |
40 val add_language: string * language -> theory -> theory |
40 val add_derived_target: string * ancestry -> theory -> theory |
41 val add_derived_target: string * ancestry -> theory -> theory |
41 val assert_target: Proof.context -> string -> string |
|
42 val the_literals: Proof.context -> string -> literals |
42 val the_literals: Proof.context -> string -> literals |
43 type serialization |
43 type serialization |
44 val parse_args: 'a parser -> Token.T list -> 'a |
44 val parse_args: 'a parser -> Token.T list -> 'a |
45 val serialization: (int -> Path.T option -> 'a -> unit) |
45 val serialization: (int -> Path.T option -> 'a -> unit) |
46 -> (Code_Symbol.T list -> int -> 'a -> (string * string) list * (Code_Symbol.T -> string option)) |
46 -> (Code_Symbol.T list -> int -> 'a -> (string * string) list * (Code_Symbol.T -> string option)) |
201 ) (targets1, targets2) |
201 ) (targets1, targets2) |
202 ); |
202 ); |
203 |
203 |
204 fun exists_target thy = Symtab.defined (Targets.get thy); |
204 fun exists_target thy = Symtab.defined (Targets.get thy); |
205 fun lookup_target_data thy = Symtab.lookup (Targets.get thy); |
205 fun lookup_target_data thy = Symtab.lookup (Targets.get thy); |
|
206 fun assert_target thy target_name = |
|
207 if exists_target thy target_name |
|
208 then target_name |
|
209 else error ("Unknown code target language: " ^ quote target_name); |
206 |
210 |
207 fun fold1 f xs = fold f (tl xs) (hd xs); |
211 fun fold1 f xs = fold f (tl xs) (hd xs); |
208 |
212 |
209 fun join_ancestry thy target_name = |
213 fun join_ancestry thy target_name = |
210 let |
214 let |
|
215 val _ = assert_target thy target_name; |
211 val the_target_data = the o lookup_target_data thy; |
216 val the_target_data = the o lookup_target_data thy; |
212 val (target, this_data) = the_target_data target_name; |
217 val (target, this_data) = the_target_data target_name; |
213 val ancestry = #ancestry target; |
218 val ancestry = #ancestry target; |
214 val modifies = rev (map snd ancestry); |
219 val modifies = rev (map snd ancestry); |
215 val modify = fold (curry (op o)) modifies I; |
220 val modify = fold (curry (op o)) modifies I; |
216 val datas = rev (map (snd o the_target_data o fst) ancestry) @ [this_data]; |
221 val datas = rev (map (snd o the_target_data o fst) ancestry) @ [this_data]; |
217 val data = fold1 (fn data' => fn data => Code_Printer.merge_data (data, data')) datas; |
222 val data = fold1 (fn data' => fn data => Code_Printer.merge_data (data, data')) datas; |
218 in (modify, (target, data)) end; |
223 in (modify, (target, data)) end; |
219 |
224 |
220 fun assert_target ctxt target_name = |
225 fun allocate_target target_name target thy = |
221 if exists_target (Proof_Context.theory_of ctxt) target_name |
|
222 then target_name |
|
223 else error ("Unknown code target language: " ^ quote target_name); |
|
224 |
|
225 fun allocate_target target_name target thy = |
|
226 let |
226 let |
227 val _ = if exists_target thy target_name |
227 val _ = if exists_target thy target_name |
228 then error ("Attempt to overwrite existing target " ^ quote target_name) |
228 then error ("Attempt to overwrite existing target " ^ quote target_name) |
229 else (); |
229 else (); |
230 in |
230 in |