| author | blanchet | 
| Wed, 05 Jun 2013 13:19:26 +0200 | |
| changeset 52303 | 16d7708aba40 | 
| parent 52218 | b3a5c6f2cb67 | 
| child 52377 | afa72aaed518 | 
| 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 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 53 |   type ('a, 'b, 'c, 'd, 'e, 'f) symbol_attr_decl
 | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 54 | type identifier_data | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 55 | val set_identifiers: (string, string, string, string, string, string) symbol_attr_decl | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 56 | -> theory -> theory | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 57 | type const_syntax = Code_Printer.const_syntax | 
| 34152 | 58 | type tyco_syntax = Code_Printer.tyco_syntax | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 59 | val set_printings: (const_syntax, tyco_syntax, string, unit, unit, (string * string list)) symbol_attr_decl | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 60 | -> theory -> theory | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 61 | val add_const_syntax: string -> string -> const_syntax option -> theory -> theory | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 62 | val add_tyco_syntax: string -> string -> tyco_syntax option -> theory -> theory | 
| 38923 | 63 | val add_class_syntax: string -> class -> string option -> theory -> theory | 
| 64 | val add_instance_syntax: string -> class * string -> unit option -> theory -> theory | |
| 28054 | 65 | val add_reserved: string -> string -> theory -> theory | 
| 33969 | 66 | val add_include: string -> string * (string * string list) option -> theory -> theory | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 67 | val allow_abort: string -> theory -> theory | 
| 39646 | 68 | |
| 39750 
c0099428ca7b
consider quick_and_dirty option before loading theory
 haftmann parents: 
39679diff
changeset | 69 | 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 | 70 | |
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 71 | val setup: theory -> theory | 
| 24219 | 72 | end; | 
| 73 | ||
| 28054 | 74 | structure Code_Target : CODE_TARGET = | 
| 24219 | 75 | struct | 
| 76 | ||
| 28054 | 77 | open Basic_Code_Thingol; | 
| 34152 | 78 | |
| 79 | type literals = Code_Printer.literals; | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 80 | type ('a, 'b, 'c, 'd, 'e, 'f) symbol_attr_decl =
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 81 | (string * (string * 'a option) list, string * (string * 'b option) list, | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 82 | class * (string * 'c option) list, (class * class) * (string * 'd option) list, | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 83 | (class * string) * (string * 'e option) list, | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 84 | string * (string * 'f option) list) Code_Symbol.attr; | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 85 | type identifier_data = (string, string, string, string, string, string) Code_Symbol.data; | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 86 | |
| 34152 | 87 | type tyco_syntax = Code_Printer.tyco_syntax; | 
| 37876 | 88 | type const_syntax = Code_Printer.const_syntax; | 
| 34152 | 89 | |
| 24219 | 90 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 91 | (** serializations and serializer **) | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 92 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 93 | (* serialization: abstract nonsense to cover different destinies for generated code *) | 
| 24219 | 94 | |
| 38929 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 95 | datatype destination = Export of Path.T option | Produce | Present of string list; | 
| 48568 | 96 | type serialization = int -> destination -> ((string * string) list * (string -> string option)) option; | 
| 27014 
a5f53d9d2b60
yet another attempt to circumvent printmode problems
 haftmann parents: 
27001diff
changeset | 97 | |
| 39659 | 98 | 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 | 99 | (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 | 100 | | 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 | 101 | string [] width content |> SOME | 
| 39659 | 102 | | 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 | 103 | string stmt_names width content | 
| 48568 | 104 | |> (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 | 105 | |> SOME; | 
| 39659 | 106 | |
| 39661 
6381d18507ef
reverted cs 07549694e2f1 -- use re-printing with current print mode instead after code assembly, avoid Latex.output_typewriter
 haftmann parents: 
39659diff
changeset | 107 | 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 | 108 | fun produce f = the (f Produce); | 
| 48568 | 109 | fun present stmt_names f = space_implode "\n\n" (map snd (fst (the (f (Present stmt_names))))); | 
| 38917 | 110 | |
| 24219 | 111 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 112 | (* serializers: functions producing serializations *) | 
| 28054 | 113 | |
| 39142 | 114 | type serializer = Token.T list | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 115 | -> Proof.context | 
| 39142 | 116 |   -> {
 | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 117 | symbol_of: string -> Code_Symbol.symbol, | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 118 | module_name: string, | 
| 38926 | 119 | reserved_syms: string list, | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 120 | identifiers: identifier_data, | 
| 38926 | 121 | includes: (string * Pretty.T) list, | 
| 122 | class_syntax: string -> string option, | |
| 123 | tyco_syntax: string -> Code_Printer.tyco_syntax option, | |
| 41342 
3519e0dd8f75
more explicit structure for serializer invocation
 haftmann parents: 
41307diff
changeset | 124 | const_syntax: string -> Code_Printer.activated_const_syntax option } | 
| 
3519e0dd8f75
more explicit structure for serializer invocation
 haftmann parents: 
41307diff
changeset | 125 | -> Code_Thingol.program | 
| 28054 | 126 | -> serialization; | 
| 27000 | 127 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 128 | datatype description = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 129 |     Fundamental of { serializer: serializer,
 | 
| 38910 | 130 | literals: literals, | 
| 37822 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 131 |       check: { env_var: string, make_destination: Path.T -> Path.T,
 | 
| 41940 | 132 | make_command: string -> string } } | 
| 38909 | 133 | | Extension of string * | 
| 134 | (Code_Thingol.naming -> Code_Thingol.program -> Code_Thingol.program); | |
| 28054 | 135 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 136 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 137 | (** theory data **) | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 138 | |
| 28054 | 139 | datatype target = Target of {
 | 
| 140 | serial: serial, | |
| 37821 | 141 | description: description, | 
| 28054 | 142 | reserved: string list, | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 143 | identifiers: identifier_data, | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 144 | printings: (Code_Printer.const_syntax, Code_Printer.tyco_syntax, string, unit, unit, | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 145 | (Pretty.T * string list)) Code_Symbol.data | 
| 28054 | 146 | }; | 
| 27103 | 147 | |
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 148 | fun make_target ((serial, description), (reserved, (identifiers, printings))) = | 
| 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,
 | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 150 | identifiers = identifiers, printings = printings }; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 151 | fun map_target f (Target { serial, description, reserved, identifiers, printings }) =
 | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 152 | make_target (f ((serial, description), (reserved, (identifiers, printings)))); | 
| 37821 | 153 | fun merge_target strict target (Target { serial = serial1, description = description,
 | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 154 | reserved = reserved1, identifiers = identifiers1, printings = printings1 }, | 
| 37821 | 155 |     Target { serial = serial2, description = _,
 | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 156 | reserved = reserved2, identifiers = identifiers2, printings = printings2 }) = | 
| 28054 | 157 | if serial1 = serial2 orelse not strict then | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 158 | make_target ((serial1, description), (merge (op =) (reserved1, reserved2), | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 159 | (Code_Symbol.merge_data (identifiers1, identifiers2), | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 160 | Code_Symbol.merge_data (printings1, printings2)))) | 
| 28054 | 161 | else | 
| 37821 | 162 |     error ("Incompatible targets: " ^ quote target);
 | 
| 27103 | 163 | |
| 37821 | 164 | fun the_description (Target { description, ... }) = description;
 | 
| 28054 | 165 | fun the_reserved (Target { reserved, ... }) = reserved;
 | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 166 | fun the_identifiers (Target { identifiers , ... }) = identifiers;
 | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 167 | fun the_printings (Target { printings, ... }) = printings;
 | 
| 27437 | 168 | |
| 34248 | 169 | structure Targets = Theory_Data | 
| 34071 | 170 | ( | 
| 171 | type T = (target Symtab.table * string list) * int; | |
| 172 | val empty = ((Symtab.empty, []), 80); | |
| 173 | val extend = I; | |
| 174 | fun merge (((target1, exc1), width1), ((target2, exc2), width2)) : T = | |
| 175 | ((Symtab.join (merge_target true) (target1, target2), | |
| 176 | Library.merge (op =) (exc1, exc2)), Int.max (width1, width2)); | |
| 177 | ); | |
| 27436 | 178 | |
| 34248 | 179 | val abort_allowed = snd o fst o Targets.get; | 
| 34071 | 180 | |
| 34248 | 181 | fun assert_target thy target = if Symtab.defined ((fst o fst) (Targets.get thy)) target | 
| 33969 | 182 | then target | 
| 183 |   else error ("Unknown code target language: " ^ quote target);
 | |
| 28054 | 184 | |
| 185 | fun put_target (target, seri) thy = | |
| 27304 | 186 | let | 
| 34248 | 187 | val lookup_target = Symtab.lookup ((fst o fst) (Targets.get thy)); | 
| 28054 | 188 | val _ = case seri | 
| 37821 | 189 | of Extension (super, _) => if is_some (lookup_target super) then () | 
| 28054 | 190 |           else error ("Unknown code target language: " ^ quote super)
 | 
| 191 | | _ => (); | |
| 37821 | 192 | val overwriting = case (Option.map the_description o lookup_target) target | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28090diff
changeset | 193 | of NONE => false | 
| 37821 | 194 | | SOME (Extension _) => true | 
| 195 | | SOME (Fundamental _) => (case seri | |
| 196 |          of Extension _ => error ("Will not overwrite existing target " ^ quote target)
 | |
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28090diff
changeset | 197 | | _ => true); | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28090diff
changeset | 198 | val _ = if overwriting | 
| 28054 | 199 |       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 | 200 | else (); | 
| 28054 | 201 | in | 
| 202 | thy | |
| 34248 | 203 | |> (Targets.map o apfst o apfst o Symtab.update) | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 204 | (target, make_target ((serial (), seri), | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 205 | ([], (Code_Symbol.empty_data, Code_Symbol.empty_data)))) | 
| 28054 | 206 | end; | 
| 27436 | 207 | |
| 37821 | 208 | fun add_target (target, seri) = put_target (target, Fundamental seri); | 
| 28054 | 209 | fun extend_target (target, (super, modify)) = | 
| 37821 | 210 | put_target (target, Extension (super, modify)); | 
| 27436 | 211 | |
| 28054 | 212 | fun map_target_data target f thy = | 
| 27436 | 213 | let | 
| 28054 | 214 | val _ = assert_target thy target; | 
| 215 | in | |
| 216 | thy | |
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 217 | |> (Targets.map o apfst o apfst o Symtab.map_entry target o map_target o apsnd) f | 
| 28054 | 218 | end; | 
| 27304 | 219 | |
| 28054 | 220 | fun map_reserved target = | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 221 | map_target_data target o apfst; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 222 | fun map_identifiers target = | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 223 | map_target_data target o apsnd o apfst; | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 224 | fun map_printings target = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 225 | map_target_data target o apsnd o apsnd; | 
| 27000 | 226 | |
| 34248 | 227 | fun set_default_code_width k = (Targets.map o apsnd) (K k); | 
| 34071 | 228 | |
| 27000 | 229 | |
| 34021 | 230 | (** serializer usage **) | 
| 231 | ||
| 232 | (* montage *) | |
| 233 | ||
| 37822 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 234 | fun the_fundamental thy = | 
| 34021 | 235 | let | 
| 34248 | 236 | val ((targets, _), _) = Targets.get thy; | 
| 37822 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 237 | fun fundamental target = case Symtab.lookup targets target | 
| 37821 | 238 | of SOME data => (case the_description data | 
| 37822 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 239 | of Fundamental data => data | 
| 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 240 | | Extension (super, _) => fundamental super) | 
| 34021 | 241 |       | NONE => error ("Unknown code target language: " ^ quote target);
 | 
| 37822 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 242 | in fundamental end; | 
| 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 243 | |
| 
cf3588177676
use generic description slot for formal code checking
 haftmann parents: 
37821diff
changeset | 244 | fun the_literals thy = #literals o the_fundamental thy; | 
| 34021 | 245 | |
| 39817 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 246 | fun collapse_hierarchy thy = | 
| 38927 | 247 | let | 
| 39817 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 248 | 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 | 249 | fun collapse target = | 
| 38927 | 250 | let | 
| 251 | val data = case Symtab.lookup targets target | |
| 252 | of SOME data => data | |
| 253 |           | NONE => error ("Unknown code target language: " ^ quote target);
 | |
| 254 | in case the_description data | |
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 255 | of Fundamental _ => (K I, data) | 
| 38927 | 256 | | Extension (super, modify) => let | 
| 39817 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 257 | val (modify', data') = collapse super | 
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 258 | in (fn naming => modify' naming #> modify naming, merge_target false target (data', data)) end | 
| 38927 | 259 | end; | 
| 39817 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 260 | in collapse end; | 
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 261 | |
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 262 | local | 
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 263 | |
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 264 | fun activate_target thy target = | 
| 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 265 | let | 
| 47576 | 266 | val ((_, abortable), default_width) = Targets.get thy; | 
| 39817 
5228c6b20273
check whole target hierarchy for existing reserved symbols
 haftmann parents: 
39750diff
changeset | 267 | val (modify, data) = collapse_hierarchy thy target; | 
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 268 | in (default_width, abortable, data, modify) end; | 
| 38927 | 269 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 270 | fun activate_const_syntax thy literals cs_data naming = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 271 | (Symtab.empty, naming) | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 272 | |> fold_map (fn (c, data) => fn (tab, naming) => | 
| 37881 | 273 | case Code_Thingol.lookup_const naming c | 
| 34021 | 274 | of SOME name => let | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 275 | val (syn, naming') = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 276 | Code_Printer.activate_const_syntax thy literals c data naming | 
| 34021 | 277 | in (SOME name, (Symtab.update_new (name, syn) tab, naming')) end | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 278 | | NONE => (NONE, (tab, naming))) cs_data | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 279 | |>> map_filter I; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 280 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 281 | fun activate_syntax lookup_name things = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 282 | Symtab.empty | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 283 | |> fold_map (fn (thing_identifier, data) => fn tab => case lookup_name thing_identifier | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 284 | of SOME name => (SOME name, Symtab.update_new (name, data) tab) | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 285 | | NONE => (NONE, tab)) things | 
| 34021 | 286 | |>> map_filter I; | 
| 287 | ||
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 288 | fun activate_symbol_syntax thy literals naming printings = | 
| 34021 | 289 | let | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 290 | val (names_const, (const_syntax, _)) = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 291 | activate_const_syntax thy literals (Code_Symbol.dest_constant_data printings) naming; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 292 | val (names_tyco, tyco_syntax) = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 293 | activate_syntax (Code_Thingol.lookup_tyco naming) (Code_Symbol.dest_type_constructor_data printings); | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 294 | val (names_class, class_syntax) = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 295 | activate_syntax (Code_Thingol.lookup_class naming) (Code_Symbol.dest_type_class_data printings); | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 296 | val names_inst = map_filter (Code_Thingol.lookup_instance naming o fst) | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 297 | (Code_Symbol.dest_class_instance_data printings); | 
| 38927 | 298 | in | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 299 | (names_const @ names_tyco @ names_class @ names_inst, | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 300 | (const_syntax, tyco_syntax, class_syntax)) | 
| 38927 | 301 | end; | 
| 302 | ||
| 303 | fun project_program thy abortable names_hidden names1 program2 = | |
| 304 | let | |
| 42361 | 305 | val ctxt = Proof_Context.init_global thy; | 
| 34021 | 306 | val names2 = subtract (op =) names_hidden names1; | 
| 46614 
165886a4fe64
clarified Graph.restrict (formerly Graph.subgraph) based on public graph operations;
 wenzelm parents: 
44751diff
changeset | 307 | val program3 = Graph.restrict (not o member (op =) names_hidden) program2; | 
| 38936 | 308 | val names4 = Graph.all_succs program3 names2; | 
| 34021 | 309 | val empty_funs = filter_out (member (op =) abortable) | 
| 310 | (Code_Thingol.empty_funs program3); | |
| 42359 | 311 | val _ = | 
| 312 | if null empty_funs then () | |
| 313 |       else error ("No code equations for " ^
 | |
| 42361 | 314 | 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 | 315 | val program4 = Graph.restrict (member (op =) names4) program3; | 
| 38936 | 316 | in (names4, program4) end; | 
| 38927 | 317 | |
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 318 | fun prepare_serializer thy abortable (serializer : serializer) literals reserved identifiers | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 319 | printings module_name args naming proto_program names = | 
| 38927 | 320 | let | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 321 | val (names_hidden, (const_syntax, tyco_syntax, class_syntax)) = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 322 | activate_symbol_syntax thy literals naming printings; | 
| 38927 | 323 | 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 | 324 | fun select_include (name, (content, cs)) = | 
| 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 325 | 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 | 326 | of SOME name => member (op =) names_all name | 
| 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 327 | | NONE => false) cs | 
| 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 328 | then SOME (name, content) else NONE; | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 329 | val includes = map_filter select_include (Code_Symbol.dest_module_data printings); | 
| 34021 | 330 | in | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 331 |     (serializer args (Proof_Context.init_global thy) {
 | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 332 | symbol_of = Code_Thingol.symbol_of proto_program, | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 333 | module_name = module_name, | 
| 38926 | 334 | reserved_syms = reserved, | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 335 | identifiers = identifiers, | 
| 38926 | 336 | includes = includes, | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 337 | const_syntax = Symtab.lookup const_syntax, | 
| 38927 | 338 | tyco_syntax = Symtab.lookup tyco_syntax, | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 339 | class_syntax = Symtab.lookup class_syntax }, | 
| 41342 
3519e0dd8f75
more explicit structure for serializer invocation
 haftmann parents: 
41307diff
changeset | 340 | program) | 
| 34021 | 341 | end; | 
| 342 | ||
| 41342 
3519e0dd8f75
more explicit structure for serializer invocation
 haftmann parents: 
41307diff
changeset | 343 | fun mount_serializer thy target some_width module_name args naming program names = | 
| 34021 | 344 | let | 
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 345 | val (default_width, abortable, data, modify) = activate_target thy target; | 
| 38921 | 346 | val serializer = case the_description data | 
| 38927 | 347 | of Fundamental seri => #serializer seri; | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 348 | val (prepared_serializer, prepared_program) = | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 349 | prepare_serializer thy abortable serializer (the_literals thy target) | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 350 | (the_reserved data) (the_identifiers data) (the_printings data) | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 351 | module_name args naming (modify naming program) names | 
| 34071 | 352 | val width = the_default default_width some_width; | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 353 | in (fn program => prepared_serializer program width, prepared_program) end; | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 354 | |
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 355 | fun invoke_serializer thy target some_width module_name args naming program names = | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 356 | let | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 357 | val (mounted_serializer, prepared_program) = mount_serializer thy | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 358 | target some_width module_name args naming program names; | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 359 | in mounted_serializer prepared_program end; | 
| 34021 | 360 | |
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 361 | fun assert_module_name "" = error "Empty module name not allowed here" | 
| 38933 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 362 | | assert_module_name module_name = module_name; | 
| 
bd77e092f67c
avoid strange special treatment of empty module names
 haftmann parents: 
38929diff
changeset | 363 | |
| 48426 
7b03314ee2ac
also consider current working directory (cf. 3a5a5a992519)
 haftmann parents: 
48371diff
changeset | 364 | fun using_master_directory thy = | 
| 
7b03314ee2ac
also consider current working directory (cf. 3a5a5a992519)
 haftmann parents: 
48371diff
changeset | 365 | Option.map (Path.append (File.pwd ()) o Path.append (Thy_Load.master_directory thy)); | 
| 48371 | 366 | |
| 34021 | 367 | in | 
| 368 | ||
| 48568 | 369 | val generatedN = "Generated_Code"; | 
| 370 | ||
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 371 | fun export_code_for thy some_path target some_width module_name args = | 
| 48371 | 372 | export (using_master_directory thy some_path) | 
| 373 | ooo invoke_serializer thy target some_width module_name args; | |
| 38918 | 374 | |
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 375 | fun produce_code_for thy target some_width module_name args = | 
| 39102 | 376 | let | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 377 | 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 | 378 | 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 | 379 | 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 | 380 | end; | 
| 38929 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 381 | |
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 382 | 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 | 383 | let | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 384 | 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 | 385 | 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 | 386 | present selects (serializer naming program names) | 
| 39484 
505f95975a5a
closures separate serializer initialization from serializer invocation as far as appropriate
 haftmann parents: 
39480diff
changeset | 387 | end; | 
| 38918 | 388 | |
| 389 | fun check_code_for thy target strict args naming program names_cs = | |
| 37824 | 390 | let | 
| 391 |     val { env_var, make_destination, make_command } =
 | |
| 392 | (#check o the_fundamental thy) target; | |
| 41939 | 393 | fun ext_check p = | 
| 43564 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 394 | let | 
| 37824 | 395 | val destination = make_destination p; | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 396 | val _ = export (SOME destination) (invoke_serializer thy target (SOME 80) | 
| 48568 | 397 | generatedN args naming program names_cs); | 
| 398 | val cmd = make_command generatedN; | |
| 43850 
7f2cbc713344
moved bash operations to Isabelle_System (cf. Scala version);
 wenzelm parents: 
43564diff
changeset | 399 | in | 
| 
7f2cbc713344
moved bash operations to Isabelle_System (cf. Scala version);
 wenzelm parents: 
43564diff
changeset | 400 |         if Isabelle_System.bash ("cd " ^ File.shell_path p ^ " && " ^ cmd ^ " 2>&1") <> 0
 | 
| 37824 | 401 |         then error ("Code check failed for " ^ target ^ ": " ^ cmd)
 | 
| 402 | else () | |
| 403 | end; | |
| 43850 
7f2cbc713344
moved bash operations to Isabelle_System (cf. Scala version);
 wenzelm parents: 
43564diff
changeset | 404 | in | 
| 
7f2cbc713344
moved bash operations to Isabelle_System (cf. Scala version);
 wenzelm parents: 
43564diff
changeset | 405 | if getenv env_var = "" | 
| 37825 | 406 | then if strict | 
| 407 | then error (env_var ^ " not set; cannot check code for " ^ target) | |
| 408 | else warning (env_var ^ " not set; skipped checking code for " ^ target) | |
| 41939 | 409 | else Isabelle_System.with_tmp_dir "Code_Test" ext_check | 
| 37824 | 410 | end; | 
| 411 | ||
| 41364 | 412 | fun evaluation mounted_serializer prepared_program consts ((vs, ty), t) = | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 413 | let | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 414 | val _ = if Code_Thingol.contains_dict_var t then | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 415 | 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 | 416 | val v' = singleton (Name.variant_list (map fst vs)) "a"; | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 417 | val vs' = (v', []) :: vs; | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 418 | val ty' = Code_Thingol.fun_tyco `%% [ITyVar v', ty]; | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 419 | val value_name = "Value.value.value" | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 420 | val program = prepared_program | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 421 | |> Graph.new_node (value_name, | 
| 52161 | 422 |           Code_Thingol.Fun (@{const_name dummy_pattern}, (((vs', ty'), [(([IVar NONE], t), (NONE, true))]), NONE)))
 | 
| 41364 | 423 | |> fold (curry (perhaps o try o Graph.add_edge) value_name) consts; | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 424 | val (program_code, deresolve) = produce (mounted_serializer program); | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 425 | val value_name' = the (deresolve value_name); | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 426 | in (program_code, value_name') end; | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 427 | |
| 41364 | 428 | fun evaluator thy target naming program consts = | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 429 | let | 
| 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 430 | val (mounted_serializer, prepared_program) = mount_serializer thy | 
| 48568 | 431 | target NONE generatedN [] naming program consts; | 
| 41364 | 432 | in evaluation mounted_serializer prepared_program consts end; | 
| 41344 
d990badc97a3
evaluator separating static and dynamic operations
 haftmann parents: 
41342diff
changeset | 433 | |
| 34021 | 434 | end; (* local *) | 
| 435 | ||
| 436 | ||
| 437 | (* code generation *) | |
| 438 | ||
| 439 | fun transitivly_non_empty_funs thy naming program = | |
| 440 | let | |
| 441 | val cs = subtract (op =) (abort_allowed thy) (Code_Thingol.empty_funs program); | |
| 442 | val names = map_filter (Code_Thingol.lookup_const naming) cs; | |
| 443 | in subtract (op =) (Graph.all_preds program names) (Graph.keys program) end; | |
| 444 | ||
| 445 | fun read_const_exprs thy cs = | |
| 446 | let | |
| 447 | val (cs1, cs2) = Code_Thingol.read_const_exprs thy cs; | |
| 36271 
2ef9dbddfcb8
optionally ignore errors during translation of equations
 haftmann parents: 
36121diff
changeset | 448 | val (names2, (naming, program)) = Code_Thingol.consts_program thy true cs2; | 
| 
2ef9dbddfcb8
optionally ignore errors during translation of equations
 haftmann parents: 
36121diff
changeset | 449 | val names3 = transitivly_non_empty_funs thy naming program; | 
| 
2ef9dbddfcb8
optionally ignore errors during translation of equations
 haftmann parents: 
36121diff
changeset | 450 | val cs3 = map_filter (fn (c, name) => | 
| 
2ef9dbddfcb8
optionally ignore errors during translation of equations
 haftmann parents: 
36121diff
changeset | 451 | if member (op =) names3 name then SOME c else NONE) (cs2 ~~ names2); | 
| 
2ef9dbddfcb8
optionally ignore errors during translation of equations
 haftmann parents: 
36121diff
changeset | 452 | in union (op =) cs3 cs1 end; | 
| 34021 | 453 | |
| 38918 | 454 | fun prep_destination "" = NONE | 
| 455 | | prep_destination "-" = NONE | |
| 456 | | prep_destination s = SOME (Path.explode s); | |
| 457 | ||
| 34021 | 458 | fun export_code thy cs seris = | 
| 459 | let | |
| 37824 | 460 | val (names_cs, (naming, program)) = Code_Thingol.consts_program thy false cs; | 
| 38918 | 461 | val _ = map (fn (((target, module_name), some_path), args) => | 
| 462 | export_code_for thy some_path target NONE module_name args naming program names_cs) seris; | |
| 34021 | 463 | in () end; | 
| 464 | ||
| 38918 | 465 | fun export_code_cmd raw_cs seris thy = export_code thy (read_const_exprs thy raw_cs) | 
| 466 | ((map o apfst o apsnd) prep_destination seris); | |
| 467 | ||
| 38929 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 468 | fun produce_code thy cs target some_width some_module_name args = | 
| 38918 | 469 | let | 
| 470 | val (names_cs, (naming, program)) = Code_Thingol.consts_program thy false cs; | |
| 38929 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 471 | 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 | 472 | |
| 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 473 | 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 | 474 | let | 
| 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 475 | val (names_cs, (naming, program)) = Code_Thingol.consts_program thy false cs; | 
| 
d9ac9dee764d
distinguish code production and code presentation
 haftmann parents: 
38928diff
changeset | 476 | in present_code_for thy target some_width some_module_name args naming program (names_cs, names_stmt naming) end; | 
| 34021 | 477 | |
| 37824 | 478 | fun check_code thy cs seris = | 
| 479 | let | |
| 480 | val (names_cs, (naming, program)) = Code_Thingol.consts_program thy false cs; | |
| 38918 | 481 | val _ = map (fn ((target, strict), args) => | 
| 482 | check_code_for thy target strict args naming program names_cs) seris; | |
| 37824 | 483 | in () end; | 
| 484 | ||
| 485 | fun check_code_cmd raw_cs seris thy = check_code thy (read_const_exprs thy raw_cs) seris; | |
| 486 | ||
| 39480 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 487 | local | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 488 | |
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 489 | val parse_const_terms = Scan.repeat1 Args.term | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 490 | >> (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 | 491 | |
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 492 | fun parse_names category parse internalize lookup = | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 493 | Scan.lift (Args.parens (Args.$$$ category)) |-- Scan.repeat1 parse | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 494 | >> (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 | 495 | |
| 39480 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 496 | val parse_consts = parse_names "consts" Args.term | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 497 | Code.check_const Code_Thingol.lookup_const ; | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 498 | |
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 499 | 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 | 500 | Sign.intern_type Code_Thingol.lookup_tyco; | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 501 | |
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 502 | 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 | 503 | Sign.intern_class Code_Thingol.lookup_class; | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 504 | |
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 505 | 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 | 506 | (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 | 507 | Code_Thingol.lookup_instance; | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 508 | |
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 509 | in | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 510 | |
| 43564 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 511 | val antiq_setup = | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 512 |   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 | 513 | (parse_const_terms -- | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 514 | 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 | 515 | -- 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 | 516 |     (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 | 517 | 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 | 518 | 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 | 519 | (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 | 520 | target some_width "Example" [] | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 521 | end); | 
| 39480 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 522 | |
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 523 | end; | 
| 
a2ed61449dcc
added code_stmts antiquotation from doc-src/more_antiquote.ML
 haftmann parents: 
39142diff
changeset | 524 | |
| 34021 | 525 | |
| 28054 | 526 | (** serializer configuration **) | 
| 27000 | 527 | |
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 528 | (* reserved symbol names *) | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 529 | |
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 530 | fun add_reserved target sym thy = | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 531 | let | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 532 | val (_, data) = collapse_hierarchy thy target; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 533 | val _ = if member (op =) (the_reserved data) sym | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 534 |       then error ("Reserved symbol " ^ quote sym ^ " already declared")
 | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 535 | else (); | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 536 | in | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 537 | thy | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 538 | |> map_reserved target (insert (op =) sym) | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 539 | end; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 540 | |
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 541 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 542 | (* checking and parsing *) | 
| 24219 | 543 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 544 | fun cert_const thy const = | 
| 24992 | 545 | let | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 546 | val _ = if Sign.declared_const thy const then () | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 547 |       else error ("No such constant: " ^ quote const);
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 548 | in const end; | 
| 24992 | 549 | |
| 550 | fun cert_tyco thy tyco = | |
| 551 | let | |
| 552 | val _ = if Sign.declared_tyname thy tyco then () | |
| 553 |       else error ("No such type constructor: " ^ quote tyco);
 | |
| 554 | in tyco end; | |
| 555 | ||
| 27103 | 556 | fun read_tyco thy = cert_tyco thy o Sign.intern_type thy; | 
| 24219 | 557 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 558 | fun cert_class thy class = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 559 | let | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 560 | val _ = Axclass.get_info thy class; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 561 | in class end; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 562 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 563 | fun read_class thy = cert_class thy o Sign.intern_class thy; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 564 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 565 | val parse_classrel_ident = Parse.class --| @{keyword "<"} -- Parse.class;
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 566 | |
| 34071 | 567 | fun cert_inst thy (class, tyco) = | 
| 568 | (cert_class thy class, cert_tyco thy tyco); | |
| 569 | ||
| 570 | fun read_inst thy (raw_tyco, raw_class) = | |
| 571 | (read_class thy raw_class, read_tyco thy raw_tyco); | |
| 572 | ||
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 573 | val parse_inst_ident = Parse.xname --| @{keyword "::"} -- Parse.class;
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 574 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 575 | fun cert_syms thy = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 576 | Code_Symbol.map_attr (apfst (cert_const thy)) (apfst (cert_tyco thy)) | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 577 | (apfst (cert_class thy)) ((apfst o pairself) (cert_class thy)) (apfst (cert_inst thy)) I; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 578 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 579 | fun read_syms thy = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 580 | Code_Symbol.map_attr (apfst (Code.read_const thy)) (apfst (read_tyco thy)) | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 581 | (apfst (read_class thy)) ((apfst o pairself) (read_class thy)) (apfst (read_inst thy)) I; | 
| 24219 | 582 | |
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 583 | fun check_name is_module s = | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 584 | let | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 585 | val _ = if s = "" then error "Bad empty code name" else (); | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 586 | val xs = Long_Name.explode s; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 587 | val xs' = if is_module | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 588 | then map (Name.desymbolize true) xs | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 589 | else if length xs < 2 | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 590 |         then error ("Bad code name without module component: " ^ quote s)
 | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 591 | else | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 592 | let | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 593 | val (ys, y) = split_last xs; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 594 | val ys' = map (Name.desymbolize true) ys; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 595 | val y' = Name.desymbolize false y; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 596 | in ys' @ [y'] end; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 597 | in if xs' = xs | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 598 | then s | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 599 |     else error ("Invalid code name: " ^ quote s ^ "\n"
 | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 600 | ^ "better try " ^ quote (Long_Name.implode xs')) | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 601 | end; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 602 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 603 | fun check_const_syntax thy c syn = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 604 | if Code_Printer.requires_args syn > Code.args_number thy c | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 605 |   then error ("Too many arguments in syntax for constant " ^ quote c)
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 606 | else syn; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 607 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 608 | fun check_tyco_syntax thy tyco syn = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 609 | if fst syn <> Sign.arity_number thy tyco | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 610 |   then error ("Number of arguments mismatch in syntax for type constructor " ^ quote tyco)
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 611 | else syn; | 
| 34071 | 612 | |
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 613 | |
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 614 | (* custom symbol names *) | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 615 | |
| 52218 | 616 | fun arrange_name_decls x = | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 617 | let | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 618 | fun arrange is_module (sym, target_names) = map (fn (target, some_name) => | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 619 | (target, (sym, Option.map (check_name is_module) some_name))) target_names; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 620 | in | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 621 | Code_Symbol.maps_attr' (arrange false) (arrange false) (arrange false) | 
| 52218 | 622 | (arrange false) (arrange false) (arrange true) x | 
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 623 | end; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 624 | |
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 625 | fun cert_name_decls thy = cert_syms thy #> arrange_name_decls; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 626 | |
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 627 | fun read_name_decls thy = read_syms thy #> arrange_name_decls; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 628 | |
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 629 | fun set_identifier (target, sym_name) = map_identifiers target (Code_Symbol.set_data sym_name); | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 630 | |
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 631 | fun gen_set_identifiers prep_name_decl raw_name_decls thy = | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 632 | fold set_identifier (prep_name_decl thy raw_name_decls) thy; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 633 | |
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 634 | val set_identifiers = gen_set_identifiers cert_name_decls; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 635 | val set_identifiers_cmd = gen_set_identifiers read_name_decls; | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 636 | |
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 637 | fun add_module_alias_cmd target = fold (fn (sym, name) => | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 638 | set_identifier (target, Code_Symbol.Module (sym, if name = "" then NONE else SOME (check_name true name)))); | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 639 | |
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 640 | |
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 641 | (* custom printings *) | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 642 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 643 | fun arrange_printings prep_const thy = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 644 | let | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 645 | fun arrange check (sym, target_syns) = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 646 | map (fn (target, some_syn) => (target, (sym, Option.map (check thy sym) some_syn))) target_syns; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 647 | in | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 648 | Code_Symbol.maps_attr' | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 649 | (arrange check_const_syntax) (arrange check_tyco_syntax) | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 650 | (arrange ((K o K) I)) (arrange ((K o K) I)) (arrange ((K o K) I)) | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 651 | (arrange (fn thy => fn _ => fn (raw_content, raw_cs) => | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 652 | (Code_Printer.str raw_content, map (prep_const thy) raw_cs))) | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 653 | end; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 654 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 655 | fun cert_printings thy = cert_syms thy #> arrange_printings cert_const thy; | 
| 24219 | 656 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 657 | fun read_printings thy = read_syms thy #> arrange_printings Code.read_const thy; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 658 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 659 | fun set_printing (target, sym_syn) = map_printings target (Code_Symbol.set_data sym_syn); | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 660 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 661 | fun gen_set_printings prep_print_decl raw_print_decls thy = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 662 | fold set_printing (prep_print_decl thy raw_print_decls) thy; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 663 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 664 | val set_printings = gen_set_printings cert_printings; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 665 | val set_printings_cmd = gen_set_printings read_printings; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 666 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 667 | fun gen_add_syntax Symbol prep_x prep_syn target raw_x some_raw_syn thy = | 
| 24992 | 668 | let | 
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 669 | val x = prep_x thy raw_x; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 670 | in set_printing (target, Symbol (x, Option.map (prep_syn thy x) some_raw_syn)) thy end; | 
| 28926 | 671 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 672 | fun gen_add_const_syntax prep_const = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 673 | gen_add_syntax Code_Symbol.Constant prep_const check_const_syntax; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 674 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 675 | fun gen_add_tyco_syntax prep_tyco = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 676 | gen_add_syntax Code_Symbol.Type_Constructor prep_tyco check_tyco_syntax; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 677 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 678 | fun gen_add_class_syntax prep_class = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 679 | gen_add_syntax Code_Symbol.Type_Class prep_class ((K o K) I); | 
| 24219 | 680 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 681 | fun gen_add_instance_syntax prep_inst = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 682 | gen_add_syntax Code_Symbol.Class_Instance prep_inst ((K o K) I); | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 683 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 684 | fun gen_add_include prep_const target (name, some_content) thy = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 685 | gen_add_syntax Code_Symbol.Module (K I) | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 686 | (fn thy => fn _ => fn (raw_content, raw_cs) => (Code_Printer.str raw_content, map (prep_const thy) raw_cs)) | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 687 | target name some_content thy; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 688 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 689 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 690 | (* abortable constants *) | 
| 24219 | 691 | |
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28090diff
changeset | 692 | fun gen_allow_abort prep_const raw_c thy = | 
| 24841 | 693 | let | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28090diff
changeset | 694 | val c = prep_const thy raw_c; | 
| 34248 | 695 | in thy |> (Targets.map o apfst o apsnd) (insert (op =) c) end; | 
| 24841 | 696 | |
| 27000 | 697 | |
| 27103 | 698 | (* concrete syntax *) | 
| 27000 | 699 | |
| 34021 | 700 | local | 
| 701 | ||
| 47576 | 702 | fun zip_list (x :: xs) f g = | 
| 34152 | 703 | f | 
| 37881 | 704 | :|-- (fn y => | 
| 34152 | 705 | fold_map (fn x => g |-- f >> pair x) xs | 
| 37881 | 706 | :|-- (fn xys => pair ((x, y) :: xys))); | 
| 34152 | 707 | |
| 37881 | 708 | fun process_multi_syntax parse_thing parse_syntax change = | 
| 709 | (Parse.and_list1 parse_thing | |
| 46949 | 710 |   :|-- (fn things => Scan.repeat1 (@{keyword "("} |-- Parse.name --
 | 
| 52068 | 711 |         (zip_list things (Scan.option parse_syntax) @{keyword "and"}) --| @{keyword ")"})))
 | 
| 37881 | 712 | >> (Toplevel.theory oo fold) | 
| 713 | (fn (target, syns) => fold (fn (raw_x, syn) => change target raw_x syn) syns); | |
| 24219 | 714 | |
| 715 | in | |
| 716 | ||
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 717 | val add_reserved = add_reserved; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 718 | val add_const_syntax = gen_add_const_syntax (K I); | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 719 | val add_tyco_syntax = gen_add_tyco_syntax cert_tyco; | 
| 38923 | 720 | val add_class_syntax = gen_add_class_syntax cert_class; | 
| 721 | val add_instance_syntax = gen_add_instance_syntax cert_inst; | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 722 | val add_include = gen_add_include (K I); | 
| 27103 | 723 | val allow_abort = gen_allow_abort (K I); | 
| 24219 | 724 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 725 | val add_const_syntax_cmd = gen_add_const_syntax Code.read_const; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 726 | val add_tyco_syntax_cmd = gen_add_tyco_syntax read_tyco; | 
| 38923 | 727 | val add_class_syntax_cmd = gen_add_class_syntax read_class; | 
| 728 | val add_instance_syntax_cmd = gen_add_instance_syntax read_inst; | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 729 | val add_include_cmd = gen_add_include Code.read_const; | 
| 31156 | 730 | val allow_abort_cmd = gen_allow_abort Code.read_const; | 
| 24219 | 731 | |
| 28054 | 732 | 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 | 733 | case Scan.read Token.stopper f args | 
| 28054 | 734 | of SOME x => x | 
| 735 | | NONE => error "Bad serializer arguments"; | |
| 736 | ||
| 737 | ||
| 27304 | 738 | (** Isar setup **) | 
| 27103 | 739 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 740 | fun parse_single_symbol_pragma parse_keyword parse_isa parse_target = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 741 |   parse_keyword |-- Parse.!!! parse_isa --| (@{keyword "\<rightharpoonup>"} || @{keyword "=>"})
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 742 |     -- Parse.and_list1 (@{keyword "("} |-- (Parse.name --| @{keyword ")"} -- Scan.option parse_target));
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 743 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 744 | fun parse_symbol_pragma parse_const parse_tyco parse_class parse_classrel parse_inst parse_module = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 745 |   parse_single_symbol_pragma @{keyword "constant"} Parse.term_group parse_const
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 746 | >> Code_Symbol.Constant | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 747 |   || parse_single_symbol_pragma @{keyword "type_constructor"} Parse.xname parse_tyco
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 748 | >> Code_Symbol.Type_Constructor | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 749 |   || parse_single_symbol_pragma @{keyword "type_class"} Parse.xname parse_class
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 750 | >> Code_Symbol.Type_Class | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 751 |   || parse_single_symbol_pragma @{keyword "class_relation"} parse_classrel_ident parse_classrel
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 752 | >> Code_Symbol.Class_Relation | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 753 |   || parse_single_symbol_pragma @{keyword "class_instance"} parse_inst_ident parse_inst
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 754 | >> Code_Symbol.Class_Instance | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 755 |   || parse_single_symbol_pragma @{keyword "code_module"} Parse.name parse_module
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 756 | >> Code_Symbol.Module; | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 757 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 758 | fun parse_symbol_pragmas parse_const parse_tyco parse_class parse_classrel parse_inst parse_module = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 759 | Parse.enum1 "|" (Parse.group (fn () => "code symbol pragma") | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 760 | (parse_symbol_pragma parse_const parse_tyco parse_class parse_classrel parse_inst parse_module)); | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 761 | |
| 52138 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 762 | val code_expr_argsP = Scan.optional (@{keyword "("} |-- Args.parse --| @{keyword ")"}) [];
 | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 763 | |
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 764 | val code_exprP = | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 765 | Scan.repeat1 Parse.term_group :|-- (fn raw_cs => | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 766 |     ((@{keyword "checking"} |-- Scan.repeat (Parse.name
 | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 767 |       -- ((@{keyword "?"} |-- Scan.succeed false) || Scan.succeed true) -- code_expr_argsP))
 | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 768 | >> (fn seris => check_code_cmd raw_cs seris) | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 769 |     || Scan.repeat (@{keyword "in"} |-- Parse.name
 | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 770 |        -- Scan.optional (@{keyword "module_name"} |-- Parse.name) ""
 | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 771 |        -- Scan.optional (@{keyword "file"} |-- Parse.name) ""
 | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 772 | -- code_expr_argsP) >> (fn seris => export_code_cmd raw_cs seris))); | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 773 | |
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 774 | val _ = | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 775 |   Outer_Syntax.command @{command_spec "code_reserved"}
 | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 776 | "declare words as reserved for target language" | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 777 | (Parse.name -- Scan.repeat1 Parse.name | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 778 | >> (fn (target, reserveds) => (Toplevel.theory o fold (add_reserved target)) reserveds)); | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 779 | |
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 780 | val _ = | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 781 |   Outer_Syntax.command @{command_spec "code_identifier"} "declare mandatory names for code symbols"
 | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 782 | (parse_symbol_pragmas Parse.name Parse.name Parse.name Parse.name Parse.name Parse.name | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 783 | >> (Toplevel.theory o fold set_identifiers_cmd)); | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 784 | |
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 785 | val _ = | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 786 |   Outer_Syntax.command @{command_spec "code_modulename"} "alias module to other name"
 | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 787 | (Parse.name -- Scan.repeat1 (Parse.name -- Parse.name) | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 788 | >> (fn (target, modlnames) => (Toplevel.theory o add_module_alias_cmd target) modlnames)); | 
| 
e21426f244aa
bookkeeping and input syntax for exact specification of names of symbols in generated code
 haftmann parents: 
52137diff
changeset | 789 | |
| 52137 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 790 | val _ = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 791 |   Outer_Syntax.command @{command_spec "code_printing"} "declare dedicated printing for code symbols"
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 792 | (parse_symbol_pragmas (Code_Printer.parse_const_syntax) (Code_Printer.parse_tyco_syntax) | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 793 | Parse.string (Parse.minus >> K ()) (Parse.minus >> K ()) | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 794 |       (Parse.text -- Scan.optional (@{keyword "attach"} |-- Scan.repeat1 Parse.term) [])
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 795 | >> (Toplevel.theory o fold set_printings_cmd)); | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 796 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 797 | val _ = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 798 |   Outer_Syntax.command @{command_spec "code_const"} "define code syntax for constant"
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 799 | (process_multi_syntax Parse.term_group Code_Printer.parse_const_syntax | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 800 | add_const_syntax_cmd); | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 801 | |
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 802 | val _ = | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 803 |   Outer_Syntax.command @{command_spec "code_type"} "define code syntax for type constructor"
 | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 804 | (process_multi_syntax Parse.xname Code_Printer.parse_tyco_syntax | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 805 | add_tyco_syntax_cmd); | 
| 
7f7337447b1b
use generic data for code symbols for unified "code_printing" syntax for custom serialisations
 haftmann parents: 
52068diff
changeset | 806 | |
| 24867 | 807 | val _ = | 
| 46961 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 808 |   Outer_Syntax.command @{command_spec "code_class"} "define code syntax for class"
 | 
| 52068 | 809 | (process_multi_syntax Parse.xname Parse.string | 
| 46961 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 810 | add_class_syntax_cmd); | 
| 24219 | 811 | |
| 24867 | 812 | val _ = | 
| 46961 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 813 |   Outer_Syntax.command @{command_spec "code_instance"} "define code syntax for instance"
 | 
| 52068 | 814 |     (process_multi_syntax (Parse.xname --| @{keyword "::"} -- Parse.xname) (Parse.minus >> K ())
 | 
| 46961 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 815 | add_instance_syntax_cmd); | 
| 24219 | 816 | |
| 24867 | 817 | val _ = | 
| 46961 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 818 |   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 | 819 | "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 | 820 | (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 | 821 | (fn "-" => Scan.succeed NONE | 
| 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 822 |         | 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 | 823 | >> (fn ((target, name), content_consts) => | 
| 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 824 | (Toplevel.theory o add_include_cmd target) (name, content_consts))); | 
| 24992 | 825 | |
| 826 | val _ = | |
| 46961 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 827 |   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 | 828 | "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 | 829 | (Scan.repeat1 Parse.term_group >> (Toplevel.theory o fold allow_abort_cmd)); | 
| 24219 | 830 | |
| 24867 | 831 | val _ = | 
| 46961 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46949diff
changeset | 832 |   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 | 833 | (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 | 834 | |
| 24219 | 835 | end; (*local*) | 
| 836 | ||
| 39646 | 837 | |
| 838 | (** external entrance point -- for codegen tool **) | |
| 839 | ||
| 39750 
c0099428ca7b
consider quick_and_dirty option before loading theory
 haftmann parents: 
39679diff
changeset | 840 | fun codegen_tool thyname cmd_expr = | 
| 39646 | 841 | let | 
| 842 | val thy = Thy_Info.get_theory thyname; | |
| 843 | val parse = Scan.read Token.stopper (Parse.!!! code_exprP) o | |
| 844 | (filter Token.is_proper o Outer_Syntax.scan Position.none); | |
| 845 | in case parse cmd_expr | |
| 846 | of SOME f => (writeln "Now generating code..."; f thy) | |
| 847 |     | NONE => error ("Bad directive " ^ quote cmd_expr)
 | |
| 848 | end; | |
| 849 | ||
| 43564 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 850 | |
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 851 | (** theory setup **) | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 852 | |
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 853 | val setup = antiq_setup; | 
| 
9864182c6bad
document antiquotations are managed as theory data, with proper name space and entity markup;
 wenzelm parents: 
43324diff
changeset | 854 | |
| 24219 | 855 | end; (*struct*) |