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)
}