docs: private Number readNumber() throws IOException {
          StringBuffer sb = new StringBuffer();
          int          l    = lineNo;
          int          c    = colNo;
  
          while (isDigitChar(lastChar))
          {
              sb.append((char)lastChar);
              readChar();
          }
  
          // convert it!
          String string = sb.toString();
  
          try
          {
              if (-1 != string.indexOf('.'))
              {
                  return Double.valueOf(string);
              }
  
              String sign = "";
              if (string.startsWith("-"))
              {
                  sign = "-";
                  string = string.substring(1);
              }
  
              if (string.toUpperCase().startsWith("0X"))
              {
                  return Long.valueOf(sign + string.substring(2),16);
              }
  
              if (string.equals("0"))
              {
                  return new Long(0);
              }
              else if (string.startsWith("0") && string.length() > 1)
              {
                  return Long.valueOf(sign + string.substring(1),8);
              }
  
              /**
               * We have to check for the exponential and treat appropriately
               * Exponentials should be treated as Doubles.
               */
              if (string.indexOf("e") != -1 || string.indexOf("E") != -1)
              {
                  return Double.valueOf(sign + string);
              }
              else
              {
                  return Long.valueOf(sign + string,10);
              }
          }
          catch (NumberFormatException e)
          {
              IOException iox = new IOException("Invalid number literal " + onLineCol(l,c));
              iox.initCause(e);
              throw iox;
          }
      }