@Override public void visit(BinaryExpr expr) { switch (expr.getOperation()) { case AND: case OR: resultExpr = expr; return; default: break; } expr.getSecondOperand().acceptVisitor(this); Expr b = resultExpr; if (b instanceof ConstantExpr && expr.getOperation() == BinaryOperation.SUBTRACT) { if (tryMakePositive((ConstantExpr) b)) { expr.setOperation(BinaryOperation.ADD); } } expr.getFirstOperand().acceptVisitor(this); Expr a = resultExpr; Expr p = a; Expr q = b; boolean invert = false; if (isZero(p)) { Expr tmp = p; p = q; q = tmp; invert = true; } if (isComparison(p) && isZero(q)) { switch (expr.getOperation()) { case EQUALS: case NOT_EQUALS: case LESS: case LESS_OR_EQUALS: case GREATER: case GREATER_OR_EQUALS: { BinaryExpr comparison = (BinaryExpr) p; Expr result = BinaryExpr.binary( expr.getOperation(), comparison.getFirstOperand(), comparison.getSecondOperand()); result.setLocation(comparison.getLocation()); if (invert) { result = ExprOptimizer.invert(result); } resultExpr = result; return; } default: break; } } expr.setFirstOperand(a); expr.setSecondOperand(b); resultExpr = expr; }