Expr opE(Expr expr1) {
        Expr expr = null;
        switch(look.getType()) {
        case Type.ADD:
        case Type.SUB:
            System.out.println("cal : " + expr1.getResult());

            // [+] num Es opE | [-] num Es opE
            Token op = look;
            next();

            // + [num] Es opE | - [num] Es opE
            Expr expr2 = num();

            // Build AST node.
            expr = new ExprArith(op, expr1, expr2);

            // + num [Es] opE | - num [Es] opE
            boolean cal = false;
            expr = Es(expr, cal);

            // + num Es [opE] | - num Es [opE]
            expr = opE(expr);
            break;
        case Type.EOF:
            expr = expr1;
            break;
        default:
            syntaxError();
        }
        return expr;
    }