class AbstractGrimpIntBinopExpr extends AbstractIntBinopExpr implements Precedence {

  public AbstractGrimpIntBinopExpr(Value op1, Value op2) {
    this(Grimp.v().newArgBox(op1), Grimp.v().newArgBox(op2));
  }

  protected AbstractGrimpIntBinopExpr(ValueBox op1Box, ValueBox op2Box) {
    super(op1Box, op2Box);
  }

  @Override
  public abstract int getPrecedence();

  @Override
  public String toString() {<FILL_FUNCTION_BODY>}
}

    final Value op1 = op1Box.getValue();
    String leftOp = op1.toString();
    if (op1 instanceof Precedence && ((Precedence) op1).getPrecedence() < getPrecedence()) {
      leftOp = "(" + leftOp + ")";
    }

    final Value op2 = op2Box.getValue();
    String rightOp = op2.toString();
    if (op2 instanceof Precedence) {
      int opPrec = ((Precedence) op2).getPrecedence(), myPrec = getPrecedence();
      if ((opPrec < myPrec) || ((opPrec == myPrec) && ((this instanceof SubExpr) || (this instanceof DivExpr)
          || (this instanceof DCmpExpr) || (this instanceof DCmpgExpr) || (this instanceof DCmplExpr)))) {
        rightOp = "(" + rightOp + ")";
      }
    }

    return leftOp + getSymbol() + rightOp;
  
<methods>public soot.Type getType() <variables>