sig
  type cexpr_detail =
      This
    | Null
    | Id of string * Sast.varkind
    | NewObj of string * string * Cast.cexpr list
    | NewArr of string * string * Cast.cexpr list
    | Literal of Ast.lit
    | Assign of Cast.cexpr * Cast.cexpr
    | Deref of Cast.cexpr * Cast.cexpr
    | Field of Cast.cexpr * string
    | Invoc of Cast.cexpr * string * Cast.cexpr list
    | Unop of Ast.op * Cast.cexpr
    | Binop of Cast.cexpr * Ast.op * Cast.cexpr
    | Refine of Cast.cexpr list * string option * Sast.refine_switch
    | Refinable of Sast.refine_switch
  and cexpr = string * Cast.cexpr_detail
  and cstmt =
      Decl of Ast.var_def * Cast.cexpr option * Sast.environment
    | If of (Cast.cexpr option * Cast.cstmt list) list * Sast.environment
    | While of Cast.cexpr * Cast.cstmt list * Sast.environment
    | Expr of Cast.cexpr * Sast.environment
    | Super of string * string * Cast.cexpr list
    | Return of Cast.cexpr option * Sast.environment
  and cfunc = {
    returns : string option;
    name : string;
    formals : Ast.var_def list;
    body : Cast.cstmt list;
    builtin : bool;
    inklass : string;
    static : bool;
  }
  type class_struct = (string * Ast.var_def list) list
  type main_func = string * string
  type ancestry_info = string list StringModules.lookup_map
  type program =
      Cast.class_struct StringModules.lookup_map * Cast.cfunc list *
      Cast.main_func list * Cast.ancestry_info
end