wenzelm@389: (* Title: Pure/Thy/thy_parse.ML wenzelm@389: ID: $Id$ wenzelm@389: Author: Markus Wenzel, TU Muenchen wenzelm@389: wenzelm@389: The parser for theory files. wenzelm@389: *) wenzelm@389: wenzelm@3900: (* FIXME tmp *) wenzelm@3900: val global_names = ref true; wenzelm@3900: wenzelm@3900: wenzelm@389: infix 5 -- --$$ $$-- ^^; wenzelm@389: infix 3 >>; wenzelm@389: infix 0 ||; wenzelm@389: wenzelm@389: signature THY_PARSE = paulson@1512: sig wenzelm@389: type token wenzelm@389: val !! : ('a -> 'b * 'c) -> 'a -> 'b * 'c wenzelm@389: val >> : ('a -> 'b * 'c) * ('b -> 'd) -> 'a -> 'd * 'c wenzelm@389: val || : ('a -> 'b) * ('a -> 'b) -> 'a -> 'b wenzelm@389: val -- : ('a -> 'b * 'c) * ('c -> 'd * 'e) -> 'a -> ('b * 'd) * 'e wenzelm@389: val ^^ : ('a -> string * 'b) * ('b -> string * 'c) -> 'a -> string * 'c wenzelm@389: val $$ : string -> token list -> string * token list wenzelm@389: val $$-- : string * (token list -> 'b * 'c) -> token list -> 'b * 'c wenzelm@389: val --$$ : ('a -> 'b * token list) * string -> 'a -> 'b * token list wenzelm@389: val ident: token list -> string * token list wenzelm@389: val long_ident: token list -> string * token list wenzelm@389: val long_id: token list -> string * token list wenzelm@389: val type_var: token list -> string * token list wenzelm@636: val type_args: token list -> string list * token list wenzelm@389: val nat: token list -> string * token list wenzelm@389: val string: token list -> string * token list wenzelm@389: val verbatim: token list -> string * token list wenzelm@389: val empty: 'a -> 'b list * 'a wenzelm@389: val optional: ('a -> 'b * 'a) -> 'b -> 'a -> 'b * 'a wenzelm@389: val repeat: ('a -> 'b * 'a) -> 'a -> 'b list * 'a wenzelm@389: val repeat1: ('a -> 'b * 'a) -> 'a -> 'b list * 'a wenzelm@389: val enum: string -> (token list -> 'a * token list) wenzelm@389: -> token list -> 'a list * token list wenzelm@389: val enum1: string -> (token list -> 'a * token list) wenzelm@389: -> token list -> 'a list * token list wenzelm@389: val list: (token list -> 'a * token list) wenzelm@389: -> token list -> 'a list * token list wenzelm@389: val list1: (token list -> 'a * token list) wenzelm@389: -> token list -> 'a list * token list wenzelm@389: val name: token list -> string * token list wenzelm@389: val sort: token list -> string * token list wenzelm@451: val opt_infix: token list -> string * token list wenzelm@451: val opt_mixfix: token list -> string * token list wenzelm@636: val opt_witness: token list -> string * token list wenzelm@389: type syntax wenzelm@389: val make_syntax: string list -> wenzelm@389: (string * (token list -> (string * string) * token list)) list -> syntax clasohm@476: val parse_thy: syntax -> string -> string -> string wenzelm@389: val section: string -> string -> (token list -> string * token list) wenzelm@389: -> (string * (token list -> (string * string) * token list)) wenzelm@389: val axm_section: string -> string wenzelm@389: -> (token list -> (string * string list) * token list) wenzelm@389: -> (string * (token list -> (string * string) * token list)) wenzelm@389: val pure_keywords: string list wenzelm@389: val pure_sections: wenzelm@389: (string * (token list -> (string * string) * token list)) list lcp@570: (*items for building strings*) wenzelm@710: val cat: string -> string -> string wenzelm@656: val parens: string -> string wenzelm@656: val brackets: string -> string wenzelm@656: val mk_list: string list -> string wenzelm@656: val mk_big_list: string list -> string wenzelm@656: val mk_pair: string * string -> string wenzelm@656: val mk_triple: string * string * string -> string wenzelm@656: val strip_quotes: string -> string paulson@1512: end; wenzelm@389: paulson@1512: paulson@1512: structure ThyParse : THY_PARSE= wenzelm@389: struct wenzelm@389: wenzelm@389: open ThyScan; wenzelm@389: wenzelm@389: wenzelm@389: (** parser toolbox **) wenzelm@389: wenzelm@389: type token = token_kind * string * int; wenzelm@389: wenzelm@389: wenzelm@389: (* errors *) wenzelm@389: wenzelm@389: exception SYNTAX_ERROR of string * string * int; wenzelm@389: wenzelm@389: fun syn_err s1 s2 n = raise SYNTAX_ERROR (s1, s2, n); wenzelm@389: wenzelm@389: fun eof_err () = error "Unexpected end-of-file"; wenzelm@389: lcp@570: (*Similar to Prolog's cut: reports any syntax error instead of backtracking lcp@570: through a superior || *) wenzelm@389: fun !! parse toks = parse toks wenzelm@389: handle SYNTAX_ERROR (s1, s2, n) => error ("Syntax error on line " ^ wenzelm@389: string_of_int n ^ ": " ^ s1 ^ " expected and " ^ s2 ^ " was found"); wenzelm@389: wenzelm@389: wenzelm@389: (* parser combinators *) wenzelm@389: wenzelm@389: fun (parse >> f) toks = apfst f (parse toks); wenzelm@389: wenzelm@389: fun (parse1 || parse2) toks = wenzelm@389: parse1 toks handle SYNTAX_ERROR _ => parse2 toks; wenzelm@389: wenzelm@389: fun (parse1 -- parse2) toks = wenzelm@389: let wenzelm@389: val (x, toks') = parse1 toks; wenzelm@389: val (y, toks'') = parse2 toks'; wenzelm@389: in wenzelm@389: ((x, y), toks'') wenzelm@389: end; wenzelm@389: wenzelm@389: fun (parse1 ^^ parse2) = parse1 -- parse2 >> op ^; wenzelm@389: wenzelm@389: wenzelm@389: (* generic parsers *) wenzelm@389: wenzelm@389: fun $$ a ((k, b, n) :: toks) = wenzelm@389: if k = Keyword andalso a = b then (a, toks) wenzelm@389: else syn_err (quote a) (quote b) n wenzelm@389: | $$ _ [] = eof_err (); wenzelm@389: wenzelm@389: fun (a $$-- parse) = $$ a -- parse >> #2; wenzelm@389: wenzelm@389: fun (parse --$$ a) = parse -- $$ a >> #1; wenzelm@389: wenzelm@389: wenzelm@389: fun kind k1 ((k2, s, n) :: toks) = wenzelm@389: if k1 = k2 then (s, toks) wenzelm@389: else syn_err (name_of_kind k1) (quote s) n wenzelm@389: | kind _ [] = eof_err (); wenzelm@389: wenzelm@389: val ident = kind Ident; wenzelm@389: val long_ident = kind LongIdent; wenzelm@389: val long_id = ident || long_ident; wenzelm@389: val type_var = kind TypeVar >> quote; wenzelm@389: val nat = kind Nat; wenzelm@389: val string = kind String; wenzelm@389: val verbatim = kind Verbatim; wenzelm@389: val eof = kind EOF; wenzelm@389: wenzelm@389: fun empty toks = ([], toks); wenzelm@389: wenzelm@389: fun optional parse def = parse || empty >> K def; wenzelm@389: wenzelm@389: fun repeat parse toks = (parse -- repeat parse >> op :: || empty) toks; wenzelm@389: fun repeat1 parse = parse -- repeat parse >> op ::; wenzelm@389: wenzelm@389: fun enum1 sep parse = parse -- repeat (sep $$-- parse) >> op ::; wenzelm@389: fun enum sep parse = enum1 sep parse || empty; wenzelm@389: paulson@2231: fun list parse = enum "," parse; paulson@2231: fun list1 parse = enum1 "," parse; wenzelm@389: wenzelm@389: wenzelm@389: (** theory parsers **) wenzelm@389: wenzelm@389: (* misc utilities *) wenzelm@389: wenzelm@389: fun cat s1 s2 = s1 ^ " " ^ s2; wenzelm@389: wenzelm@558: val parens = enclose "(" ")"; wenzelm@558: val brackets = enclose "[" "]"; wenzelm@389: wenzelm@389: val mk_list = brackets o commas; wenzelm@389: val mk_big_list = brackets o space_implode ",\n "; wenzelm@389: wenzelm@558: fun mk_pair (x, y) = parens (commas [x, y]); wenzelm@558: fun mk_triple (x, y, z) = parens (commas [x, y, z]); wenzelm@389: fun mk_triple1 ((x, y), z) = mk_triple (x, y, z); wenzelm@389: fun mk_triple2 (x, (y, z)) = mk_triple (x, y, z); wenzelm@389: paulson@2231: fun split_decls l = flat (map (fn (xs, y) => map (rpair y) xs) l); wenzelm@389: wenzelm@389: fun strip_quotes str = wenzelm@389: implode (tl (take (size str - 1, explode str))); wenzelm@389: wenzelm@389: wenzelm@389: (* names *) wenzelm@389: wenzelm@389: val name = ident >> quote || string; wenzelm@389: val names = list name; wenzelm@389: val names1 = list1 name; wenzelm@389: val name_list = names >> mk_list; wenzelm@389: val name_list1 = names1 >> mk_list; wenzelm@389: wenzelm@389: wenzelm@389: (* classes *) wenzelm@389: wenzelm@389: val subclass = name -- optional ("<" $$-- !! name_list1) "[]"; wenzelm@389: wenzelm@558: val class_decls = repeat1 (subclass >> mk_pair) >> mk_big_list; wenzelm@389: wenzelm@389: wenzelm@389: (* arities *) wenzelm@389: wenzelm@389: val sort = wenzelm@389: name >> brackets || wenzelm@389: "{" $$-- name_list --$$ "}"; wenzelm@389: wenzelm@389: val sort_list1 = list1 sort >> mk_list; wenzelm@389: wenzelm@389: wenzelm@389: val arity = optional ("(" $$-- !! (sort_list1 --$$")")) "[]" -- sort; wenzelm@389: wenzelm@389: val arity_decls = repeat1 (names1 --$$ "::" -- !! arity) wenzelm@389: >> (mk_big_list o map mk_triple2 o split_decls); wenzelm@389: wenzelm@389: wenzelm@389: (* mixfix annotations *) wenzelm@389: wenzelm@2203: val infxl = wenzelm@2203: "infixl" $$-- !! (nat >> cat "Infixl" || string -- nat >> (cat "InfixlName" o mk_pair)); wenzelm@2203: val infxr = wenzelm@2203: "infixr" $$-- !! (nat >> cat "Infixr" || string -- nat >> (cat "InfixrName" o mk_pair)); wenzelm@389: wenzelm@889: val binder = "binder" $$-- wenzelm@2203: !! (string -- (("[" $$-- nat --$$ "]") -- nat || nat >> (fn n => (n, n)))) wenzelm@2203: >> (cat "Binder" o mk_triple2); wenzelm@389: wenzelm@389: val opt_pris = optional ("[" $$-- !! (list nat --$$ "]")) [] >> mk_list; wenzelm@389: wenzelm@389: val mixfix = string -- !! (opt_pris -- optional nat "max_pri") wenzelm@389: >> (cat "Mixfix" o mk_triple2); wenzelm@389: wenzelm@558: fun opt_syn fx = optional ("(" $$-- fx --$$ ")") "NoSyn"; wenzelm@389: wenzelm@389: val opt_infix = opt_syn (infxl || infxr); wenzelm@389: val opt_mixfix = opt_syn (mixfix || infxl || infxr || binder); wenzelm@389: wenzelm@389: wenzelm@389: (* types *) wenzelm@389: clasohm@1705: (*Parse an identifier, but only if it is not followed by "::", "=" or ","; clasohm@1377: the exclusion of a postfix comma can be controlled to allow expressions clasohm@1377: like "(id, id)" but disallow ones like "'a => id id,id :: ..."*) clasohm@1377: fun ident_no_colon _ [] = eof_err() clasohm@1377: | ident_no_colon allow_comma ((Ident, s, n) :: (rest as (Keyword, s2, n2) :: clasohm@1377: toks)) = clasohm@1705: if s2 = "::" orelse s2 = "=" orelse (not allow_comma andalso s2 = ",") clasohm@1705: then syn_err (name_of_kind Ident) (quote s2) n2 clasohm@1377: else (s, rest) clasohm@1377: | ident_no_colon _ ((Ident, s, n) :: toks) = (s, toks) clasohm@1377: | ident_no_colon _ ((k, s, n) :: _) = clasohm@1377: syn_err (name_of_kind Ident) (quote s) n; clasohm@1321: wenzelm@3110: (*type used in types, consts and syntax sections*) clasohm@1377: fun const_type allow_comma toks = clasohm@1377: let val simple_type = clasohm@1377: (ident || clasohm@1377: kind TypeVar -- optional ("::" $$-- ident >> cat "::") "" >> clasohm@1377: (fn (tv, cl) => cat tv cl)) -- clasohm@1377: repeat (ident_no_colon allow_comma) >> clasohm@1377: (fn (args, ts) => cat args (space_implode " " ts)) || clasohm@1377: ("(" $$-- (list1 (const_type true)) --$$ ")" >> (parens o commas)) -- clasohm@1377: repeat1 (ident_no_colon allow_comma) >> clasohm@1377: (fn (args, ts) => cat args (space_implode " " ts)); clasohm@1377: clasohm@1377: val appl_param = clasohm@1377: simple_type || "(" $$-- const_type true --$$ ")" >> parens || clasohm@1377: "[" $$-- (list1 (const_type true)) --$$ "]" --$$ "=>" -- clasohm@1377: const_type allow_comma >> clasohm@1377: (fn (src, dest) => mk_list src ^ " => " ^ dest); clasohm@1377: in ("[" $$-- (list1 (const_type true)) --$$ "]" --$$ "=>" -- clasohm@1377: const_type allow_comma >> clasohm@1377: (fn (src, dest) => mk_list src ^ " => " ^ dest) || clasohm@1377: repeat1 (appl_param --$$ "=>") -- const_type allow_comma >> clasohm@1377: (fn (src, dest) => space_implode " => " (src@[dest])) || clasohm@1377: simple_type || clasohm@1377: "(" $$-- const_type true --$$ ")" >> parens) toks clasohm@1321: end; clasohm@1321: clasohm@1383: fun mk_old_type_decl ((ts, n), syn) = clasohm@1383: map (fn t => (mk_triple (t, n, syn), false)) ts; clasohm@1383: clasohm@1383: fun mk_type_decl (((xs, t), None), syn) = clasohm@1383: [(mk_triple (t, string_of_int (length xs), syn), false)] clasohm@1383: | mk_type_decl (((xs, t), Some rhs), syn) = clasohm@1383: [(parens (commas [t, mk_list xs, rhs, syn]), true)]; clasohm@1383: clasohm@1383: fun mk_type_decls tys = wenzelm@3764: "|> Theory.add_types\n" ^ mk_big_list (keyfilter tys false) ^ "\n\n\ wenzelm@3764: \|> Theory.add_tyabbrs\n" ^ mk_big_list (keyfilter tys true); clasohm@1383: clasohm@1383: clasohm@1383: val old_type_decl = names1 -- nat -- opt_infix >> mk_old_type_decl; clasohm@1383: clasohm@1383: val type_args = clasohm@1383: type_var >> (fn x => [x]) || clasohm@1383: "(" $$-- !! (list1 type_var --$$ ")") || clasohm@1383: empty >> K []; clasohm@1383: clasohm@1383: val type_decl = type_args -- name -- clasohm@1383: optional ("=" $$-- (string || (const_type false >> quote)) >> Some) None clasohm@1383: -- opt_infix >> mk_type_decl; clasohm@1383: wenzelm@2360: val type_decls = wenzelm@2360: repeat1 (old_type_decl || type_decl) >> (mk_type_decls o flat); clasohm@1383: clasohm@1383: clasohm@1383: (* consts *) clasohm@1383: wenzelm@2360: val const_decls = wenzelm@2360: repeat1 wenzelm@2360: (names1 --$$ "::" -- !! ((string || const_type false >> quote) -- opt_mixfix)) wenzelm@2360: >> (mk_big_list o map mk_triple2 o split_decls); wenzelm@389: wenzelm@2360: val opt_mode = wenzelm@2360: optional wenzelm@2360: ("(" $$-- !! (name -- optional ($$ "output" >> K "false") "true" --$$ ")")) wenzelm@2360: ("\"\"", "true") wenzelm@2360: >> mk_pair; wenzelm@2360: wenzelm@2360: val syntax_decls = opt_mode -- const_decls >> (fn (mode, txt) => mode ^ "\n" ^ txt); wenzelm@2203: wenzelm@389: wenzelm@389: (* translations *) wenzelm@389: wenzelm@389: val trans_pat = wenzelm@389: optional ("(" $$-- !! (name --$$ ")")) "\"logic\"" -- string >> mk_pair; wenzelm@389: wenzelm@389: val trans_arrow = wenzelm@3528: $$ "=>" >> K "Syntax.ParseRule " || wenzelm@3528: $$ "<=" >> K "Syntax.PrintRule " || wenzelm@3528: $$ "==" >> K "Syntax.ParsePrintRule "; wenzelm@389: paulson@1810: val trans_line = wenzelm@2203: trans_pat -- !! (trans_arrow -- trans_pat) wenzelm@2203: >> (fn (left, (arr, right)) => arr ^ mk_pair (left, right)); paulson@1810: paulson@1810: val trans_decls = repeat1 trans_line >> mk_big_list; wenzelm@389: wenzelm@389: wenzelm@389: (* ML translations *) wenzelm@389: wenzelm@389: val trfun_defs = wenzelm@389: " val parse_ast_translation = [];\n\ wenzelm@389: \ val parse_translation = [];\n\ wenzelm@389: \ val print_translation = [];\n\ wenzelm@2385: \ val typed_print_translation = [];\n\ wenzelm@2694: \ val print_ast_translation = [];\n\ wenzelm@2694: \ val token_translation = [];"; wenzelm@389: wenzelm@389: val trfun_args = wenzelm@389: "(parse_ast_translation, parse_translation, \ wenzelm@389: \print_translation, print_ast_translation)"; wenzelm@389: wenzelm@389: wenzelm@389: (* axioms *) wenzelm@389: wenzelm@389: val mk_axms = mk_big_list o map (mk_pair o apfst quote); wenzelm@389: wenzelm@389: fun mk_axiom_decls axms = (mk_axms axms, map fst axms); wenzelm@389: wenzelm@389: val axiom_decls = repeat1 (ident -- !! string) >> mk_axiom_decls; wenzelm@389: wenzelm@389: wenzelm@3813: (* oracle *) wenzelm@3813: wenzelm@3813: val oracle_decl = (name --$$ "=" -- long_id) >> mk_pair; wenzelm@3813: wenzelm@3813: clasohm@1555: (* combined consts and axioms *) clasohm@1555: clasohm@1555: fun mk_constaxiom_decls x = clasohm@1555: let clasohm@1555: val (axms_defs, axms_names) = clasohm@1555: mk_axiom_decls (map (fn ((id, _), def) => (id ^ "_def", def)) x); clasohm@1555: in ((mk_big_list o map mk_triple2 o map (apfst quote o fst)) x ^ wenzelm@3764: "\n\n|> Theory.add_defs\n" ^ axms_defs, axms_names) clasohm@1555: end; clasohm@1555: clasohm@1555: val constaxiom_decls = clasohm@1555: repeat1 (ident --$$ "::" -- !! clasohm@1555: ((string || const_type false >> quote) -- opt_mixfix) -- !! clasohm@1555: string) >> mk_constaxiom_decls; clasohm@1555: clasohm@1555: wenzelm@389: (* axclass *) wenzelm@389: wenzelm@389: fun mk_axclass_decl ((c, cs), axms) = wenzelm@389: (mk_pair (c, cs) ^ "\n" ^ mk_axms axms, wenzelm@389: (strip_quotes c ^ "I") :: map fst axms); wenzelm@389: wenzelm@389: val axclass_decl = subclass -- repeat (ident -- !! string) >> mk_axclass_decl; wenzelm@389: wenzelm@389: wenzelm@451: (* instance *) wenzelm@389: wenzelm@425: fun mk_witness (axths, opt_tac) = wenzelm@389: mk_list (keyfilter axths false) ^ "\n" ^ wenzelm@389: mk_list (keyfilter axths true) ^ "\n" ^ wenzelm@389: opt_tac; wenzelm@389: wenzelm@389: val axm_or_thm = wenzelm@389: string >> rpair false || wenzelm@389: long_id >> rpair true; wenzelm@389: wenzelm@451: wenzelm@425: val opt_witness = wenzelm@389: optional ("(" $$-- list1 axm_or_thm --$$ ")") [] -- wenzelm@558: optional (verbatim >> (parens o cat "Some" o parens)) "None" wenzelm@425: >> mk_witness; wenzelm@425: wenzelm@425: val instance_decl = wenzelm@636: (name --$$ "<" -- name >> (pair "|> AxClass.add_inst_subclass" o mk_pair) || wenzelm@636: name --$$ "::" -- arity >> (pair "|> AxClass.add_inst_arity" o mk_triple2)) wenzelm@451: -- opt_witness wenzelm@777: >> (fn ((x, y), z) => (cat_lines [x, y, z])); wenzelm@389: wenzelm@389: wenzelm@3931: (* local, global path *) wenzelm@3931: wenzelm@3958: fun empty_decl toks = (empty >> K "") toks; wenzelm@3900: wenzelm@3931: val global_path = wenzelm@3931: "|> (fn thy => if ! global_names then thy else Theory.add_path \"/\" thy)"; wenzelm@3931: wenzelm@3931: val local_path = wenzelm@3931: global_path ^ "\n\ wenzelm@3931: \|> (fn thy => if ! global_names then thy\ wenzelm@3931: \ else Theory.add_path thy_name thy)"; wenzelm@3900: wenzelm@3900: wenzelm@389: wenzelm@389: (** theory syntax **) wenzelm@389: wenzelm@389: type syntax = wenzelm@389: lexicon * (token list -> (string * string) * token list) Symtab.table; wenzelm@389: wenzelm@389: fun make_syntax keywords sects = wenzelm@451: (make_lexicon (map fst sects @ keywords), wenzelm@451: Symtab.make sects handle Symtab.DUPS dups => wenzelm@451: error ("Duplicate sections in theory file syntax: " ^ commas_quote dups)); wenzelm@389: wenzelm@389: wenzelm@389: (* header *) wenzelm@389: wenzelm@389: fun mk_header (thy_name, bases) = clasohm@586: (thy_name, "mk_base " ^ mk_list bases ^ " " ^ quote thy_name); wenzelm@389: wenzelm@389: val base = wenzelm@389: ident >> (cat "Thy" o quote) || wenzelm@389: string >> cat "File"; wenzelm@389: wenzelm@389: val header = ident --$$ "=" -- enum1 "+" base >> mk_header; wenzelm@389: wenzelm@389: wenzelm@389: (* extension *) wenzelm@389: wenzelm@3900: fun mk_extension (txts, mltxt) = wenzelm@389: let wenzelm@389: val cat_sects = space_implode "\n\n" o filter_out (equal ""); wenzelm@389: val (extxts, postxts) = split_list txts; wenzelm@389: in wenzelm@3900: (cat_sects extxts, cat_sects postxts, mltxt) wenzelm@389: end; wenzelm@389: wenzelm@389: fun sect tab ((Keyword, s, n) :: toks) = wenzelm@389: (case Symtab.lookup (tab, s) of wenzelm@389: Some parse => !! parse toks wenzelm@389: | None => syn_err "section" s n) wenzelm@389: | sect _ ((_, s, n) :: _) = syn_err "section" s n wenzelm@389: | sect _ [] = eof_err (); wenzelm@389: wenzelm@3900: fun extension sectab = "+" $$-- !! wenzelm@3900: (repeat (sect sectab) --$$ "end" -- optional ("ML" $$-- verbatim) "") wenzelm@3900: >> mk_extension; wenzelm@3813: wenzelm@3900: fun opt_extension sectab = optional (extension sectab) ("", "", ""); wenzelm@3875: wenzelm@389: wenzelm@389: (* theory definition *) wenzelm@389: wenzelm@3900: fun mk_structure tname ((thy_name, old_thys), (extxt, postxt, mltxt)) = wenzelm@558: if thy_name <> tname then wenzelm@558: error ("Filename \"" ^ tname ^ ".thy\" and theory name " wenzelm@558: ^ quote thy_name ^ " are different") wenzelm@558: else wenzelm@3875: "val thy = " ^ old_thys ^ ";\n\n\ wenzelm@3875: \structure " ^ thy_name ^ " =\n\ wenzelm@3875: \struct\n\ wenzelm@3875: \\n\ wenzelm@3931: \local\n\ wenzelm@3931: \ val thy_name = \"" ^ tname ^ "\";\n" wenzelm@3875: ^ trfun_defs ^ "\n\ wenzelm@3875: \in\n\ wenzelm@3875: \\n" wenzelm@3875: ^ mltxt ^ "\n\ wenzelm@3875: \\n\ wenzelm@3875: \val thy = thy\n\ wenzelm@3931: \\n" wenzelm@3931: ^ local_path ^ wenzelm@3875: "\n\ wenzelm@3875: \|> Theory.add_trfuns\n" wenzelm@3875: ^ trfun_args ^ "\n\ wenzelm@3875: \|> Theory.add_trfunsT typed_print_translation \n\ wenzelm@3875: \|> Theory.add_tokentrfuns token_translation \n\ wenzelm@3875: \\n" wenzelm@3875: ^ extxt ^ "\n\ wenzelm@3875: \\n\ wenzelm@3875: \|> Theory.add_name " ^ quote thy_name ^ ";\n\ wenzelm@3875: \\n\ wenzelm@3875: \val _ = store_theory (thy, " ^ quote thy_name ^ ");\n\ wenzelm@3875: \\n\ wenzelm@3875: \\n" wenzelm@3875: ^ postxt ^ "\n\ wenzelm@3875: \\n\ wenzelm@3875: \end;\n\ wenzelm@3875: \end;\n\ wenzelm@3875: \\n\ wenzelm@3875: \open " ^ thy_name ^ ";\n\ wenzelm@3875: \\n"; wenzelm@389: clasohm@476: fun theory_defn sectab tname = wenzelm@3875: header -- opt_extension sectab -- eof >> (mk_structure tname o #1); wenzelm@389: clasohm@476: fun parse_thy (lex, sectab) tname str = clasohm@476: #1 (!! (theory_defn sectab tname) (tokenize lex str)); wenzelm@389: wenzelm@389: wenzelm@389: (* standard sections *) wenzelm@389: wenzelm@389: fun mk_val ax = "val " ^ ax ^ " = get_axiom thy " ^ quote ax ^ ";"; wenzelm@777: val mk_vals = cat_lines o map mk_val; wenzelm@389: wenzelm@777: fun mk_axm_sect "" (txt, axs) = (txt, mk_vals axs) wenzelm@777: | mk_axm_sect pretxt (txt, axs) = (pretxt ^ "\n" ^ txt, mk_vals axs); wenzelm@389: wenzelm@389: fun axm_section name pretxt parse = wenzelm@389: (name, parse >> mk_axm_sect pretxt); wenzelm@389: wenzelm@389: fun section name pretxt parse = wenzelm@389: axm_section name pretxt (parse >> rpair []); wenzelm@389: wenzelm@389: wenzelm@389: val pure_keywords = wenzelm@3900: ["end", "ML", "mixfix", "infixr", "infixl", "binder", "global", wenzelm@3931: "local", "output", "=", "+", ",", "<", "{", "}", "(", ")", "[", "]", wenzelm@3931: "::", "==", "=>", "<="]; wenzelm@389: wenzelm@389: val pure_sections = wenzelm@3813: [section "classes" "|> Theory.add_classes" class_decls, wenzelm@3764: section "default" "|> Theory.add_defsort" sort, wenzelm@777: section "types" "" type_decls, wenzelm@3764: section "arities" "|> Theory.add_arities" arity_decls, wenzelm@3764: section "consts" "|> Theory.add_consts" const_decls, wenzelm@3764: section "syntax" "|> Theory.add_modesyntax" syntax_decls, wenzelm@3764: section "translations" "|> Theory.add_trrules" trans_decls, wenzelm@3764: axm_section "rules" "|> Theory.add_axioms" axiom_decls, wenzelm@3764: axm_section "defs" "|> Theory.add_defs" axiom_decls, wenzelm@3813: section "oracle" "|> Theory.add_oracle" oracle_decl, wenzelm@3764: axm_section "constdefs" "|> Theory.add_consts" constaxiom_decls, wenzelm@636: axm_section "axclass" "|> AxClass.add_axclass" axclass_decl, wenzelm@3780: section "instance" "" instance_decl, wenzelm@3900: section "path" "|> Theory.add_path" name, wenzelm@3931: section "global" global_path empty_decl, wenzelm@3931: section "local" local_path empty_decl]; wenzelm@389: wenzelm@3813: wenzelm@389: end;