public BigDecimal value() {
        if (op == null)
            return value;
        BigDecimal l = left.value();
        BigDecimal r = (right != null) ? right.value() : null;
        switch (op) {
        case ADD:
            return l.add(r);
        case SUB:
            return r != null ? l.subtract(r) : l.negate();
        case MUL:
            return l.multiply(r);
        case DIV:
            return l.divide
                    (r, 32, BigDecimal.ROUND_HALF_EVEN);
        case MOD:
            return l.remainder(r);
        case POW:
            return l.pow(r.intValue());
        default:
            // 呼び出しなし
        }
        return BigDecimal.ZERO;
    }