src/Pure/ProofGeneral/pgip_types.ML
author wenzelm
Fri, 15 Dec 2006 00:08:06 +0100
changeset 21858 05f57309170c
parent 21637 a7b156c404e2
child 21867 8750fbc28d5c
permissions -rw-r--r--
avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
     1
(*  Title:      Pure/ProofGeneral/pgip_types.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
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
     5
PGIP abstraction: types and conversions
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
(* TODO: add objtypes and PGML *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
     9
signature PGIPTYPES =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    10
sig
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    11
    (* Types and values (used for preferences and dialogs) *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    12
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    13
    datatype pgiptype = Pgipnull | Pgipbool | Pgipint of int option * int option | Pgipnat
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    14
		      | Pgipstring | Pgipconst of string | Pgipchoice of pgipdtype list
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    15
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    16
    and pgipdtype = Pgipdtype of string option * pgiptype  (* type with opt. description *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    17
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    18
    type pgipval   (* typed value *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    19
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    20
    (* URLs we can cope with *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    21
    type pgipurl
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    22
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    23
    (* Representation error in reading/writing PGIP *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    24
    exception PGIP of string
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    25
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    26
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    27
    (* Interface areas for message output *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    28
    datatype displayarea = Status | Message | Display | Other of string
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    29
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    30
    (* Kinds of message output (influence display behaviour) *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    31
    datatype messagecategory = Normal | Information | Tracing | Internal 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    32
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    33
    (* Error levels *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    34
    datatype fatality = Nonfatal | Fatal | Panic | Log | Debug
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    35
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    36
    (* File location *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    37
    type location = { descr: string option,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    38
		      url: pgipurl option,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    39
		      line: int option,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    40
		      column: int option,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    41
		      char: int option }
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    42
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    43
    (* Prover preference *)   
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    44
    type preference = { name: string,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    45
			descr: string option,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    46
			default: string option,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    47
			pgiptype: pgiptype }
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    48
end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    49
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    50
signature PGIPTYPES_OPNS = 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    51
sig
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    52
    include PGIPTYPES
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    53
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    54
    (* Values as XML strings *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    55
    val read_pgipint	   : (int option * int option) -> string -> int (* raises PGIP *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    56
    val read_pgipnat	   : string -> int			        (* raises PGIP *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    57
    val read_pgipbool	   : string -> bool			        (* raises PGIP *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    58
    val read_pgipstring	   : string -> string			        (* raises PGIP *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    59
    val int_to_pgstring	   : int -> string
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    60
    val bool_to_pgstring   : bool -> string
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    61
    val string_to_pgstring : string -> string
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    62
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    63
    (* PGIP datatypes *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    64
    val pgiptype_to_xml   : pgiptype -> XML.tree
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    65
    val read_pgval        : pgiptype -> string -> pgipval	       (* raises PGIP *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    66
    val pgval_to_string   : pgipval -> string
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    67
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    68
    val attrs_of_displayarea : displayarea -> XML.attributes
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    69
    val attrs_of_messagecategory : messagecategory -> XML.attributes
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    70
    val attrs_of_fatality : fatality -> XML.attributes
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    71
    val attrs_of_location : location -> XML.attributes
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    72
    val location_of_attrs : XML.attributes -> location (* raises PGIP *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    73
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    74
    val haspref : preference -> XML.tree
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    75
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    76
    val pgipurl_of_url : Url.T -> pgipurl	       (* raises PGIP *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    77
    val pgipurl_of_string : string -> pgipurl	       (* raises PGIP *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    78
    val pgipurl_of_path : Path.T -> pgipurl
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    79
    val attrs_of_pgipurl : pgipurl -> XML.attributes
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    80
    val pgipurl_of_attrs : XML.attributes -> pgipurl   (* raises PGIP *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    81
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    82
    (* XML utils, only for PGIP code *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    83
    val attr	       : string -> string -> XML.attributes
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    84
    val opt_attr       : string -> string option -> XML.attributes
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    85
    val opt_attr_map   : ('a -> string) -> string -> 'a option -> XML.attributes
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    86
    val get_attr       : string -> XML.attributes -> string           (* raises PGIP *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    87
    val get_attr_opt   : string -> XML.attributes -> string option
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    88
    val get_attr_dflt  : string -> string -> XML.attributes -> string
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    89
end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    90
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    91
structure PgipTypes : PGIPTYPES_OPNS =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    92
struct
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    93
exception PGIP of string
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    94
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    95
(** Utils **)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    96
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    97
fun get_attr_opt attr attrs = AList.lookup (op =) attrs attr
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    98
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
    99
fun get_attr attr attrs =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   100
    (case get_attr_opt attr attrs of
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   101
         SOME value => value
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   102
       | NONE => raise PGIP ("Missing attribute: " ^ attr))
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   103
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   104
fun get_attr_dflt attr dflt attrs = the_default dflt (get_attr_opt attr attrs)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   105
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   106
fun attr x y = [(x,y)] : XML.attributes
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   107
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   108
fun opt_attr_map f attr_name opt_val = 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   109
    case opt_val of NONE => [] | SOME v => [(attr_name,f v)]
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   110
 (* or, if you've got function-itis: 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   111
    the_default [] (Option.map (single o (pair attr_name) o f) opt_val)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   112
  *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   113
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   114
val opt_attr = opt_attr_map I
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   115
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   116
(** Types and values **)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   117
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   118
(* readers and writers for values represented in XML strings *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   119
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   120
fun read_pgipbool s =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   121
    (case s of 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   122
	 "false" => false 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   123
       | "true" => true 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   124
       | _ => raise PGIP ("Invalid boolean value: "^s))
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   125
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   126
local
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   127
    fun int_in_range (NONE,NONE) _ = true
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   128
      | int_in_range (SOME min,NONE) i = min<= i
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   129
      | int_in_range (NONE,SOME max) i = i<=max
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   130
      | int_in_range (SOME min,SOME max) i = min<= i andalso i<=max
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   131
in
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   132
fun read_pgipint range s =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   133
    (case Syntax.read_int s of 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   134
	 SOME i => if int_in_range range i then i
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   135
		   else raise PGIP ("Out of range integer value: "^s)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   136
       | NONE => raise PGIP ("Invalid integer value: "^s))
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   137
end;
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   138
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   139
fun read_pgipnat s =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   140
    (case Syntax.read_nat s of 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   141
	 SOME i => i
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   142
       | NONE => raise PGIP ("Invalid natural number: "^s))
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   143
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   144
(* NB: we can maybe do without xml decode/encode here. *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   145
fun read_pgipstring s =  (* non-empty strings, XML escapes decoded *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   146
    (case XML.parse_string s of
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   147
	 SOME s => s
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   148
       | NONE => raise PGIP ("Expected a non-empty string: "^s))
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   149
    handle _ => raise PGIP ("Invalid XML string syntax: "^s)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   150
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   151
fun int_to_pgstring i =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   152
  if i < 0 then "-" ^ string_of_int (~ i) else string_of_int i
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   153
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   154
fun string_to_pgstring s = XML.text s
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   155
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   156
fun bool_to_pgstring b = if b then "true" else "false"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   157
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   158
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   159
(* PGIP datatypes.
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   160
   
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   161
   This is a reflection of the type structure of PGIP configuration,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   162
   which is meant for setting up user dialogs and preference settings.
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   163
   These are configured declaratively in XML, using a syntax for types
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   164
   and values which is like a (vastly cut down) form of XML Schema
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   165
   Datatypes.
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   166
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   167
   The prover needs to interpret the strings representing the typed
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   168
   values, at least for the types it expects from the dialogs it
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   169
   configures.  Here we go further and construct a type-safe
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   170
   encapsulation of these values, which would be useful for more
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   171
   advanced cases (e.g. generating and processing forms).  
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   172
*)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   173
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   174
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   175
datatype pgiptype = 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   176
	 Pgipnull			     (* unit type: unique element is empty string *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   177
       | Pgipbool			     (* booleans: "true" or "false" *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   178
       | Pgipint of int option * int option  (* ranged integers, should be XSD canonical *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   179
       | Pgipnat			     (* naturals: non-negative integers (convenience) *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   180
       | Pgipstring			     (* non-empty strings *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   181
       | Pgipconst of string		     (* singleton type *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   182
       | Pgipchoice of pgipdtype list	     (* union type *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   183
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   184
(* Compared with the PGIP schema, we push descriptions of types inside choices. *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   185
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   186
and pgipdtype = Pgipdtype of string option * pgiptype
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   187
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   188
datatype pgipuval = Pgvalnull | Pgvalbool of bool | Pgvalint of int | Pgvalnat of int 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   189
		  | Pgvalstring of string | Pgvalconst of string
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   190
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   191
type pgipval = pgiptype * pgipuval	(* type-safe values *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   192
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   193
fun pgipdtype_to_xml (desco,ty) = 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   194
    let
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   195
	val desc_attr = opt_attr "descr" desco
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   196
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   197
	val elt = case ty of
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   198
		      Pgipnull => "pgipnull"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   199
		    | Pgipbool => "pgipbool"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   200
		    | Pgipint _ => "pgipint"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   201
		    | Pgipnat => "pgipint"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   202
		    | Pgipstring => "pgipstring"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   203
		    | Pgipconst _ => "pgipconst"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   204
		    | Pgipchoice _ => "pgipchoice"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   205
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   206
	fun range_attr r v = attr r (int_to_pgstring v)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   207
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   208
	val attrs = case ty of 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   209
			Pgipint (SOME min,SOME max) => (range_attr "min" min)@(range_attr "max" max)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   210
		      | Pgipint (SOME min,NONE) => (range_attr "min" min)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   211
		      | Pgipint (NONE,SOME max) => (range_attr "max" max)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   212
		      | Pgipnat => (range_attr "min" 0)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   213
		      | Pgipconst nm => attr "name" nm
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   214
		      | _ => []
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   215
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   216
	fun destpgipdtype (Pgipdtype x) = x
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   217
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   218
	val typargs = case ty of
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   219
			  Pgipchoice ds => map destpgipdtype ds
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   220
			| _ => []
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   221
    in 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   222
	XML.Elem (elt, (desc_attr @ attrs), (map pgipdtype_to_xml typargs))
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   223
    end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   224
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   225
val pgiptype_to_xml = pgipdtype_to_xml o (pair NONE)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   226
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   227
fun read_pguval Pgipnull s = 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   228
    if s="" then Pgvalnull
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   229
    else raise PGIP ("Expecting empty string for null type, not: "^s)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   230
  | read_pguval Pgipbool s = Pgvalbool (read_pgipbool s)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   231
  | read_pguval (Pgipint range) s = Pgvalint (read_pgipint range s)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   232
  | read_pguval Pgipnat s = Pgvalnat (read_pgipnat s)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   233
  | read_pguval (Pgipconst c) s = 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   234
    if c=s then Pgvalconst c 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   235
    else raise PGIP ("Given string: "^s^" doesn't match expected string: "^c)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   236
  | read_pguval Pgipstring s = 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   237
    if s<>"" then Pgvalstring s
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   238
    else raise PGIP ("Expecting non-empty string, empty string illegal.")
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   239
  | read_pguval (Pgipchoice tydescs) s = 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   240
    let 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   241
	(* Union type: match first in list *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   242
	fun getty (Pgipdtype(_,ty)) = ty
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   243
	val uval = get_first 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   244
		       (fn ty => SOME (read_pguval ty s) handle PGIP _ => NONE)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   245
		       (map getty tydescs)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   246
    in
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   247
	case uval of SOME pgv => pgv | NONE => raise PGIP ("Can't match string: "^s^
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   248
							   " against any allowed types.")
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   249
    end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   250
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   251
fun read_pgval ty s = (ty, read_pguval ty s)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   252
	    
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   253
fun pgval_to_string (_, Pgvalnull) = ""
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   254
  | pgval_to_string (_,(Pgvalbool b)) = bool_to_pgstring b
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   255
  | pgval_to_string (_,(Pgvalnat n))  = int_to_pgstring n
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   256
  | pgval_to_string (_,(Pgvalint i))  = int_to_pgstring i
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   257
  | pgval_to_string (_,(Pgvalconst c)) = string_to_pgstring c
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   258
  | pgval_to_string (_,(Pgvalstring s)) = string_to_pgstring s
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   259
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   260
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   261
(** URLs: only local files **)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   262
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   263
type pgipurl = Path.T
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   264
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   265
datatype displayarea = Status | Message | Display | Other of string
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   266
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   267
datatype messagecategory = Normal | Information | Tracing | Internal 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   268
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   269
datatype fatality = Nonfatal | Fatal | Panic | Log | Debug
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   270
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   271
type location = { descr: string option,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   272
		  url: pgipurl option,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   273
		  line: int option,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   274
		  column: int option,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   275
		  char: int option }
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   276
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   277
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   278
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   279
(** Url operations **)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   280
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   281
fun pgipurl_of_string url = (* only handle file:/// or file://localhost/ *)
21858
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 21637
diff changeset
   282
	case Url.explode url of
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   283
            (Url.File path) => path
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   284
	  | _ => raise PGIP ("Cannot access non-local URL " ^ url)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   285
		       
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   286
fun pgipurl_of_path p = p
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   287
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   288
fun attrs_of_pgipurl purl = 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   289
    [("url", "file:" ^ (XML.text (File.platform_path (File.full_path purl))))]
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   290
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   291
val pgipurl_of_attrs = pgipurl_of_string o (get_attr "url")
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   292
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   293
fun pgipurl_of_url (Url.File p) = p
21858
05f57309170c avoid conflict with Alice keywords: renamed pack -> implode, unpack -> explode, any -> many, avoided assert;
wenzelm
parents: 21637
diff changeset
   294
  | pgipurl_of_url url = raise PGIP ("Cannot access non-local/non-file URL " ^ (Url.implode url))
21637
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   295
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   296
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   297
(** Messages and errors **)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   298
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   299
local
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   300
  fun string_of_area Status = "status"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   301
    | string_of_area Message = "message"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   302
    | string_of_area Display = "display"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   303
    | string_of_area (Other s) = s
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   304
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   305
  fun string_of_msgcat Internal = "internal"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   306
    | string_of_msgcat Information = "information"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   307
    | string_of_msgcat Tracing = "tracing"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   308
    | string_of_msgcat Normal = "normal"   (* omitted in PGIP *)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   309
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   310
  fun string_of_fatality Nonfatal = "nonfatal"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   311
    | string_of_fatality Fatal = "fatal"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   312
    | string_of_fatality Panic = "panic"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   313
    | string_of_fatality Log = "log"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   314
    | string_of_fatality Debug = "debug"
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   315
in
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   316
  fun attrs_of_displayarea area = [("area", string_of_area area)]
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   317
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   318
  fun attrs_of_messagecategory msgcat = 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   319
      case msgcat of 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   320
	  Normal => []
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   321
	| _ => [("messagecategory", string_of_msgcat msgcat)]
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   322
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   323
  fun attrs_of_fatality fatality = [("fatality", string_of_fatality fatality)]
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   324
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   325
  fun attrs_of_location ({ descr, url, line, column, char }:location) =
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   326
      let 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   327
	  val descr = opt_attr  "descr"descr
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   328
	  val url = the_default [] (Option.map attrs_of_pgipurl url)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   329
	  val line = opt_attr_map int_to_pgstring "line" line
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   330
	  val column = opt_attr_map int_to_pgstring "column"  column
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   331
	  val char = opt_attr_map int_to_pgstring "char" char
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   332
      in 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   333
	  descr @ url @ line @ column @ char
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
    fun pgipint_of_string err s = 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   337
	case Syntax.read_int s of 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   338
	    SOME i => i
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   339
	  | NONE => raise PGIP ("Type error in " ^ err ^ ": expected integer.")
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   340
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   341
  fun location_of_attrs attrs = 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   342
      let
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   343
	  val descr = get_attr_opt "descr" attrs
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   344
	  val url = Option.map  pgipurl_of_string (get_attr_opt "url" attrs)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   345
	  val line = Option.map (pgipint_of_string "location element line attribute")
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   346
				(get_attr_opt "line" attrs)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   347
	  val column = Option.map (pgipint_of_string "location element column attribute")
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   348
				  (get_attr_opt "column" attrs)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   349
	  val char = Option.map (pgipint_of_string "location element char attribute")
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   350
				(get_attr_opt "char" attrs)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   351
      in 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   352
	  {descr=descr, url=url, line=line, column=column, char=char}
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   353
      end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   354
end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   355
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   356
(** Preferences **)
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   357
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   358
type preference = { name: string,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   359
		    descr: string option,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   360
		    default: string option,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   361
		    pgiptype: pgiptype }
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   362
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   363
fun haspref ({ name, descr, default, pgiptype}:preference) = 
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   364
    XML.Elem ("haspref",
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   365
	      attr "name" name @
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   366
	      opt_attr "descr" descr @
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   367
	      opt_attr "default" default,
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   368
	      [pgiptype_to_xml pgiptype])
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   369
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   370
end
a7b156c404e2 Revamped Proof General interface.
aspinall
parents:
diff changeset
   371