in mysqlx-connector-python/lib/mysqlx/expr.py [0:0]
def lex(self) -> None:
i = 0
arrow_last = False
inside_arrow = False
while i < len(self.string):
char = self.string[i]
if char.isspace():
i += 1
continue
if char.isdigit():
token = self.lex_number(i)
elif char.isalpha() or char == "_":
token = self.lex_alpha(i, inside_arrow)
elif char == "?":
token = Token(TokenType.EROTEME, char)
elif char == ":":
token = Token(TokenType.COLON, char)
elif char == "{":
token = Token(TokenType.LCURLY, char)
elif char == "}":
token = Token(TokenType.RCURLY, char)
elif char == "+":
token = Token(TokenType.PLUS, char)
elif char == "-":
if self.next_char_is(i, ">") and not arrow_last:
token = Token(TokenType.ARROW, "->", 2)
arrow_last = True
else:
token = Token(TokenType.MINUS, char)
elif char == "*":
if self.next_char_is(i, "*"):
token = Token(TokenType.DOUBLESTAR, "**", 2)
else:
token = Token(TokenType.MUL, char)
elif char == "/":
token = Token(TokenType.DIV, char)
elif char == "$":
token = Token(TokenType.DOLLAR, char)
elif char == "%":
token = Token(TokenType.MOD, char)
elif char == "=":
if self.next_char_is(i, "="):
token = Token(TokenType.EQ, "==", 2)
else:
token = Token(TokenType.EQ, "==", 1)
elif char == "&":
if self.next_char_is(i, "&"):
token = Token(TokenType.ANDAND, "&&", 2)
else:
token = Token(TokenType.BITAND, char)
elif char == "^":
token = Token(TokenType.BITXOR, char)
elif char == "|":
if self.next_char_is(i, "|"):
token = Token(TokenType.OROR, "||", 2)
else:
token = Token(TokenType.BITOR, char)
elif char == "(":
token = Token(TokenType.LPAREN, char)
elif char == ")":
token = Token(TokenType.RPAREN, char)
elif char == "[":
token = Token(TokenType.LSQBRACKET, char)
elif char == "]":
token = Token(TokenType.RSQBRACKET, char)
elif char == "~":
token = Token(TokenType.NEG, char)
elif char == ",":
token = Token(TokenType.COMMA, char)
elif char == "!":
if self.next_char_is(i, "="):
token = Token(TokenType.NE, "!=", 2)
else:
token = Token(TokenType.BANG, char)
elif char == "<":
if self.next_char_is(i, ">"):
token = Token(TokenType.NE, "<>", 2)
elif self.next_char_is(i, "<"):
token = Token(TokenType.LSHIFT, "<<", 2)
elif self.next_char_is(i, "="):
token = Token(TokenType.LE, "<=", 2)
else:
token = Token(TokenType.LT, char)
elif char == ">":
if self.next_char_is(i, ">"):
token = Token(TokenType.RSHIFT, ">>", 2)
elif self.next_char_is(i, "="):
token = Token(TokenType.GE, ">=", 2)
else:
token = Token(TokenType.GT, char)
elif char == ".":
if self.next_char_is(i, "*"):
token = Token(TokenType.DOTSTAR, ".*", 2)
elif i + 1 < len(self.string) and self.string[i + 1].isdigit():
token = self.lex_number(i)
else:
token = Token(TokenType.DOT, char)
elif char in ("'", '"') and arrow_last:
token = Token(TokenType.QUOTE, char)
if not inside_arrow:
inside_arrow = True
else:
arrow_last = False
inside_arrow = False
elif char in ('"', "'", "`"):
token = self.lex_quoted_token(i)
else:
raise ValueError(f"Unknown character at {i}")
self.tokens.append(token)
i += token.length