src/Pure/ProofGeneral/parsing.ML
author haftmann
Thu, 21 Dec 2006 13:55:11 +0100
changeset 21891 b4e4ea3db161
parent 21867 8750fbc28d5c
child 21902 8e5e2571c716
permissions -rw-r--r--
added code lemmas for quantification over bounded nats
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
     1
(*  Title:      Pure/ProofGeneral/parsing.ML
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
     2
    ID:         $Id$
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
     3
    Author:     David Aspinall
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
     4
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
     5
Parsing Isabelle theory files to add PGIP markup.
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
     6
*)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
     7
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
     8
signature PGIP_PARSER =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
     9
sig
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
    10
    val pgip_parser: PgipMarkup.pgip_parser
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    11
end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    12
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    13
structure PgipParser : PGIP_PARSER =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    14
struct
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    15
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    16
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    17
(** Parsing proof scripts without execution **)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    18
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    19
structure P = OuterParse;
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    20
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
    21
structure D = PgipMarkup;
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
    22
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    23
(* Notes.
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    24
   This is quite tricky, because 1) we need to put back whitespace which
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    25
   was removed during parsing so we can provide markup around commands;
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    26
   2) parsing is intertwined with execution in Isar so we have to repeat
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    27
   the parsing to extract interesting parts of commands.  The trace of
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    28
   tokens parsed which is now recorded in each transition (added by
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    29
   Markus June '04) helps do this, but the mechanism is still a bad mess.
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    30
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    31
   If we had proper parse trees it would be easy, although having a
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
    32
   fixed type of trees might be hard with Isar's extensible parser.
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    33
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    34
   Probably the best solution is to produce the meta-information at
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    35
   the same time as the parse, for each command, e.g. by recording a
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    36
   list of (name,objtype) pairs which record the bindings created by
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    37
   a command.  This would require changing the interfaces in
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    38
   outer_syntax.ML (or providing new ones),
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    39
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    40
    datatype metainfo = Binding of string * string  (* name, objtype *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    41
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    42
    val command_withmetainfo: string -> string -> string ->
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    43
      (token list ->
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    44
       ((Toplevel.transition -> Toplevel.transition) * metainfo list) *
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    45
       token list) -> parser
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    46
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    47
   We'd also like to render terms as they appear in output, but this
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    48
   will be difficult because inner syntax is extensible and we don't
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    49
   have the correct syntax to hand when just doing outer parsing
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    50
   without execution.  A reasonable approximation could
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    51
   perhaps be obtained by using the syntax of the current context.
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    52
   However, this would mean more mess trying to pick out terms,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    53
   so at this stage a more serious change to the Isar functions
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    54
   seems necessary.
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    55
*)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    56
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    57
local
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    58
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
    59
    fun whitespace str = D.Whitespace { text=str }
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    60
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    61
    (* an extra token is needed to terminate the command *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    62
    val sync = OuterSyntax.scan "\\<^sync>";
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    63
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
    64
    fun nameparse elt objtyp nameP toks = 
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
    65
        (fst (nameP (toks@sync)))
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
    66
        handle _ => (error ("Error occurred in name parser for " ^ elt ^
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
    67
                            "(objtype: " ^ objtyp ^ ")");
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
    68
                     "")
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    69
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    70
    fun parse_warning msg = warning ("script->PGIP markup parser: " ^ msg)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    71
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    72
    (* FIXME: allow dynamic extensions to language here: we need a hook in
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    73
       outer_syntax.ML to reset this table. *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    74
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    75
    val keywords_classification_table = ref (NONE: string Symtab.table option)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    76
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    77
    fun get_keywords_classification_table () =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    78
        case (!keywords_classification_table) of
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    79
          SOME t => t
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    80
        | NONE => (let
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    81
                     val tab = fold (fn (c, _, k, _) => Symtab.update (c, k))
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    82
                                    (OuterSyntax.dest_parsers ()) Symtab.empty;
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    83
                   in (keywords_classification_table := SOME tab; tab) end)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    84
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    85
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    86
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    87
    fun xmls_of_thy_begin (name,toks,str) = (* see isar_syn.ML/theoryP *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    88
        let
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    89
            val ((thyname,imports,files),_) = ThyHeader.args (toks@sync)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    90
        in
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
    91
            [D.Opentheory { thyname=thyname, 
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
    92
			    parentnames = imports,
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
    93
			    text = str }]
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    94
        end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    95
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    96
    fun xmls_of_thy_decl (name,toks,str) = (* see isar_syn.ML/thy_decl cases  *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    97
        let
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    98
            (* NB: PGIP only deals with single name bindings at the moment;
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    99
               potentially we could markup grouped definitions several times but
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   100
               that might suggest the wrong structure to the editor?
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   101
               Better alternative would be to put naming closer around text,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   102
               but to do that we'd be much better off modifying the real parser
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   103
               instead of reconstructing it here. *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   104
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   105
            val plain_items = (* no names, unimportant names, or too difficult *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   106
                ["defaultsort","arities","judgement","finalconsts",
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   107
                 "syntax", "nonterminals", "translations",
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   108
                 "global", "local", "hide",
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   109
                 "ML_setup", "setup", "method_setup",
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   110
                 "parse_ast_translation", "parse_translation", "print_translation",
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   111
                 "typed_print_translation", "print_ast_translation", "token_translation",
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   112
                 "oracle",
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   113
                 "declare"]
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   114
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   115
            fun named_item nameP ty = 
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   116
		[D.Theoryitem {text=str,name=SOME (nameparse "theoryitem" ty nameP toks),objtype=SOME ty}]
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   117
	    val plain_item = 
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   118
		[D.Theoryitem {text=str,name=NONE,objtype=NONE}]
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   119
	    val doccomment = 
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   120
		[D.Doccomment {text=str}]
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   121
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   122
            val opt_overloaded = P.opt_keyword "overloaded";
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   123
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   124
            val thmnameP = (* see isar_syn.ML/theoremsP *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   125
                let
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   126
                    val name_facts = P.and_list1 ((P.opt_thm_name "=" --| P.xthms1) >> #1)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   127
                    val theoremsP = P.opt_locale_target |-- name_facts >> (fn [] => "" | x::_ => x)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   128
                in
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   129
                    theoremsP
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   130
                end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   131
        in
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   132
            (* TODO: ideally we would like to render terms properly, just as they are
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   133
               in output. This implies using PGML for symbols and variables/atoms.
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   134
               BUT it's rather tricky without having the correct concrete syntax to hand,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   135
               and even if we did, we'd have to mess around here a whole lot more first
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   136
               to pick out the terms from the syntax. *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   137
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   138
            if member (op =) plain_items name then plain_item
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   139
            else case name of
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   140
                     "text"      => doccomment
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   141
                   | "text_raw"  => doccomment
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   142
                   | "typedecl"  => named_item (P.type_args |-- P.name) "type"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   143
                   | "types"     => named_item (P.type_args |-- P.name) "type"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   144
                   | "classes"   => named_item P.name "class"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   145
                   | "classrel"  => named_item P.name "class"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   146
                   | "consts"    => named_item (P.const >> #1) "term"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   147
                   | "axioms"    => named_item (P.spec_name >> (#1 o #1)) "theorem"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   148
                   | "defs"      => named_item (opt_overloaded |-- P.spec_name >> (#1 o #1)) "theorem"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   149
                   | "constdefs" => named_item P.name (* FIXME: heavily simplified/wrong *) "term"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   150
                   | "theorems"  => named_item thmnameP "thmset"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   151
                   | "lemmas"    => named_item thmnameP "thmset"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   152
                   | "oracle"    => named_item P.name "oracle"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   153
                   | "locale"    => named_item ((P.opt_keyword "open" >> not) |-- P.name) "locale"
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   154
                   | _ => (parse_warning ("Unrecognized thy-decl command: " ^ name); 
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   155
			   plain_item)
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   156
        end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   157
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   158
    fun xmls_of_thy_goal (name,toks,str) =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   159
        let
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   160
            (* see isar_syn.ML/gen_theorem *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   161
         val statement = P.and_list1 (P.opt_thm_name ":" -- Scan.repeat1 P.propp);
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   162
         val general_statement =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   163
            statement >> pair [] || Scan.repeat P.locale_element -- (P.$$$ "shows" |-- statement);
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   164
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   165
            val gen_theoremP =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   166
                P.opt_locale_target -- Scan.optional (P.opt_thm_name ":" --|
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   167
                 Scan.ahead (P.locale_keyword || P.$$$ "shows")) ("", []) --
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   168
                                 general_statement >> (fn ((locale, a), (elems, concl)) =>
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   169
                                                         fst a) (* a : (bstring * Args.src list) *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   170
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   171
            val nameP = P.opt_locale_target |-- (Scan.optional ((P.opt_thm_name ":") >> #1) "")
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   172
	    val thmname = nameparse "opengoal" "theorem" nameP toks
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   173
        in
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   174
            [D.Opengoal {thmname=SOME thmname, text=str},
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   175
             D.Openblock {metavarid=NONE,name=NONE,objtype=SOME "theorem-proof"}]
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   176
        end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   177
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   178
    fun xmls_of_qed (name,str) =
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   179
        let val qedmarkup  =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   180
                (case name of
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   181
                     "sorry" => D.Postponegoal {text=str}
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   182
                   | "oops"  => D.Giveupgoal {text=str}
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   183
                   | "done"  => D.Closegoal {text=str}
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   184
                   | "by"    => D.Closegoal {text=str}  (* nested or toplevel *)
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   185
                   | "qed"   => D.Closegoal {text=str}  (* nested or toplevel *)
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   186
                   | "."     => D.Closegoal {text=str}  (* nested or toplevel *)
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   187
                   | ".."    => D.Closegoal {text=str}  (* nested or toplevel *)
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   188
                   | other => (* default to closegoal: may be wrong for extns *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   189
                                  (parse_warning
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   190
                                       ("Unrecognized qed command: " ^ quote other);
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   191
                                       D.Closegoal {text=str}))
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   192
        in qedmarkup :: [D.Closeblock {}] end
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   193
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   194
    fun xmls_of_kind kind (name,toks,str) =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   195
    case kind of
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   196
      "control"        => [D.Badcmd {text=str}]
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   197
    | "diag"           => [D.Theoryitem {name=NONE,objtype=NONE,
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   198
					 text=str}] (* FIXME: check NOT spuriouscmd *)
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   199
    (* theory/files *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   200
    | "theory-begin"   => xmls_of_thy_begin (name,toks,str)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   201
    | "theory-decl"    => xmls_of_thy_decl (name,toks,str)
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   202
    | "theory-heading" => [D.Doccomment {text=str}]
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   203
    | "theory-script"  => [D.Theoryitem {name=NONE,objtype=NONE,text=str}]
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   204
    | "theory-end"     => [D.Closetheory {text=str}]
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   205
    (* proof control *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   206
    | "theory-goal"    => xmls_of_thy_goal (name,toks,str)
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   207
    | "proof-heading"  => [D.Doccomment {text=str}]
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   208
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   209
    | "proof-goal"     => (* nested proof: have, show, ... *)
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   210
      [D.Opengoal {text=str,thmname=NONE}, 
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   211
       D.Openblock {metavarid=NONE,name=NONE,objtype=NONE}]
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   212
			  
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   213
    | "proof-block"    => [D.Proofstep {text=str}]
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   214
    | "proof-open"     => [D.Openblock {metavarid=NONE,name=NONE,objtype=NONE}, 
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   215
			   D.Proofstep {text=str} ]
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   216
    | "proof-close"    => [D.Proofstep {text=str}, D.Closeblock {}]
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   217
    | "proof-script"   => [D.Proofstep {text=str}]
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   218
    | "proof-chain"    => [D.Proofstep {text=str}]
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   219
    | "proof-decl"     => [D.Proofstep {text=str}]
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   220
    | "proof-asm"      => [D.Proofstep {text=str}]
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   221
    | "proof-asm-goal" => (* nested proof: obtain, ... *)
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   222
      [D.Opengoal {text=str,thmname=NONE}, 
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   223
       D.Openblock {metavarid=NONE,name=NONE,objtype=NONE}]
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   224
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   225
    | "qed"            => xmls_of_qed (name,str)
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   226
    | "qed-block"      => xmls_of_qed (name,str)
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   227
    | "qed-global"     => xmls_of_qed (name,str)
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   228
    | other => (* default for anything else is "spuriouscmd", ***ignored for undo*** *)
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   229
      (parse_warning ("Internal inconsistency, unrecognized keyword kind: " ^ quote other);
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   230
       [D.Spuriouscmd {text=str}])
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   231
in
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   232
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   233
fun xmls_of_transition (name,str,toks) =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   234
   let
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   235
     val classification = Symtab.lookup (get_keywords_classification_table ()) name
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   236
   in case classification of
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   237
          SOME k => (xmls_of_kind k (name,toks,str))
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   238
        | NONE => (* an uncategorized keyword ignored for undo (maybe wrong) *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   239
          (parse_warning ("Uncategorized command found: " ^ name ^ " -- using spuriouscmd");
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   240
           [D.Spuriouscmd {text=str}])
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   241
   end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   242
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   243
fun markup_comment_whs [] = []
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   244
  | markup_comment_whs (toks as t::ts) = (* this would be a lot neater if we could match on toks! *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   245
    let
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   246
        val (prewhs,rest) = take_prefix (OuterLex.is_kind OuterLex.Space) toks
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   247
    in
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   248
        if (prewhs <> []) then
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   249
            D.Whitespace {text=implode (map OuterLex.unparse prewhs)}
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   250
            :: (markup_comment_whs rest)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   251
        else
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   252
            D.Comment {text=OuterLex.unparse t} ::
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   253
            (markup_comment_whs ts)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   254
    end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   255
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   256
fun xmls_pre_cmd [] = ([],[])
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   257
  | xmls_pre_cmd toks =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   258
    let
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   259
        (* an extra token is needed to terminate the command *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   260
        val sync = OuterSyntax.scan "\\<^sync>";
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   261
        val spaceP = Scan.bulk (Scan.one (fn t =>not (OuterLex.is_proper t)) >> OuterLex.val_of) >> implode
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   262
        val text_with_whs =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   263
            ((spaceP || Scan.succeed "") --
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   264
             (P.short_ident || P.long_ident || P.sym_ident || P.string || P.number || P.verbatim) >> op^)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   265
             -- (spaceP || Scan.succeed "") >> op^
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   266
        val (prewhs,rest1) = take_prefix (not o OuterLex.is_proper) (toks@sync)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   267
        (* NB: this collapses  litcomment,(litcomment|whitespace)* to a single litcomment *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   268
        val (_,rest2) = (Scan.bulk (P.$$$ "--" |-- text_with_whs) >> implode || Scan.succeed "") rest1
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   269
        val (postwhs,rest3) = take_prefix (not o OuterLex.is_proper) rest2
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   270
    in
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   271
        ((markup_comment_whs prewhs) @
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   272
         (if (length rest2 = length rest1)  then []
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   273
          else 
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   274
	      [D.Doccomment 
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   275
		   {text= implode
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   276
                          (map OuterLex.unparse (Library.take (length rest1 - length rest2, rest1)))}]
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   277
              @
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   278
              (markup_comment_whs postwhs)),
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   279
              Library.take (length rest3 - 1,rest3))
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   280
    end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   281
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   282
fun xmls_of_impropers toks =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   283
    let
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   284
        val (xmls,rest) = xmls_pre_cmd toks
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   285
	val unparsed =  
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   286
	    case rest of [] => []
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   287
		       | _ => [D.Unparseable 
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   288
			      {text= implode (map OuterLex.unparse rest)}]
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   289
    in
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   290
        xmls @ unparsed
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   291
    end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   292
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   293
end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   294
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   295
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   296
local
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   297
    (* we have to weave together the whitespace/comments with proper tokens
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   298
       to reconstruct the input. *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   299
    (* TODO: see if duplicating isar_output/parse_thy can help here *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   300
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   301
    fun match_tokens ([],us,vs) = (rev vs,us)  (* used, unused *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   302
      | match_tokens (t::ts,w::ws,vs) =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   303
        if (t = w) then match_tokens (ts,ws,w::vs)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   304
        else match_tokens (t::ts,ws,w::vs)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   305
      | match_tokens _ = error ("match_tokens: mismatched input parse")
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   306
in
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   307
    fun pgip_parser str =
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   308
    let
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   309
       (* parsing:   See outer_syntax.ML/toplevel_source *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   310
       fun parse_loop ([],[],xmls) = xmls
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   311
         | parse_loop ([],itoks,xmls) = xmls @ (xmls_of_impropers itoks)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   312
         | parse_loop ((nm,toks,_)::trs,itoks,xmls) =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   313
           let
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   314
               (* first proper token after whitespace/litcomment/whitespace is command *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   315
               val (xmls_pre_cmd,cmditoks') = xmls_pre_cmd itoks
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   316
               val (cmdtok,itoks') = case cmditoks' of x::xs => (x,xs)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   317
                                                     | _ => error("proof_general/parse_loop impossible")
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   318
               val (utoks,itoks'') = match_tokens (toks,itoks',[])
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   319
               (* FIXME: should take trailing [w/s+] semicolon too in utoks *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   320
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   321
               val str = implode (map OuterLex.unparse (cmdtok::utoks))
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   322
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   323
               val xmls_tr  = xmls_of_transition (nm,str,toks)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   324
           in
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   325
               parse_loop(trs,itoks'',xmls @ xmls_pre_cmd @ xmls_tr)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   326
           end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   327
    in
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   328
        (let val toks = OuterSyntax.scan str
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   329
         in
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   330
             parse_loop (OuterSyntax.read toks, toks, [])
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   331
         end)
21867
8750fbc28d5c Add abstraction for objtypes and documents.
aspinall
parents: 21655
diff changeset
   332
           handle _ => [D.Unparseable {text=str}]
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   333
    end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   334
end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   335
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   336
end