@Override
    public Expr simplify() {
        Expr x1, x2;

        x1 = c1.simplify();
        x2 = c2.simplify();

        switch (operand) {
            case '+': {
                if ("Math.Constant".equals(x1.getClass().getName())) {
                    if (x1.evaluate() == 0) {
                        return x2;
                    }
                }
                if ("Math.Constant".equals(x2.getClass().getName())) {
                    if (x2.evaluate() == 0) {
                        return x1;
                    }
                }
                break;
            }
            case '-': {
                if ("Math.Constant".equals(x1.getClass().getName())) {
                    if (x1.evaluate() == 0) {
                        return new BinOp('-', new NullSymbol(), x2);
                    }
                }
                if ("Math.Constant".equals(x2.getClass().getName())) {
                    if (x2.evaluate() == 0) {
                        return x1;
                    }
                }
                break;
            }
            case '*': {
                if ("Math.Constant".equals(x1.getClass().getName())) {
                    if (x1.evaluate() == 0) {
                        return new Constant(0);
                    }
                }
                if ("Math.Constant".equals(x2.getClass().getName())) {
                    if (x2.evaluate() == 0) {
                        return new Constant(0);

                    }
                }
                if ("Math.Constant".equals(x1.getClass().getName())) {
                    if (x1.evaluate() == 1) {
                        return x2;

                    }
                }
                if ("Math.Constant".equals(x2.getClass().getName())) {
                    if (x2.evaluate() == 1) {
                        return x1;
                    }
                }
                break;

            }
            case '/': {
                if ("Math.Constant".equals(x1.getClass().getName())) {
                    if (x1.evaluate() == 0) {
                        return new Constant(0);
                    }
                }
                if ("Math.Constant".equals(x1.getClass().getName())) {
                    if (x1.evaluate() == 1) {
                        return this;
                    }
                }
                if ("Math.Constant".equals(x2.getClass().getName())) {
                    if (x2.evaluate() == 0) {
                        return this;
                    }
                }
                if ("Math.Constant".equals(x2.getClass().getName())) {
                    if (x2.evaluate() == 1) {
                        return x1;
                    }
                }
            }
            case '^': {
                if ("Math.Constant".equals(x1.getClass().getName())) {
                    if (x1.evaluate() == 0) {
                        return new Constant(0);
                    }
                }
                if ("Math.Constant".equals(x1.getClass().getName())) {
                    if (x1.evaluate() == 1) {
                        return new Constant(1);
                    }
                }
                if ("Math.Constant".equals(x2.getClass().getName())) {
                    if (x2.evaluate() == 1) {
                        return x1;
                    }
                }
                if ("Math.Constant".equals(x2.getClass().getName())) {
                    if (x2.evaluate() == 0) {
                        return new Constant(1);
                    }
                }
            }
        }
        if ("Math.Constant".equals(x2.getClass().getName()) && "Math.Constant".equals(x1.getClass().getName())) {
            return new Constant(new BinOp(operand, x1, x2).evaluate());
        } else {
            return new BinOp(operand, x1, x2);
        }
    }