Structure ParseDatatype
signature ParseDatatype =
sig
datatype pretype =
dVartype of string
| dTyop of {Tyop : string, Thy : string option, Args : pretype list}
| dAQ of Type.hol_type
val pretypeToType : pretype -> Type.hol_type
type field = string * pretype
type constructor = string * pretype list
datatype datatypeForm =
Constructors of constructor list
| Record of field list
type AST = string * datatypeForm
val parse : Type.hol_type Portable.quotation -> AST list
(*---------------------------------------------------------------------------
Grammar we're parsing is:
G ::= id "=" <form> (";" id "=" <form>)*
form ::= <phrase> ( "|" <phrase> ) * | <record_defn>
phrase ::= id | id "of" <ptype> ( "=>" <ptype> ) *
record_defn ::= "<|" <idtype_pairs> "|>"
idtype_pairs ::= id ":" <type> | id : <type> ";" <idtype_pairs>
ptype ::= <type> | "(" <type> ")"
It had better be the case that => is not a type infix. This is true of
the standard HOL distribution. In the event that => is an infix, this
code will still work as long as the input puts the types in parentheses.
---------------------------------------------------------------------------*)
val hparse : Type.hol_type Portable.quotation -> AST list
(* The grammar for hparse is:
G ::= id "=" <form> (";" id "=" <form>)*
form ::= "|"? <phrase> ( "|" <phrase> )* | <record_defn>
phrase ::= id <typarg>*
typarg ::= atomic-typ | "(" <type> ")"
where record_defn is as above, and an atomic-typ is either a type variable,
or a type-constant of arity 0, or one of the types being defined.
*)
end
HOL 4, Kananaskis-10