\begin{syntax}
  type-defn ::=                                      ; abstract type
    | "=" type                                       ; alias type
    | "=" "|"? type-case ("|" type-case)*            ; algebraic type
    | "=" "{" record-field (";" record-field)* "}"   ; record type
    | "<" "range" integer integer ">"                ; range type
    | "<" "float" integer integer ">"                ; float type
  \
  type-case ::= uident label* type-param*
  \
  record-field ::= lident label* ":" type
  \
  type-param ::= "'" lident   ;
   | lqualid                  ;
   | "(" lident+ ":" type ")" ;
   | "(" type ("," type)* ")" ;
   | "()"
\end{syntax}
