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