sig
  type ident = string
  type typ = Tint | Tstructp of Ttree.structure | Tvoidstar | Ttypenull
  and structure = {
    str_name : Ttree.ident;
    str_fields : (Ttree.ident, Ttree.field) Stdlib.Hashtbl.t;
  }
  and field = { field_name : string; field_typ : Ttree.typ; }
  type unop = Ptree.unop
  type binop = Ptree.binop
  type decl_var = Ttree.typ * Ttree.ident
  type expr = { expr_node : Ttree.expr_node; expr_typ : Ttree.typ; }
  and expr_node =
      Econst of int32
    | Eaccess_local of Ttree.ident
    | Eaccess_field of Ttree.expr * Ttree.field
    | Eassign_local of Ttree.ident * Ttree.expr
    | Eassign_field of Ttree.expr * Ttree.field * Ttree.expr
    | Eunop of Ttree.unop * Ttree.expr
    | Ebinop of Ttree.binop * Ttree.expr * Ttree.expr
    | Ecall of Ttree.ident * Ttree.expr list
    | Esizeof of Ttree.structure
  type stmt =
      Sskip
    | Sexpr of Ttree.expr
    | Sif of Ttree.expr * Ttree.stmt * Ttree.stmt
    | Swhile of Ttree.expr * Ttree.stmt
    | Sblock of Ttree.block
    | Sreturn of Ttree.expr
  and block = Ttree.decl_var list * Ttree.stmt list
  and decl_fun = {
    fun_typ : Ttree.typ;
    fun_name : Ttree.ident;
    fun_formals : Ttree.decl_var list;
    fun_body : Ttree.block;
  }
  type file = { funs : Ttree.decl_fun list; }
end