protected Token parseNextToken()

in framework/script-engine/src/main/java/org/apache/manifoldcf/scriptengine/BasicTokenStream.java [51:206]


  protected Token parseNextToken()
    throws ScriptException
  {
    char y;
    int lineNumber;
    int characterNumber;

    // Skip to the start of the next token (or exit if no token start can be found)
    while (true)
    {
      
      // Skip white space
      while (true)
      {
        // Remember current position so we can properly characterize the token.
        lineNumber = characterStream.getLineNumber();
        characterNumber = characterStream.getCharacterNumber();
        int x = characterStream.peek();
        if (x == -1)
          return null;
        y = (char)x;
        if (y > ' ')
          break;
        characterStream.skip();
      }

      // Is it a comment?
      if (y == '#')
      {
        // Skip to the end of the line, or the end of the text.
        while (true)
        {
          int x = characterStream.peek();
          if (x == -1)
            return null;
          characterStream.skip();
          y = (char)x;
          if (y == '\n')
            break;
        }
        continue;
      }
      break;
    }

    // At the start of the next token.
    if (isQuoteCharacter(y))
    {
      // Legal token character
      StringBuilder tokenBuffer = new StringBuilder();
      char quoteMark = y;
      characterStream.skip();
      while (true)
      {
        int x = characterStream.peek();
        if (x == -1)
          break;
        y = (char)x;
        characterStream.skip();
        if (y == quoteMark)
          // End of the quotation
          break;
        if (y == '\\')
        {
          // Escape character
          x = characterStream.peek();
          if (x != -1)
          {
            tokenBuffer.append((char)x);
            characterStream.skip();
          }
        }
        else
          tokenBuffer.append(y);
      }
      return new Token(Token.TOKEN_STRING,tokenBuffer.toString(),lineNumber,characterNumber);
    }
    else if (isTokenCharacter(y))
    {
      // Legal token character
      StringBuilder tokenBuffer = new StringBuilder();
      while (true)
      {
        int x = characterStream.peek();
        if (x == -1)
          break;
        y = (char)x;
        if (isTokenCharacter(y) || isNumberCharacter(y))
        {
          // Tokens can include numbers, just so long they aren't the first character
          characterStream.skip();
          tokenBuffer.append(y);
        }
        else
          break;
      }
      return new Token(Token.TOKEN_TOKEN,tokenBuffer.toString(),lineNumber,characterNumber);
    }
    else if (isNumberCharacter(y))
    {
      StringBuilder tokenBuffer = new StringBuilder();
      boolean seenDot = false;
      while (true)
      {
        int x = characterStream.peek();
        if (x == -1)
          break;
        y = (char)x;
        if (isNumberCharacter(y))
        {
          tokenBuffer.append(y);
          characterStream.skip();
        }
        else if (y == '.' && seenDot == false)
        {
          tokenBuffer.append(y);
          seenDot = true;
          characterStream.skip();
        }
        else
          break;
      }
      if (seenDot)
        return new Token(Token.TOKEN_FLOAT,tokenBuffer.toString(),lineNumber,characterNumber);
      else
        return new Token(Token.TOKEN_INTEGER,tokenBuffer.toString(),lineNumber,characterNumber);
    }
    else
    {
      // Set a punctuation token
      characterStream.skip();
      if (y == '=' || y == '!' || y == '>' || y == '<' || y == '&' || y == '|')
      {
        int x = characterStream.peek();
        if (x != -1)
        {
          char q = (char)x;
          if (y == '=' && q == '=' ||
            y == '!' && q == '=' ||
            y == '>' && q == '=' ||
            y == '<' && q == '=' ||
            y == '&' && q == '&' ||
            y == '|' && q == '|' ||
            y == '>' && q == '>' ||
            y == '<' && q == '<')
          {
            characterStream.skip();
            return new Token(Token.TOKEN_PUNCTUATION,new StringBuilder().append(y).append(q).toString(),
              lineNumber,characterNumber);
          }
        }
      }
      return new Token(Token.TOKEN_PUNCTUATION,new StringBuilder().append(y).toString(),
        lineNumber,characterNumber);
    }
  }