sig
  type access_op = Dot | Arrow
  and assign_op =
      Assign
    | AssignBitAnd
    | AssignBitOr
    | AssignDiv
    | AssignLShift
    | AssignMinus
    | AssignMul
    | AssignPlus
    | AssignRem
    | AssignRShift
    | AssignXor
  and unary_op =
      UnaryMinus
    | Not
    | BitNot
    | Address
    | UnaryPlus
    | DestructorCall
    | Assume
    | Assert
    | PreInc
    | PreDec
    | PostInc
    | PostDec
  and binary_op =
      BitAnd
    | BitOr
    | Div
    | LShift
    | Minus
    | Mul
    | Plus
    | Rem
    | RShift
    | Xor
    | Eq
    | Ge
    | Gt
    | Le
    | Lt
    | Ne
    | Index
    | And
    | Or
    | Comma
    | FieldOffset
  and lval =
      Symbol of Ast.Symbol.symbol
    | Access of Ast.Expression.access_op * Ast.Expression.expression *
        Ast.Symbol.symbol
    | Dereference of Ast.Expression.expression
    | Indexed of Ast.Expression.expression * Ast.Expression.expression
  and expression =
      Lval of Ast.Expression.lval
    | Chlval of Ast.Expression.lval * string
    | Assignment of Ast.Expression.assign_op * Ast.Expression.lval *
        Ast.Expression.expression
    | Binary of Ast.Expression.binary_op * Ast.Expression.expression *
        Ast.Expression.expression
    | Cast of Ast.ast_type * Ast.Expression.expression
    | Constant of Ast.Constant.constant
    | Constructor of Ast.Symbol.symbol * Ast.ast_type
    | FunctionCall of Ast.Expression.expression *
        Ast.Expression.expression list
    | Sizeof of int
    | Unary of Ast.Expression.unary_op * Ast.Expression.expression
  and t = Ast.Expression.expression
  val compare : Ast.Expression.t -> Ast.Expression.t -> int
  val unaryOpToString : Ast.Expression.unary_op -> string
  val unaryOpToVanillaString : Ast.Expression.unary_op -> string
  val assignOpToString : Ast.Expression.assign_op -> string
  val accessOpToString : Ast.Expression.access_op -> string
  val binaryOpToString : Ast.Expression.binary_op -> string
  val binaryOpToVanillaString : Ast.Expression.binary_op -> string
  val print : Format.formatter -> Ast.Expression.expression -> unit
  val print_lval : Format.formatter -> Ast.Expression.lval -> unit
  val toString : Ast.Expression.expression -> string
  val lvalToString : Ast.Expression.lval -> string
  val addressOf : Ast.Expression.expression -> Ast.Expression.expression
  val replaceChlvals : Ast.Expression.expression -> Ast.Expression.expression
  val isRelOp : Ast.Expression.binary_op -> bool
  val isDeref : Ast.Expression.expression -> bool
  val push_deref : Ast.Expression.lval -> Ast.Expression.lval
  val derefedVar : Ast.Expression.lval -> Ast.Expression.expression
  val getParents : Ast.Expression.lval list -> Ast.Expression.expression list
  val allVarExps :
    Ast.Expression.expression -> Ast.Expression.expression list
  val negateRel : Ast.Expression.expression -> Ast.Expression.expression
  val fresh_lval : Ast.Expression.lval -> Ast.Expression.expression
  val alpha_convert :
    (Ast.Expression.lval -> Ast.Expression.lval) ->
    Ast.Expression.expression -> Ast.Expression.expression
  val alpha_convert_lval :
    (Ast.Expression.lval -> Ast.Expression.lval) ->
    Ast.Expression.lval -> Ast.Expression.lval
  val deep_alpha_convert :
    (Ast.Expression.lval -> Ast.Expression.expression) ->
    Ast.Expression.expression -> Ast.Expression.expression
  val substituteExpression :
    (Ast.Expression.expression * Ast.Expression.expression) list ->
    Ast.Expression.expression -> Ast.Expression.expression
  val assignments_of_expression :
    Ast.Expression.expression ->
    (Ast.Expression.expression * Ast.Expression.expression) list
end