sig
  type loc = Stdlib.Lexing.position * Stdlib.Lexing.position
  type ident = { id : string; id_loc : Ptree.loc; }
  type typ = Tint | Tstructp of Ptree.ident
  type unop = Unot | Uminus
  type binop =
      Beq
    | Bneq
    | Blt
    | Ble
    | Bgt
    | Bge
    | Badd
    | Bsub
    | Bmul
    | Bdiv
    | Band
    | Bor
  type expr = { expr_node : Ptree.expr_node; expr_loc : Ptree.loc; }
  and expr_node =
      Econst of int32
    | Eright of Ptree.lvalue
    | Eassign of Ptree.lvalue * Ptree.expr
    | Eunop of Ptree.unop * Ptree.expr
    | Ebinop of Ptree.binop * Ptree.expr * Ptree.expr
    | Ecall of Ptree.ident * Ptree.expr list
    | Esizeof of Ptree.ident
  and lvalue = Lident of Ptree.ident | Larrow of Ptree.expr * Ptree.ident
  type decl_var = Ptree.typ * Ptree.ident
  type stmt = { stmt_node : Ptree.stmt_node; stmt_loc : Ptree.loc; }
  and stmt_node =
      Sskip
    | Sexpr of Ptree.expr
    | Sif of Ptree.expr * Ptree.stmt * Ptree.stmt
    | Swhile of Ptree.expr * Ptree.stmt
    | Sblock of Ptree.block
    | Sreturn of Ptree.expr
  and block = Ptree.decl_var list * Ptree.stmt list
  type decl_struct = Ptree.ident * Ptree.decl_var list
  type decl_fun = {
    fun_typ : Ptree.typ;
    fun_name : Ptree.ident;
    fun_formals : Ptree.decl_var list;
    fun_body : Ptree.block;
  }
  type decl = Dstruct of Ptree.decl_struct | Dfun of Ptree.decl_fun
  type file = Ptree.decl list
end