| author | wenzelm | 
| Tue, 05 Jul 2011 21:32:48 +0200 | |
| changeset 43670 | 7f933761764b | 
| parent 43564 | 9864182c6bad | 
| child 43850 | 7f2cbc713344 | 
| permissions | -rw-r--r-- | 
| 37745 
6315b6426200
checking generated code for various target languages
 haftmann parents: 
37528diff
changeset | 1 | (* Title: Tools/Code/code_target.ML | 
| 24219 | 2 | Author: Florian Haftmann, TU Muenchen | 
| 3 | ||
| 38910 | 4 | Generic infrastructure for target language data. | 
| 24219 | 5 | *) | 
| 6 | ||
| 7 | signature CODE_TARGET = | |
| 8 | sig | |
| 36471 | 9 | val cert_tyco: theory -> string -> string | 
| 10 | val read_tyco: theory -> string -> string | |
| 39057 
c6d146ed07ae
manage statement selection for presentation wholly through markup
 haftmann parents: 
39056diff
changeset | 11 | val read_const_exprs: theory -> string list -> string list | 
| 36471 | 12 | |
| 38933 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 13 | val export_code_for: theory -> Path.T option -> string -> int option -> string -> Token.T list | 
| 38918 | 14 | -> Code_Thingol.naming -> Code_Thingol.program -> string list -> unit | 
| 38933 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 15 | val produce_code_for: theory -> string -> int option -> string -> Token.T list | 
| 38929 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 16 | -> Code_Thingol.naming -> Code_Thingol.program -> string list -> string * string option list | 
| 38933 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 17 | val present_code_for: theory -> string -> int option -> string -> Token.T list | 
| 38929 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 18 | -> Code_Thingol.naming -> Code_Thingol.program -> string list * string list -> string | 
| 38918 | 19 | val check_code_for: theory -> string -> bool -> Token.T list | 
| 20 | -> Code_Thingol.naming -> Code_Thingol.program -> string list -> unit | |
| 21 | ||
| 22 | val export_code: theory -> string list | |
| 38933 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 23 | -> (((string * string) * Path.T option) * Token.T list) list -> unit | 
| 38929 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 24 | val produce_code: theory -> string list | 
| 38933 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 25 | -> string -> int option -> string -> Token.T list -> string * string option list | 
| 38929 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 26 | val present_code: theory -> string list -> (Code_Thingol.naming -> string list) | 
| 38933 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 27 | -> string -> int option -> string -> Token.T list -> string | 
| 38918 | 28 | val check_code: theory -> string list | 
| 29 | -> ((string * bool) * Token.T list) list -> unit | |
| 30 | ||
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 31 | val evaluator: theory -> string -> Code_Thingol.naming -> Code_Thingol.program | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 32 | -> string list -> ((string * class list) list * Code_Thingol.itype) * Code_Thingol.iterm | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 33 | -> string * string | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 34 | |
| 28054 | 35 | type serializer | 
| 34152 | 36 | type literals = Code_Printer.literals | 
| 37822 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 37 |   val add_target: string * { serializer: serializer, literals: literals,
 | 
| 41940 | 38 |     check: { env_var: string, make_destination: Path.T -> Path.T, make_command: string -> string } }
 | 
| 39 | -> theory -> theory | |
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28090diff
changeset | 40 | val extend_target: string * | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28090diff
changeset | 41 | (string * (Code_Thingol.naming -> Code_Thingol.program -> Code_Thingol.program)) | 
| 28054 | 42 | -> theory -> theory | 
| 43 | val assert_target: theory -> string -> string | |
| 38918 | 44 | val the_literals: theory -> string -> literals | 
| 28054 | 45 | type serialization | 
| 36959 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 wenzelm parents: 
36537diff
changeset | 46 | val parse_args: 'a parser -> Token.T list -> 'a | 
| 38916 | 47 | val serialization: (int -> Path.T option -> 'a -> unit) | 
| 39102 | 48 | -> (string list -> int -> 'a -> string * (string -> string option)) | 
| 38925 | 49 | -> 'a -> serialization | 
| 38918 | 50 | val set_default_code_width: int -> theory -> theory | 
| 38917 | 51 | |
| 28054 | 52 | val allow_abort: string -> theory -> theory | 
| 34152 | 53 | type tyco_syntax = Code_Printer.tyco_syntax | 
| 37876 | 54 | type const_syntax = Code_Printer.const_syntax | 
| 38923 | 55 | val add_class_syntax: string -> class -> string option -> theory -> theory | 
| 56 | val add_instance_syntax: string -> class * string -> unit option -> theory -> theory | |
| 57 | val add_tyco_syntax: string -> string -> tyco_syntax option -> theory -> theory | |
| 58 | val add_const_syntax: string -> string -> const_syntax option -> theory -> theory | |
| 28054 | 59 | val add_reserved: string -> string -> theory -> theory | 
| 33969 | 60 | val add_include: string -> string * (string * string list) option -> theory -> theory | 
| 39646 | 61 | |
| 39750 
c0099428ca7b
consider quick_and_dirty option before loading theory
 haftmann parents: 
39679diff
changeset | 62 | val codegen_tool: string (*theory name*) -> string (*export_code expr*) -> unit | 
| 43564 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 63 | |
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 64 | val setup: theory -> theory | 
| 24219 | 65 | end; | 
| 66 | ||
| 28054 | 67 | structure Code_Target : CODE_TARGET = | 
| 24219 | 68 | struct | 
| 69 | ||
| 28054 | 70 | open Basic_Code_Thingol; | 
| 34152 | 71 | |
| 72 | type literals = Code_Printer.literals; | |
| 73 | type tyco_syntax = Code_Printer.tyco_syntax; | |
| 37876 | 74 | type const_syntax = Code_Printer.const_syntax; | 
| 34152 | 75 | |
| 24219 | 76 | |
| 38923 | 77 | (** abstract nonsense **) | 
| 24219 | 78 | |
| 38929 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 79 | datatype destination = Export of Path.T option | Produce | Present of string list; | 
| 39102 | 80 | type serialization = int -> destination -> (string * (string -> string option)) option; | 
| 27014 
a5f53d9d2b60
yet another attempt to circumvent printmode problems
 haftmann parents: 
27001diff
changeset | 81 | |
| 39659 | 82 | fun serialization output _ content width (Export some_path) = | 
| 39661 
6381d18507ef
reverted cs 07549694e2f1 -- use re-printing with current print mode instead after code assembly, avoid Latex.output_typewriter
 haftmann parents: 
39659diff
changeset | 83 | (output width some_path content; NONE) | 
| 
6381d18507ef
reverted cs 07549694e2f1 -- use re-printing with current print mode instead after code assembly, avoid Latex.output_typewriter
 haftmann parents: 
39659diff
changeset | 84 | | serialization _ string content width Produce = | 
| 
6381d18507ef
reverted cs 07549694e2f1 -- use re-printing with current print mode instead after code assembly, avoid Latex.output_typewriter
 haftmann parents: 
39659diff
changeset | 85 | string [] width content |> SOME | 
| 39659 | 86 | | serialization _ string content width (Present stmt_names) = | 
| 39661 
6381d18507ef
reverted cs 07549694e2f1 -- use re-printing with current print mode instead after code assembly, avoid Latex.output_typewriter
 haftmann parents: 
39659diff
changeset | 87 | string stmt_names width content | 
| 
6381d18507ef
reverted cs 07549694e2f1 -- use re-printing with current print mode instead after code assembly, avoid Latex.output_typewriter
 haftmann parents: 
39659diff
changeset | 88 | |> apfst (Pretty.output (SOME width) o Pretty.str) | 
| 
6381d18507ef
reverted cs 07549694e2f1 -- use re-printing with current print mode instead after code assembly, avoid Latex.output_typewriter
 haftmann parents: 
39659diff
changeset | 89 | |> SOME; | 
| 39659 | 90 | |
| 39661 
6381d18507ef
reverted cs 07549694e2f1 -- use re-printing with current print mode instead after code assembly, avoid Latex.output_typewriter
 haftmann parents: 
39659diff
changeset | 91 | fun export some_path f = (f (Export some_path); ()); | 
| 
6381d18507ef
reverted cs 07549694e2f1 -- use re-printing with current print mode instead after code assembly, avoid Latex.output_typewriter
 haftmann parents: 
39659diff
changeset | 92 | fun produce f = the (f Produce); | 
| 
6381d18507ef
reverted cs 07549694e2f1 -- use re-printing with current print mode instead after code assembly, avoid Latex.output_typewriter
 haftmann parents: 
39659diff
changeset | 93 | fun present stmt_names f = fst (the (f (Present stmt_names))); | 
| 38917 | 94 | |
| 24219 | 95 | |
| 28054 | 96 | (** theory data **) | 
| 97 | ||
| 38923 | 98 | datatype symbol_syntax_data = Symbol_Syntax_Data of {
 | 
| 28690 | 99 | class: string Symtab.table, | 
| 30648 
17365ef082f3
clarified relationship of modules Code_Name and Code_Printer
 haftmann parents: 
30513diff
changeset | 100 | instance: unit Symreltab.table, | 
| 34152 | 101 | tyco: Code_Printer.tyco_syntax Symtab.table, | 
| 37876 | 102 | const: Code_Printer.const_syntax Symtab.table | 
| 28054 | 103 | }; | 
| 27000 | 104 | |
| 38923 | 105 | fun make_symbol_syntax_data ((class, instance), (tyco, const)) = | 
| 106 |   Symbol_Syntax_Data { class = class, instance = instance, tyco = tyco, const = const };
 | |
| 107 | fun map_symbol_syntax_data f (Symbol_Syntax_Data { class, instance, tyco, const }) =
 | |
| 108 | make_symbol_syntax_data (f ((class, instance), (tyco, const))); | |
| 109 | fun merge_symbol_syntax_data | |
| 110 |   (Symbol_Syntax_Data { class = class1, instance = instance1, tyco = tyco1, const = const1 },
 | |
| 111 |     Symbol_Syntax_Data { class = class2, instance = instance2, tyco = tyco2, const = const2 }) =
 | |
| 112 | make_symbol_syntax_data ( | |
| 28054 | 113 | (Symtab.join (K snd) (class1, class2), | 
| 30648 
17365ef082f3
clarified relationship of modules Code_Name and Code_Printer
 haftmann parents: 
30513diff
changeset | 114 | Symreltab.join (K snd) (instance1, instance2)), | 
| 28054 | 115 | (Symtab.join (K snd) (tyco1, tyco2), | 
| 116 | Symtab.join (K snd) (const1, const2)) | |
| 117 | ); | |
| 118 | ||
| 39142 | 119 | type serializer = Token.T list | 
| 120 |   -> {
 | |
| 38926 | 121 | labelled_name: string -> string, | 
| 122 | reserved_syms: string list, | |
| 123 | includes: (string * Pretty.T) list, | |
| 124 | module_alias: string -> string option, | |
| 125 | class_syntax: string -> string option, | |
| 126 | tyco_syntax: string -> Code_Printer.tyco_syntax option, | |
| 41342 
3519e0dd8f75
more explicit structure for serializer invocation
 haftmann parents: 
41307diff
changeset | 127 | const_syntax: string -> Code_Printer.activated_const_syntax option } | 
| 
3519e0dd8f75
more explicit structure for serializer invocation
 haftmann parents: 
41307diff
changeset | 128 | -> Code_Thingol.program | 
| 28054 | 129 | -> serialization; | 
| 27000 | 130 | |
| 38909 | 131 | datatype description = Fundamental of { serializer: serializer,
 | 
| 38910 | 132 | literals: literals, | 
| 37822 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 133 |       check: { env_var: string, make_destination: Path.T -> Path.T,
 | 
| 41940 | 134 | make_command: string -> string } } | 
| 38909 | 135 | | Extension of string * | 
| 136 | (Code_Thingol.naming -> Code_Thingol.program -> Code_Thingol.program); | |
| 28054 | 137 | |
| 138 | datatype target = Target of {
 | |
| 139 | serial: serial, | |
| 37821 | 140 | description: description, | 
| 28054 | 141 | reserved: string list, | 
| 28926 | 142 | includes: (Pretty.T * string list) Symtab.table, | 
| 38925 | 143 | module_alias: string Symtab.table, | 
| 144 | symbol_syntax: symbol_syntax_data | |
| 28054 | 145 | }; | 
| 27103 | 146 | |
| 38925 | 147 | fun make_target ((serial, description), ((reserved, includes), (module_alias, symbol_syntax))) = | 
| 43564 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 148 |   Target { serial = serial, description = description, reserved = reserved,
 | 
| 38925 | 149 | includes = includes, module_alias = module_alias, symbol_syntax = symbol_syntax }; | 
| 150 | fun map_target f ( Target { serial, description, reserved, includes, module_alias, symbol_syntax } ) =
 | |
| 151 | make_target (f ((serial, description), ((reserved, includes), (module_alias, symbol_syntax)))); | |
| 37821 | 152 | fun merge_target strict target (Target { serial = serial1, description = description,
 | 
| 28054 | 153 | reserved = reserved1, includes = includes1, | 
| 38925 | 154 | module_alias = module_alias1, symbol_syntax = symbol_syntax1 }, | 
| 37821 | 155 |     Target { serial = serial2, description = _,
 | 
| 28054 | 156 | reserved = reserved2, includes = includes2, | 
| 38925 | 157 | module_alias = module_alias2, symbol_syntax = symbol_syntax2 }) = | 
| 28054 | 158 | if serial1 = serial2 orelse not strict then | 
| 37821 | 159 | make_target ((serial1, description), | 
| 37972 
f37a8d488105
restored unusual snd-biased merge/join policy -- required due to non-conservative code setups
 haftmann parents: 
37898diff
changeset | 160 | ((merge (op =) (reserved1, reserved2), Symtab.join (K snd) (includes1, includes2)), | 
| 38925 | 161 | (Symtab.join (K snd) (module_alias1, module_alias2), | 
| 162 | merge_symbol_syntax_data (symbol_syntax1, symbol_syntax2)) | |
| 28054 | 163 | )) | 
| 164 | else | |
| 37821 | 165 |     error ("Incompatible targets: " ^ quote target);
 | 
| 27103 | 166 | |
| 37821 | 167 | fun the_description (Target { description, ... }) = description;
 | 
| 28054 | 168 | fun the_reserved (Target { reserved, ... }) = reserved;
 | 
| 169 | fun the_includes (Target { includes, ... }) = includes;
 | |
| 170 | fun the_module_alias (Target { module_alias , ... }) = module_alias;
 | |
| 38925 | 171 | fun the_symbol_syntax (Target { symbol_syntax = Symbol_Syntax_Data x, ... }) = x;
 | 
| 27437 | 172 | |
| 34248 | 173 | structure Targets = Theory_Data | 
| 34071 | 174 | ( | 
| 175 | type T = (target Symtab.table * string list) * int; | |
| 176 | val empty = ((Symtab.empty, []), 80); | |
| 177 | val extend = I; | |
| 178 | fun merge (((target1, exc1), width1), ((target2, exc2), width2)) : T = | |
| 179 | ((Symtab.join (merge_target true) (target1, target2), | |
| 180 | Library.merge (op =) (exc1, exc2)), Int.max (width1, width2)); | |
| 181 | ); | |
| 27436 | 182 | |
| 34248 | 183 | val abort_allowed = snd o fst o Targets.get; | 
| 34071 | 184 | |
| 34248 | 185 | fun assert_target thy target = if Symtab.defined ((fst o fst) (Targets.get thy)) target | 
| 33969 | 186 | then target | 
| 187 |   else error ("Unknown code target language: " ^ quote target);
 | |
| 28054 | 188 | |
| 189 | fun put_target (target, seri) thy = | |
| 27304 | 190 | let | 
| 34248 | 191 | val lookup_target = Symtab.lookup ((fst o fst) (Targets.get thy)); | 
| 28054 | 192 | val _ = case seri | 
| 37821 | 193 | of Extension (super, _) => if is_some (lookup_target super) then () | 
| 28054 | 194 |           else error ("Unknown code target language: " ^ quote super)
 | 
| 195 | | _ => (); | |
| 37821 | 196 | val overwriting = case (Option.map the_description o lookup_target) target | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28090diff
changeset | 197 | of NONE => false | 
| 37821 | 198 | | SOME (Extension _) => true | 
| 199 | | SOME (Fundamental _) => (case seri | |
| 200 |          of Extension _ => error ("Will not overwrite existing target " ^ quote target)
 | |
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28090diff
changeset | 201 | | _ => true); | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28090diff
changeset | 202 | val _ = if overwriting | 
| 28054 | 203 |       then warning ("Overwriting existing target " ^ quote target)
 | 
| 43564 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 204 | else (); | 
| 28054 | 205 | in | 
| 206 | thy | |
| 34248 | 207 | |> (Targets.map o apfst o apfst o Symtab.update) | 
| 31599 | 208 | (target, make_target ((serial (), seri), (([], Symtab.empty), | 
| 38925 | 209 | (Symtab.empty, make_symbol_syntax_data ((Symtab.empty, Symreltab.empty), | 
| 210 | (Symtab.empty, Symtab.empty)))))) | |
| 28054 | 211 | end; | 
| 27436 | 212 | |
| 37821 | 213 | fun add_target (target, seri) = put_target (target, Fundamental seri); | 
| 28054 | 214 | fun extend_target (target, (super, modify)) = | 
| 37821 | 215 | put_target (target, Extension (super, modify)); | 
| 27436 | 216 | |
| 28054 | 217 | fun map_target_data target f thy = | 
| 27436 | 218 | let | 
| 28054 | 219 | val _ = assert_target thy target; | 
| 220 | in | |
| 221 | thy | |
| 34248 | 222 | |> (Targets.map o apfst o apfst o Symtab.map_entry target o map_target) f | 
| 28054 | 223 | end; | 
| 27304 | 224 | |
| 28054 | 225 | fun map_reserved target = | 
| 226 | map_target_data target o apsnd o apfst o apfst; | |
| 227 | fun map_includes target = | |
| 228 | map_target_data target o apsnd o apfst o apsnd; | |
| 229 | fun map_module_alias target = | |
| 38925 | 230 | map_target_data target o apsnd o apsnd o apfst; | 
| 231 | fun map_symbol_syntax target = | |
| 232 | map_target_data target o apsnd o apsnd o apsnd o map_symbol_syntax_data; | |
| 27000 | 233 | |
| 34248 | 234 | fun set_default_code_width k = (Targets.map o apsnd) (K k); | 
| 34071 | 235 | |
| 27000 | 236 | |
| 34021 | 237 | (** serializer usage **) | 
| 238 | ||
| 239 | (* montage *) | |
| 240 | ||
| 37822 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 241 | fun the_fundamental thy = | 
| 34021 | 242 | let | 
| 34248 | 243 | val ((targets, _), _) = Targets.get thy; | 
| 37822 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 244 | fun fundamental target = case Symtab.lookup targets target | 
| 37821 | 245 | of SOME data => (case the_description data | 
| 37822 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 246 | of Fundamental data => data | 
| 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 247 | | Extension (super, _) => fundamental super) | 
| 34021 | 248 |       | NONE => error ("Unknown code target language: " ^ quote target);
 | 
| 37822 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 249 | in fundamental end; | 
| 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 250 | |
| 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 251 | fun the_literals thy = #literals o the_fundamental thy; | 
| 34021 | 252 | |
| 39817 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 253 | fun collapse_hierarchy thy = | 
| 38927 | 254 | let | 
| 39817 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 255 | val ((targets, _), _) = Targets.get thy; | 
| 43564 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 256 | fun collapse target = | 
| 38927 | 257 | let | 
| 258 | val data = case Symtab.lookup targets target | |
| 259 | of SOME data => data | |
| 260 |           | NONE => error ("Unknown code target language: " ^ quote target);
 | |
| 261 | in case the_description data | |
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 262 | of Fundamental _ => (K I, data) | 
| 38927 | 263 | | Extension (super, modify) => let | 
| 39817 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 264 | val (modify', data') = collapse super | 
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 265 | in (fn naming => modify' naming #> modify naming, merge_target false target (data', data)) end | 
| 38927 | 266 | end; | 
| 39817 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 267 | in collapse end; | 
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 268 | |
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 269 | local | 
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 270 | |
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 271 | fun activate_target thy target = | 
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 272 | let | 
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 273 | val ((targets, abortable), default_width) = Targets.get thy; | 
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 274 | val (modify, data) = collapse_hierarchy thy target; | 
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 275 | in (default_width, abortable, data, modify) end; | 
| 38927 | 276 | |
| 34021 | 277 | fun activate_syntax lookup_name src_tab = Symtab.empty | 
| 278 | |> fold_map (fn thing_identifier => fn tab => case lookup_name thing_identifier | |
| 279 | of SOME name => (SOME name, | |
| 280 | Symtab.update_new (name, the (Symtab.lookup src_tab thing_identifier)) tab) | |
| 281 | | NONE => (NONE, tab)) (Symtab.keys src_tab) | |
| 282 | |>> map_filter I; | |
| 283 | ||
| 284 | fun activate_const_syntax thy literals src_tab naming = (Symtab.empty, naming) | |
| 37881 | 285 | |> fold_map (fn c => fn (tab, naming) => | 
| 286 | case Code_Thingol.lookup_const naming c | |
| 34021 | 287 | of SOME name => let | 
| 288 | val (syn, naming') = Code_Printer.activate_const_syntax thy | |
| 37881 | 289 | literals c (the (Symtab.lookup src_tab c)) naming | 
| 34021 | 290 | in (SOME name, (Symtab.update_new (name, syn) tab, naming')) end | 
| 291 | | NONE => (NONE, (tab, naming))) (Symtab.keys src_tab) | |
| 292 | |>> map_filter I; | |
| 293 | ||
| 38927 | 294 | fun activate_symbol_syntax thy literals naming | 
| 295 | class_syntax instance_syntax tyco_syntax const_syntax = | |
| 34021 | 296 | let | 
| 38927 | 297 | val (names_class, class_syntax') = | 
| 298 | activate_syntax (Code_Thingol.lookup_class naming) class_syntax; | |
| 34021 | 299 | val names_inst = map_filter (Code_Thingol.lookup_instance naming) | 
| 38927 | 300 | (Symreltab.keys instance_syntax); | 
| 301 | val (names_tyco, tyco_syntax') = | |
| 302 | activate_syntax (Code_Thingol.lookup_tyco naming) tyco_syntax; | |
| 303 | val (names_const, (const_syntax', _)) = | |
| 304 | activate_const_syntax thy literals const_syntax naming; | |
| 305 | in | |
| 306 | (names_class @ names_inst @ names_tyco @ names_const, | |
| 307 | (class_syntax', tyco_syntax', const_syntax')) | |
| 308 | end; | |
| 309 | ||
| 310 | fun project_program thy abortable names_hidden names1 program2 = | |
| 311 | let | |
| 42361 | 312 | val ctxt = Proof_Context.init_global thy; | 
| 34021 | 313 | val names2 = subtract (op =) names_hidden names1; | 
| 314 | val program3 = Graph.subgraph (not o member (op =) names_hidden) program2; | |
| 38936 | 315 | val names4 = Graph.all_succs program3 names2; | 
| 34021 | 316 | val empty_funs = filter_out (member (op =) abortable) | 
| 317 | (Code_Thingol.empty_funs program3); | |
| 42359 | 318 | val _ = | 
| 319 | if null empty_funs then () | |
| 320 |       else error ("No code equations for " ^
 | |
| 42361 | 321 | commas (map (Proof_Context.extern_const ctxt) empty_funs)); | 
| 38936 | 322 | val program4 = Graph.subgraph (member (op =) names4) program3; | 
| 323 | in (names4, program4) end; | |
| 38927 | 324 | |
| 41342 
3519e0dd8f75
more explicit structure for serializer invocation
 haftmann parents: 
41307diff
changeset | 325 | fun prepare_serializer thy abortable serializer literals reserved all_includes | 
| 38927 | 326 | module_alias proto_class_syntax proto_instance_syntax proto_tyco_syntax proto_const_syntax | 
| 39058 | 327 | module_name args naming proto_program names = | 
| 38927 | 328 | let | 
| 329 | val (names_hidden, (class_syntax, tyco_syntax, const_syntax)) = | |
| 330 | activate_symbol_syntax thy literals naming | |
| 331 | proto_class_syntax proto_instance_syntax proto_tyco_syntax proto_const_syntax; | |
| 332 | val (names_all, program) = project_program thy abortable names_hidden names proto_program; | |
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 333 | fun select_include (name, (content, cs)) = | 
| 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 334 | if null cs orelse exists (fn c => case Code_Thingol.lookup_const naming c | 
| 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 335 | of SOME name => member (op =) names_all name | 
| 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 336 | | NONE => false) cs | 
| 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 337 | then SOME (name, content) else NONE; | 
| 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 338 | val includes = map_filter select_include (Symtab.dest all_includes); | 
| 34021 | 339 | in | 
| 41342 
3519e0dd8f75
more explicit structure for serializer invocation
 haftmann parents: 
41307diff
changeset | 340 |     (serializer args {
 | 
| 38927 | 341 | labelled_name = Code_Thingol.labelled_name thy proto_program, | 
| 38926 | 342 | reserved_syms = reserved, | 
| 343 | includes = includes, | |
| 38933 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 344 | module_alias = if module_name = "" then Symtab.lookup module_alias else K (SOME module_name), | 
| 38927 | 345 | class_syntax = Symtab.lookup class_syntax, | 
| 346 | tyco_syntax = Symtab.lookup tyco_syntax, | |
| 41342 
3519e0dd8f75
more explicit structure for serializer invocation
 haftmann parents: 
41307diff
changeset | 347 | const_syntax = Symtab.lookup const_syntax }, | 
| 
3519e0dd8f75
more explicit structure for serializer invocation
 haftmann parents: 
41307diff
changeset | 348 | program) | 
| 34021 | 349 | end; | 
| 350 | ||
| 41342 
3519e0dd8f75
more explicit structure for serializer invocation
 haftmann parents: 
41307diff
changeset | 351 | fun mount_serializer thy target some_width module_name args naming program names = | 
| 34021 | 352 | let | 
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 353 | val (default_width, abortable, data, modify) = activate_target thy target; | 
| 38921 | 354 | val serializer = case the_description data | 
| 38927 | 355 | of Fundamental seri => #serializer seri; | 
| 34021 | 356 | val reserved = the_reserved data; | 
| 43564 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 357 | val module_alias = the_module_alias data | 
| 38925 | 358 |     val { class, instance, tyco, const } = the_symbol_syntax data;
 | 
| 34021 | 359 | val literals = the_literals thy target; | 
| 41342 
3519e0dd8f75
more explicit structure for serializer invocation
 haftmann parents: 
41307diff
changeset | 360 | val (prepared_serializer, prepared_program) = prepare_serializer thy | 
| 
3519e0dd8f75
more explicit structure for serializer invocation
 haftmann parents: 
41307diff
changeset | 361 | abortable serializer literals reserved (the_includes data) module_alias | 
| 
3519e0dd8f75
more explicit structure for serializer invocation
 haftmann parents: 
41307diff
changeset | 362 | class instance tyco const module_name args | 
| 
3519e0dd8f75
more explicit structure for serializer invocation
 haftmann parents: 
41307diff
changeset | 363 | naming (modify naming program) names | 
| 34071 | 364 | val width = the_default default_width some_width; | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 365 | in (fn program => prepared_serializer program width, prepared_program) end; | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 366 | |
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 367 | fun invoke_serializer thy target some_width module_name args naming program names = | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 368 | let | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 369 | val (mounted_serializer, prepared_program) = mount_serializer thy | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 370 | target some_width module_name args naming program names; | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 371 | in mounted_serializer prepared_program end; | 
| 34021 | 372 | |
| 38933 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 373 | fun assert_module_name "" = error ("Empty module name not allowed.")
 | 
| 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 374 | | assert_module_name module_name = module_name; | 
| 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 375 | |
| 34021 | 376 | in | 
| 377 | ||
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 378 | fun export_code_for thy some_path target some_width module_name args = | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 379 | export some_path ooo invoke_serializer thy target some_width module_name args; | 
| 38918 | 380 | |
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 381 | fun produce_code_for thy target some_width module_name args = | 
| 39102 | 382 | let | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 383 | val serializer = invoke_serializer thy target some_width (assert_module_name module_name) args; | 
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 384 | in fn naming => fn program => fn names => | 
| 39661 
6381d18507ef
reverted cs 07549694e2f1 -- use re-printing with current print mode instead after code assembly, avoid Latex.output_typewriter
 haftmann parents: 
39659diff
changeset | 385 | produce (serializer naming program names) |> apsnd (fn deresolve => map deresolve names) | 
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 386 | end; | 
| 38929 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 387 | |
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 388 | fun present_code_for thy target some_width module_name args = | 
| 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 389 | let | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 390 | val serializer = invoke_serializer thy target some_width (assert_module_name module_name) args; | 
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 391 | in fn naming => fn program => fn (names, selects) => | 
| 39661 
6381d18507ef
reverted cs 07549694e2f1 -- use re-printing with current print mode instead after code assembly, avoid Latex.output_typewriter
 haftmann parents: 
39659diff
changeset | 392 | present selects (serializer naming program names) | 
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 393 | end; | 
| 38918 | 394 | |
| 395 | fun check_code_for thy target strict args naming program names_cs = | |
| 37824 | 396 | let | 
| 38933 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 397 | val module_name = "Code"; | 
| 37824 | 398 |     val { env_var, make_destination, make_command } =
 | 
| 399 | (#check o the_fundamental thy) target; | |
| 41939 | 400 | fun ext_check p = | 
| 43564 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 401 | let | 
| 37824 | 402 | val destination = make_destination p; | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 403 | val _ = export (SOME destination) (invoke_serializer thy target (SOME 80) | 
| 39661 
6381d18507ef
reverted cs 07549694e2f1 -- use re-printing with current print mode instead after code assembly, avoid Latex.output_typewriter
 haftmann parents: 
39659diff
changeset | 404 | module_name args naming program names_cs); | 
| 41940 | 405 | val cmd = make_command module_name; | 
| 37824 | 406 |       in if bash ("cd " ^ File.shell_path p ^ " && " ^ cmd ^ " 2>&1") <> 0
 | 
| 407 |         then error ("Code check failed for " ^ target ^ ": " ^ cmd)
 | |
| 408 | else () | |
| 409 | end; | |
| 41940 | 410 | in if getenv env_var = "" | 
| 37825 | 411 | then if strict | 
| 412 | then error (env_var ^ " not set; cannot check code for " ^ target) | |
| 413 | else warning (env_var ^ " not set; skipped checking code for " ^ target) | |
| 41939 | 414 | else Isabelle_System.with_tmp_dir "Code_Test" ext_check | 
| 37824 | 415 | end; | 
| 416 | ||
| 41364 | 417 | fun evaluation mounted_serializer prepared_program consts ((vs, ty), t) = | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 418 | let | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 419 | val _ = if Code_Thingol.contains_dict_var t then | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 420 | error "Term to be evaluated contains free dictionaries" else (); | 
| 43324 
2b47822868e4
discontinued Name.variant to emphasize that this is old-style / indirect;
 wenzelm parents: 
42361diff
changeset | 421 | val v' = singleton (Name.variant_list (map fst vs)) "a"; | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 422 | val vs' = (v', []) :: vs; | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 423 | val ty' = Code_Thingol.fun_tyco `%% [ITyVar v', ty]; | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 424 | val value_name = "Value.value.value" | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 425 | val program = prepared_program | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 426 | |> Graph.new_node (value_name, | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 427 | Code_Thingol.Fun (Term.dummy_patternN, (((vs', ty'), [(([IVar NONE], t), (NONE, true))]), NONE))) | 
| 41364 | 428 | |> fold (curry (perhaps o try o Graph.add_edge) value_name) consts; | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 429 | val (program_code, deresolve) = produce (mounted_serializer program); | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 430 | val value_name' = the (deresolve value_name); | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 431 | in (program_code, value_name') end; | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 432 | |
| 41364 | 433 | fun evaluator thy target naming program consts = | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 434 | let | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 435 | val (mounted_serializer, prepared_program) = mount_serializer thy | 
| 41364 | 436 | target NONE "Code" [] naming program consts; | 
| 437 | in evaluation mounted_serializer prepared_program consts end; | |
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 438 | |
| 34021 | 439 | end; (* local *) | 
| 440 | ||
| 441 | ||
| 442 | (* code generation *) | |
| 443 | ||
| 444 | fun transitivly_non_empty_funs thy naming program = | |
| 445 | let | |
| 446 | val cs = subtract (op =) (abort_allowed thy) (Code_Thingol.empty_funs program); | |
| 447 | val names = map_filter (Code_Thingol.lookup_const naming) cs; | |
| 448 | in subtract (op =) (Graph.all_preds program names) (Graph.keys program) end; | |
| 449 | ||
| 450 | fun read_const_exprs thy cs = | |
| 451 | let | |
| 452 | val (cs1, cs2) = Code_Thingol.read_const_exprs thy cs; | |
| 36271 
2ef9dbddfcb8
optionally ignore errors during translation of equations
 haftmann parents: 
36121diff
changeset | 453 | val (names2, (naming, program)) = Code_Thingol.consts_program thy true cs2; | 
| 
2ef9dbddfcb8
optionally ignore errors during translation of equations
 haftmann parents: 
36121diff
changeset | 454 | val names3 = transitivly_non_empty_funs thy naming program; | 
| 
2ef9dbddfcb8
optionally ignore errors during translation of equations
 haftmann parents: 
36121diff
changeset | 455 | val cs3 = map_filter (fn (c, name) => | 
| 
2ef9dbddfcb8
optionally ignore errors during translation of equations
 haftmann parents: 
36121diff
changeset | 456 | if member (op =) names3 name then SOME c else NONE) (cs2 ~~ names2); | 
| 
2ef9dbddfcb8
optionally ignore errors during translation of equations
 haftmann parents: 
36121diff
changeset | 457 | in union (op =) cs3 cs1 end; | 
| 34021 | 458 | |
| 38918 | 459 | fun prep_destination "" = NONE | 
| 460 | | prep_destination "-" = NONE | |
| 461 | | prep_destination s = SOME (Path.explode s); | |
| 462 | ||
| 34021 | 463 | fun export_code thy cs seris = | 
| 464 | let | |
| 37824 | 465 | val (names_cs, (naming, program)) = Code_Thingol.consts_program thy false cs; | 
| 38918 | 466 | val _ = map (fn (((target, module_name), some_path), args) => | 
| 467 | export_code_for thy some_path target NONE module_name args naming program names_cs) seris; | |
| 34021 | 468 | in () end; | 
| 469 | ||
| 38918 | 470 | fun export_code_cmd raw_cs seris thy = export_code thy (read_const_exprs thy raw_cs) | 
| 471 | ((map o apfst o apsnd) prep_destination seris); | |
| 472 | ||
| 38929 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 473 | fun produce_code thy cs target some_width some_module_name args = | 
| 38918 | 474 | let | 
| 475 | val (names_cs, (naming, program)) = Code_Thingol.consts_program thy false cs; | |
| 38929 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 476 | in produce_code_for thy target some_width some_module_name args naming program names_cs end; | 
| 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 477 | |
| 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 478 | fun present_code thy cs names_stmt target some_width some_module_name args = | 
| 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 479 | let | 
| 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 480 | val (names_cs, (naming, program)) = Code_Thingol.consts_program thy false cs; | 
| 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 481 | in present_code_for thy target some_width some_module_name args naming program (names_cs, names_stmt naming) end; | 
| 34021 | 482 | |
| 37824 | 483 | fun check_code thy cs seris = | 
| 484 | let | |
| 485 | val (names_cs, (naming, program)) = Code_Thingol.consts_program thy false cs; | |
| 38918 | 486 | val _ = map (fn ((target, strict), args) => | 
| 487 | check_code_for thy target strict args naming program names_cs) seris; | |
| 37824 | 488 | in () end; | 
| 489 | ||
| 490 | fun check_code_cmd raw_cs seris thy = check_code thy (read_const_exprs thy raw_cs) seris; | |
| 491 | ||
| 39480 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 492 | local | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 493 | |
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 494 | val parse_const_terms = Scan.repeat1 Args.term | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 495 | >> (fn ts => fn thy => map (Code.check_const thy) ts); | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 496 | |
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 497 | fun parse_names category parse internalize lookup = | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 498 | Scan.lift (Args.parens (Args.$$$ category)) |-- Scan.repeat1 parse | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 499 | >> (fn xs => fn thy => fn naming => map_filter (lookup naming o internalize thy) xs); | 
| 43564 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 500 | |
| 39480 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 501 | val parse_consts = parse_names "consts" Args.term | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 502 | Code.check_const Code_Thingol.lookup_const ; | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 503 | |
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 504 | val parse_types = parse_names "types" (Scan.lift Args.name) | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 505 | Sign.intern_type Code_Thingol.lookup_tyco; | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 506 | |
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 507 | val parse_classes = parse_names "classes" (Scan.lift Args.name) | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 508 | Sign.intern_class Code_Thingol.lookup_class; | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 509 | |
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 510 | val parse_instances = parse_names "instances" (Scan.lift (Args.name --| Args.$$$ "::" -- Args.name)) | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 511 | (fn thy => fn (raw_tyco, raw_class) => (Sign.intern_class thy raw_class, Sign.intern_type thy raw_tyco)) | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 512 | Code_Thingol.lookup_instance; | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 513 | |
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 514 | in | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 515 | |
| 43564 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 516 | val antiq_setup = | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 517 |   Thy_Output.antiquotation @{binding code_stmts}
 | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 518 | (parse_const_terms -- | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 519 | Scan.repeat (parse_consts || parse_types || parse_classes || parse_instances) | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 520 | -- Scan.lift (Args.parens (Args.name -- Scan.option Parse.int))) | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 521 |     (fn {context = ctxt, ...} => fn ((mk_cs, mk_stmtss), (target, some_width)) =>
 | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 522 | let val thy = Proof_Context.theory_of ctxt in | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 523 | present_code thy (mk_cs thy) | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 524 | (fn naming => maps (fn f => f thy naming) mk_stmtss) | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 525 | target some_width "Example" [] | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 526 | end); | 
| 39480 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 527 | |
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 528 | end; | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 529 | |
| 34021 | 530 | |
| 28054 | 531 | (** serializer configuration **) | 
| 27000 | 532 | |
| 533 | (* data access *) | |
| 24219 | 534 | |
| 24992 | 535 | fun cert_class thy class = | 
| 536 | let | |
| 537 | val _ = AxClass.get_info thy class; | |
| 538 | in class end; | |
| 539 | ||
| 27103 | 540 | fun read_class thy = cert_class thy o Sign.intern_class thy; | 
| 24992 | 541 | |
| 542 | fun cert_tyco thy tyco = | |
| 543 | let | |
| 544 | val _ = if Sign.declared_tyname thy tyco then () | |
| 545 |       else error ("No such type constructor: " ^ quote tyco);
 | |
| 546 | in tyco end; | |
| 547 | ||
| 27103 | 548 | fun read_tyco thy = cert_tyco thy o Sign.intern_type thy; | 
| 24219 | 549 | |
| 34071 | 550 | fun cert_inst thy (class, tyco) = | 
| 551 | (cert_class thy class, cert_tyco thy tyco); | |
| 552 | ||
| 553 | fun read_inst thy (raw_tyco, raw_class) = | |
| 554 | (read_class thy raw_class, read_tyco thy raw_tyco); | |
| 555 | ||
| 37844 | 556 | fun gen_add_syntax (mapp, upd, del) prep_x prep_syn target raw_x some_raw_syn thy = | 
| 24219 | 557 | let | 
| 37840 | 558 | val x = prep_x thy raw_x; | 
| 37844 | 559 | val change = case some_raw_syn | 
| 560 | of SOME raw_syn => upd (x, prep_syn thy x raw_syn) | |
| 561 | | NONE => del x; | |
| 38925 | 562 | in (map_symbol_syntax target o mapp) change thy end; | 
| 24219 | 563 | |
| 38923 | 564 | fun gen_add_class_syntax prep_class = | 
| 37844 | 565 | gen_add_syntax (apfst o apfst, Symtab.update, Symtab.delete_safe) prep_class ((K o K) I); | 
| 34071 | 566 | |
| 38923 | 567 | fun gen_add_instance_syntax prep_inst = | 
| 37844 | 568 | gen_add_syntax (apfst o apsnd, Symreltab.update, Symreltab.delete_safe) prep_inst ((K o K) I); | 
| 24219 | 569 | |
| 38923 | 570 | fun gen_add_tyco_syntax prep_tyco = | 
| 37844 | 571 | gen_add_syntax (apsnd o apfst, Symtab.update, Symtab.delete_safe) prep_tyco | 
| 572 | (fn thy => fn tyco => fn syn => if fst syn <> Sign.arity_number thy tyco | |
| 34071 | 573 |       then error ("Number of arguments mismatch in syntax for type constructor " ^ quote tyco)
 | 
| 37844 | 574 | else syn); | 
| 34071 | 575 | |
| 38923 | 576 | fun gen_add_const_syntax prep_const = | 
| 37844 | 577 | gen_add_syntax (apsnd o apsnd, Symtab.update, Symtab.delete_safe) prep_const | 
| 37881 | 578 | (fn thy => fn c => fn syn => | 
| 579 | if Code_Printer.requires_args syn > Code.args_number thy c | |
| 24423 
ae9cd0e92423
overloaded definitions accompanied by explicit constants
 haftmann parents: 
24381diff
changeset | 580 |       then error ("Too many arguments in syntax for constant " ^ quote c)
 | 
| 37881 | 581 | else syn); | 
| 24219 | 582 | |
| 39817 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 583 | fun add_reserved target sym thy = | 
| 24219 | 584 | let | 
| 39817 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 585 | val (_, data) = collapse_hierarchy thy target; | 
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 586 | val _ = if member (op =) (the_reserved data) sym | 
| 24219 | 587 |       then error ("Reserved symbol " ^ quote sym ^ " already declared")
 | 
| 39817 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 588 | else (); | 
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 589 | in | 
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 590 | thy | 
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 591 | |> map_reserved target (insert (op =) sym) | 
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 592 | end; | 
| 24992 | 593 | |
| 28926 | 594 | fun gen_add_include read_const target args thy = | 
| 24992 | 595 | let | 
| 28926 | 596 | fun add (name, SOME (content, raw_cs)) incls = | 
| 24992 | 597 | let | 
| 598 | val _ = if Symtab.defined incls name | |
| 599 |               then warning ("Overwriting existing include " ^ name)
 | |
| 600 | else (); | |
| 28926 | 601 | val cs = map (read_const thy) raw_cs; | 
| 34152 | 602 | in Symtab.update (name, (Code_Printer.str content, cs)) incls end | 
| 28926 | 603 | | add (name, NONE) incls = Symtab.delete name incls; | 
| 604 | in map_includes target (add args) thy end; | |
| 605 | ||
| 33969 | 606 | val add_include = gen_add_include (K I); | 
| 31156 | 607 | val add_include_cmd = gen_add_include Code.read_const; | 
| 24219 | 608 | |
| 38933 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 609 | fun add_module_alias target (thyname, "") = | 
| 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 610 | map_module_alias target (Symtab.delete thyname) | 
| 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 611 | | add_module_alias target (thyname, modlname) = | 
| 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 612 | let | 
| 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 613 | val xs = Long_Name.explode modlname; | 
| 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 614 | val xs' = map (Name.desymbolize true) xs; | 
| 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 615 | in if xs' = xs | 
| 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 616 | then map_module_alias target (Symtab.update (thyname, modlname)) | 
| 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 617 |         else error ("Invalid module name: " ^ quote modlname ^ "\n"
 | 
| 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 618 | ^ "perhaps try " ^ quote (Long_Name.implode xs')) | 
| 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 619 | end; | 
| 24219 | 620 | |
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28090diff
changeset | 621 | fun gen_allow_abort prep_const raw_c thy = | 
| 24841 | 622 | let | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28090diff
changeset | 623 | val c = prep_const thy raw_c; | 
| 34248 | 624 | in thy |> (Targets.map o apfst o apsnd) (insert (op =) c) end; | 
| 24841 | 625 | |
| 27000 | 626 | |
| 27103 | 627 | (* concrete syntax *) | 
| 27000 | 628 | |
| 34021 | 629 | local | 
| 630 | ||
| 34152 | 631 | fun zip_list (x::xs) f g = | 
| 632 | f | |
| 37881 | 633 | :|-- (fn y => | 
| 34152 | 634 | fold_map (fn x => g |-- f >> pair x) xs | 
| 37881 | 635 | :|-- (fn xys => pair ((x, y) :: xys))); | 
| 34152 | 636 | |
| 37881 | 637 | fun process_multi_syntax parse_thing parse_syntax change = | 
| 638 | (Parse.and_list1 parse_thing | |
| 639 |   :|-- (fn things => Scan.repeat1 (Parse.$$$ "(" |-- Parse.name --
 | |
| 640 | (zip_list things parse_syntax (Parse.$$$ "and")) --| Parse.$$$ ")"))) | |
| 641 | >> (Toplevel.theory oo fold) | |
| 642 | (fn (target, syns) => fold (fn (raw_x, syn) => change target raw_x syn) syns); | |
| 24219 | 643 | |
| 644 | in | |
| 645 | ||
| 38923 | 646 | val add_class_syntax = gen_add_class_syntax cert_class; | 
| 647 | val add_instance_syntax = gen_add_instance_syntax cert_inst; | |
| 648 | val add_tyco_syntax = gen_add_tyco_syntax cert_tyco; | |
| 649 | val add_const_syntax = gen_add_const_syntax (K I); | |
| 27103 | 650 | val allow_abort = gen_allow_abort (K I); | 
| 28054 | 651 | val add_reserved = add_reserved; | 
| 33969 | 652 | val add_include = add_include; | 
| 24219 | 653 | |
| 38923 | 654 | val add_class_syntax_cmd = gen_add_class_syntax read_class; | 
| 655 | val add_instance_syntax_cmd = gen_add_instance_syntax read_inst; | |
| 656 | val add_tyco_syntax_cmd = gen_add_tyco_syntax read_tyco; | |
| 657 | val add_const_syntax_cmd = gen_add_const_syntax Code.read_const; | |
| 31156 | 658 | val allow_abort_cmd = gen_allow_abort Code.read_const; | 
| 24219 | 659 | |
| 28054 | 660 | fun parse_args f args = | 
| 36959 
f5417836dbea
renamed structure OuterLex to Token and type token to Token.T, keeping legacy aliases for some time;
 wenzelm parents: 
36537diff
changeset | 661 | case Scan.read Token.stopper f args | 
| 28054 | 662 | of SOME x => x | 
| 663 | | NONE => error "Bad serializer arguments"; | |
| 664 | ||
| 665 | ||
| 27304 | 666 | (** Isar setup **) | 
| 27103 | 667 | |
| 37824 | 668 | val (inK, module_nameK, fileK, checkingK) = ("in", "module_name", "file", "checking");
 | 
| 669 | ||
| 670 | val code_expr_argsP = Scan.optional (Parse.$$$ "(" |-- Args.parse --| Parse.$$$ ")") [];
 | |
| 27103 | 671 | |
| 30494 
c150e6fa4e0d
consider exit status of code generation direcitve
 haftmann parents: 
30242diff
changeset | 672 | val code_exprP = | 
| 37824 | 673 | Scan.repeat1 Parse.term_group :|-- (fn raw_cs => | 
| 37825 | 674 | ((Parse.$$$ checkingK |-- Scan.repeat (Parse.name | 
| 675 | -- ((Parse.$$$ "?" |-- Scan.succeed false) || Scan.succeed true) -- code_expr_argsP)) | |
| 37824 | 676 | >> (fn seris => check_code_cmd raw_cs seris) | 
| 677 | || Scan.repeat (Parse.$$$ inK |-- Parse.name | |
| 38933 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 678 | -- Scan.optional (Parse.$$$ module_nameK |-- Parse.name) "" | 
| 37824 | 679 | -- Scan.optional (Parse.$$$ fileK |-- Parse.name) "" | 
| 680 | -- code_expr_argsP) >> (fn seris => export_code_cmd raw_cs seris))); | |
| 27103 | 681 | |
| 37824 | 682 | val _ = List.app Keyword.keyword [inK, module_nameK, fileK, checkingK]; | 
| 24867 | 683 | |
| 684 | val _ = | |
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 685 | Outer_Syntax.command "code_class" "define code syntax for class" Keyword.thy_decl ( | 
| 37881 | 686 | process_multi_syntax Parse.xname (Scan.option Parse.string) | 
| 38923 | 687 | add_class_syntax_cmd); | 
| 24219 | 688 | |
| 24867 | 689 | val _ = | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 690 | Outer_Syntax.command "code_instance" "define code syntax for instance" Keyword.thy_decl ( | 
| 37881 | 691 | process_multi_syntax (Parse.xname --| Parse.$$$ "::" -- Parse.xname) | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 692 | (Scan.option (Parse.minus >> K ())) | 
| 38923 | 693 | add_instance_syntax_cmd); | 
| 24219 | 694 | |
| 24867 | 695 | val _ = | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 696 | Outer_Syntax.command "code_type" "define code syntax for type constructor" Keyword.thy_decl ( | 
| 37881 | 697 | process_multi_syntax Parse.xname Code_Printer.parse_tyco_syntax | 
| 38923 | 698 | add_tyco_syntax_cmd); | 
| 24219 | 699 | |
| 24867 | 700 | val _ = | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 701 | Outer_Syntax.command "code_const" "define code syntax for constant" Keyword.thy_decl ( | 
| 37881 | 702 | process_multi_syntax Parse.term_group Code_Printer.parse_const_syntax | 
| 38923 | 703 | add_const_syntax_cmd); | 
| 24219 | 704 | |
| 24867 | 705 | val _ = | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 706 | Outer_Syntax.command "code_reserved" "declare words as reserved for target language" | 
| 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 707 | Keyword.thy_decl ( | 
| 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 708 | Parse.name -- Scan.repeat1 Parse.name | 
| 24219 | 709 | >> (fn (target, reserveds) => (Toplevel.theory o fold (add_reserved target)) reserveds) | 
| 24841 | 710 | ); | 
| 24219 | 711 | |
| 24867 | 712 | val _ = | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 713 | Outer_Syntax.command "code_include" "declare piece of code to be included in generated code" | 
| 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 714 | Keyword.thy_decl ( | 
| 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 715 | Parse.name -- Parse.name -- (Parse.text :|-- (fn "-" => Scan.succeed NONE | 
| 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 716 | | s => Scan.optional (Parse.$$$ "attach" |-- Scan.repeat1 Parse.term) [] >> pair s >> SOME)) | 
| 28926 | 717 | >> (fn ((target, name), content_consts) => | 
| 718 | (Toplevel.theory o add_include_cmd target) (name, content_consts)) | |
| 24992 | 719 | ); | 
| 720 | ||
| 721 | val _ = | |
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 722 | Outer_Syntax.command "code_modulename" "alias module to other name" Keyword.thy_decl ( | 
| 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 723 | Parse.name -- Scan.repeat1 (Parse.name -- Parse.name) | 
| 27103 | 724 | >> (fn (target, modlnames) => (Toplevel.theory o fold (add_module_alias target)) modlnames) | 
| 725 | ); | |
| 726 | ||
| 727 | val _ = | |
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 728 | Outer_Syntax.command "code_abort" "permit constant to be implemented as program abort" | 
| 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 729 | Keyword.thy_decl ( | 
| 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 730 | Scan.repeat1 Parse.term_group >> (Toplevel.theory o fold allow_abort_cmd) | 
| 24841 | 731 | ); | 
| 24219 | 732 | |
| 24867 | 733 | val _ = | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 734 | Outer_Syntax.command "export_code" "generate executable code for constants" | 
| 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36959diff
changeset | 735 | Keyword.diag (Parse.!!! code_exprP >> (fn f => Toplevel.keep (f o Toplevel.theory_of))); | 
| 30494 
c150e6fa4e0d
consider exit status of code generation direcitve
 haftmann parents: 
30242diff
changeset | 736 | |
| 24219 | 737 | end; (*local*) | 
| 738 | ||
| 39646 | 739 | |
| 740 | (** external entrance point -- for codegen tool **) | |
| 741 | ||
| 39750 
c0099428ca7b
consider quick_and_dirty option before loading theory
 haftmann parents: 
39679diff
changeset | 742 | fun codegen_tool thyname cmd_expr = | 
| 39646 | 743 | let | 
| 744 | val thy = Thy_Info.get_theory thyname; | |
| 745 | val parse = Scan.read Token.stopper (Parse.!!! code_exprP) o | |
| 746 | (filter Token.is_proper o Outer_Syntax.scan Position.none); | |
| 747 | in case parse cmd_expr | |
| 748 | of SOME f => (writeln "Now generating code..."; f thy) | |
| 749 |     | NONE => error ("Bad directive " ^ quote cmd_expr)
 | |
| 750 | end; | |
| 751 | ||
| 43564 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 752 | |
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 753 | (** theory setup **) | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 754 | |
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 755 | val setup = antiq_setup; | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 756 | |
| 24219 | 757 | end; (*struct*) |