}
  public Object evaluate(Node context, int pos, int len)  {    Object left = lhs.evaluate(context, pos, len);    Object right = rhs.evaluate(context, pos, len);    double ln = _number(context, left);    double rn = _number(context, right);    switch (op)      {      case ADD:        return new Double(ln + rn);      case SUBTRACT:        return new Double(ln - rn);      case MULTIPLY:        return new Double(ln * rn);      case DIVIDE:        if (rn == 0.0d || rn == -0.0d)          {            return new Double(ln < 0.0d ?                              Double.NEGATIVE_INFINITY :                              Double.POSITIVE_INFINITY);          }        return new Double(ln / rn);      case MODULO:        if (rn == 0.0d || rn == -0.0d)          {            return new Double(ln < 0.0d ?                              Double.NEGATIVE_INFINITY :                              Double.POSITIVE_INFINITY);          }        return new Double(ln % rn);      default:        throw new IllegalStateException();      }  }