Пример #1
0
  private void parseTokens() {
    if (!tokens.isEmpty()) {
      return;
    }

    int startOffset = scanner.offset();
    int startColumn = column;
    buffer.setLength(0);

    while (!scanner.eof() && isWhitespace(scanner.peek())) {
      final char c = scanner.next();
      column++;
      if (!ignoreWhitespace) {
        buffer.append(c);
      }
    }

    if (buffer.length() > 0) {
      addToken(TokenType.WHITESPACE, buffer.toString(), startOffset, line, startColumn);
      return;
    }

    startOffset = scanner.offset();

    outer:
    while (!scanner.eof()) {
      final char c = scanner.next();
      if (isWhitespace(c)) {
        scanner.pushBack();
        break;
      }
      column++;

      if (c == '-') {
        parseBuffer(startOffset, startColumn);
        addToken(TokenType.OPERATOR, c, scanner.offset() - 1, line, column);
        break outer;
      }

      if (OperatorType.mayBeOperator(buffer.toString() + c)) {
        buffer.append(c);
        continue;
      } else if (OperatorType.getExactMatch(buffer.toString()) != null) {
        addToken(TokenType.OPERATOR, buffer.toString(), startOffset, line, startColumn);
        buffer.setLength(0);
        scanner.pushBack();
        column--;
        break;
      } else if (OperatorType.mayBeOperator(c)) {
        scanner.pushBack();
        column--;
        break;
      }

      switch (c) {
        case '(':
          parseBuffer(startOffset, startColumn);
          addToken(TokenType.PARENS_OPEN, c, scanner.offset() - 1, line, column);
          break outer;
        case ')':
          parseBuffer(startOffset, startColumn);
          addToken(TokenType.PARENS_CLOSE, c, scanner.offset() - 1, line, column);
          break outer;
        case '=':
          parseBuffer(startOffset, startColumn);
          addToken(TokenType.EQUALS, c, scanner.offset() - 1, line, column);
          break outer;
        case ';':
          parseBuffer(startOffset, startColumn);
          addToken(TokenType.SEMICOLON, c, scanner.offset() - 1, line, column);
          break outer;
        case '\'':
          parseBuffer(startOffset, startColumn);
          addToken(TokenType.SINGLE_QUOTE, c, scanner.offset() - 1, line, column);
          break outer;
        case '"':
          parseBuffer(startOffset, startColumn);
          addToken(TokenType.DOUBLE_QUOTE, c, scanner.offset() - 1, line, column);
          break outer;
        case '.':
          parseBuffer(startOffset, startColumn);
          addToken(TokenType.DOT, c, scanner.offset() - 1, line, column);
          break outer;
        case '#':
          parseBuffer(startOffset, startColumn);
          addToken(TokenType.HASH, c, scanner.offset() - 1, line, column);
          break outer;
        case ',':
          parseBuffer(startOffset, startColumn);
          addToken(TokenType.COMMA, c, scanner.offset() - 1, line, column);
          break outer;
        case '\n':
          parseBuffer(startOffset, startColumn);
          addToken(TokenType.EOL, c, scanner.offset() - 1, line, column);
          break outer;
        case ':':
          parseBuffer(startOffset, startColumn);
          addToken(TokenType.COLON, ':', scanner.offset() - 1, line, column);
          break outer;
        case '\r':
          parseBuffer(startOffset, startColumn);
          if (!scanner.eof() && scanner.peek() == '\n') {
            scanner.next();
            addToken(TokenType.EOL, "\r\n", scanner.offset() - 2, line, column);
            column++;
          } else {
            addToken(TokenType.EOL, "\r", scanner.offset() - 1, line, column);
          }
          line++;
          column = 0;
          break outer;
        default:
          buffer.append(c);
      }
    }

    parseBuffer(startOffset, startColumn);

    if (scanner.eof()) {
      addToken(TokenType.EOF, "", scanner.offset(), line, column);
    }
  }