AST

    (* MLPolyR Abstract Syntax *)
    datatype exp =
	LETexp of def list * exp
      | IFexp of exp * exp * exp
      | LCASEexp of exp * lmatch
      | WHEREexp of exp * exp field list
      | BINOPexp of binop * exp * exp
      | UOPexp of uop * exp
      | APPexp of exp * exp
      | ASSIGNexp of exp * mlabel * exp
      | SELexp of exp * mlabel
      | FETCHexp of exp * mlabel
      | BOOLexp of bool
      | NUMBERexp of integer
      | STRINGexp of string
      | VARexp of symbol
      | SEQexp of exp list
      | LISTexp of exp list
      | RECORDexp of exp field list
      | TUPLEexp of exp list
      | MATCHexp of (mlabel * pat * exp) list * exp option
      | CONexp of mlabel * exp
      | SWIDENexp of exp * mlabel
      | MCASEexp of exp * exp
      | FNexp of pat * exp
      | MARKexp of exp * region

    and def =
	VALdef of pat * exp
      | FUNdef of function list * region

    and function = FUN of symbol * pat list * exp * region

    and pat =
	WILDpat
      | VARpat of symbol
      | TUPLEpat of pat list
      | RECORDpat of pat field list
      | MATCHpat of pat field list
      | ANDpat of pat * pat
      | MARKpat of pat * region

    and lmatch = { nilcase: exp, conscase: pat * pat * exp }

    type program = exp