func()

in query/expr/scanner.go [53:146]


func (s *Scanner) scan() (tok Token, pos Pos, lit string) {
	// Read next code point.
	ch0, pos := s.r.read()

	// If we see whitespace then consume all contiguous whitespace.
	// If we see a letter, or certain acceptable special characters, then consume
	// as an ident or reserved word.
	if isWhitespace(ch0) {
		return s.scanWhitespace()
	} else if isLetter(ch0) || ch0 == '_' {
		s.r.unread()
		return s.scanIdent()
	} else if isDigit(ch0) {
		return s.scanNumber()
	}

	// Otherwise parse individual characters.
	switch ch0 {
	case eof:
		return EOF, pos, ""
	case '`':
		s.r.unread()
		return s.scanIdent()
	case '"':
		return s.scanString()
	case '\'':
		return s.scanString()
	case '.':
		ch1, _ := s.r.read()
		s.r.unread()
		if isDigit(ch1) {
			return s.scanNumber()
		}
		return DOT, pos, ""
	case '+', '-':
		if (s.lastNonWSToken > literal_beg && s.lastNonWSToken < literal_end) || s.lastNonWSToken == RPAREN {
			if ch0 == '+' {
				return ADD, pos, ""
			}
			return SUB, pos, ""
		}
		return s.scanNumber()
	case '*':
		return MUL, pos, ""
	case '/':
		return DIV, pos, ""
	case '%':
		return MOD, pos, ""
	case '=':
		return EQ, pos, ""
	case '~':
		return BITWISE_NOT, pos, ""
	case '|':
		return BITWISE_OR, pos, ""
	case '&':
		return BITWISE_AND, pos, ""
	case '^':
		return BITWISE_XOR, pos, ""
	case '!':
		if ch1, _ := s.r.read(); ch1 == '=' {
			return NEQ, pos, ""
		}
		s.r.unread()
		return EXCLAMATION, pos, ""
	case '>':
		ch1, _ := s.r.read()
		if ch1 == '=' {
			return GTE, pos, ""
		} else if ch1 == '>' {
			return BITWISE_RIGHT_SHIFT, pos, ""
		}
		s.r.unread()
		return GT, pos, ""
	case '<':
		ch1, _ := s.r.read()
		if ch1 == '=' {
			return LTE, pos, ""
		} else if ch1 == '>' {
			return NEQ, pos, ""
		} else if ch1 == '<' {
			return BITWISE_LEFT_SHIFT, pos, ""
		}
		s.r.unread()
		return LT, pos, ""
	case '(':
		return LPAREN, pos, ""
	case ')':
		return RPAREN, pos, ""
	case ',':
		return COMMA, pos, ""
	}

	return ILLEGAL, pos, string(ch0)
}