code: private Token consumeNumber() {
      StringBuilder sb = new StringBuilder();
      int l = line;
      int c = column;
      Token T;
      boolean err;
      boolean isDouble = false;
      if(ch == '-') {
        sb.append(ch);
        nextChar();
      }
      if(ch != '0') {
        err = consumeDigits(sb);
        if(err) {
          return new Token(TokenType.ERROR, sb.toString(), line, column);
        }
      } else {
        sb.append(ch);
        nextChar();
      }
      if(ch == '.') {
        isDouble = true;
        sb.append(ch);
        nextChar();
        err = consumeDigits(sb);
        if(err) {
          return new Token(TokenType.ERROR, sb.toString(), line, column);
        }
      }
      if(ch == 'E' || ch == 'e') {
        isDouble = true;
        sb.append(ch);
        nextChar();
        if(ch == '-') {
          sb.append(ch);
          nextChar();
        } else if(ch == '+') {
          sb.append(ch);
          nextChar();
        }
        err = consumeDigits(sb);
        if(err) {
          return new Token(TokenType.ERROR, sb.toString(), line, column);
        }
      }
      if(isDouble) {
        T = new Token(TokenType.DOUBLE, sb.toString(), l, c);
      } else {
        T = new Token(TokenType.INTEGER, sb.toString(), l, c);
      }
      return T;
    }
docs: /*
  number = [ "-" ] int [ frac ] [ exp ].
  exp = ("e" | "E") [ "-" | "+" ] digit {digit}.
  frac = "." digit {digit}.
  int = "0" |  digit19 {digit}.
  digit = "0" | "1" | ... | "9".
  digit19 = "1" | ... | "9".