in core/src/main/java/com/alibaba/druid/sql/parser/Lexer.java [1252:1520]
public final void nextToken() {
startPos = pos;
bufPos = 0;
if (comments != null && comments.size() > 0) {
comments = null;
}
this.lines = 0;
int startLine = line;
for (; ; ) {
if (isWhitespace(ch)) {
if (ch == '\n') {
line++;
lines = line - startLine;
}
ch = charAt(++pos);
startPos = pos;
continue;
}
if (ch == EOI && pos < text.length()) {
ch = charAt(++pos);
continue;
}
if (ch == '$') {
scanVariable();
return;
}
if (isFirstIdentifierChar(ch)) {
if (ch == '(') {
scanChar();
token = LPAREN;
return;
} else if (ch == ')') {
scanChar();
token = RPAREN;
return;
}
if (ch == 'N' || ch == 'n') {
if (charAt(pos + 1) == '\'') {
++pos;
ch = '\'';
scanString();
token = Token.LITERAL_NCHARS;
return;
}
}
if (ch == '—' && charAt(pos + 1) == '—' && charAt(pos + 2) == '\n') {
pos += 3;
ch = charAt(pos);
continue;
}
scanIdentifier();
return;
}
switch (ch) {
case '0':
if (charAt(pos + 1) == 'x') {
scanChar();
scanChar();
scanHexaDecimal();
} else {
scanNumber();
}
return;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
scanNumber();
return;
case ',':
case ',':
scanChar();
token = COMMA;
return;
case '(':
case '(':
scanChar();
token = LPAREN;
return;
case ')':
case ')':
scanChar();
token = RPAREN;
return;
case '[':
scanLBracket();
return;
case ']':
scanChar();
token = RBRACKET;
return;
case '{':
scanChar();
token = LBRACE;
return;
case '}':
scanChar();
token = RBRACE;
return;
case ':':
scanChar();
if (ch == '=') {
scanChar();
token = COLONEQ;
} else if (ch == ':') {
scanChar();
token = COLONCOLON;
} else {
if (isEnabled(SQLParserFeature.TDDLHint) || dialectFeatureEnabled(NextTokenColon)) {
token = COLON;
return;
}
unscan();
scanVariable();
}
return;
case '#':
scanSharp();
if ((token == Token.LINE_COMMENT || token == Token.MULTI_LINE_COMMENT) && skipComment) {
bufPos = 0;
continue;
}
return;
case '.':
scanChar();
if (isDigit(ch)
&& (pos == 1 || token != IDENTIFIER)
) {
unscan();
scanNumber();
return;
} else if (ch == '.') {
scanChar();
if (ch == '.') {
scanChar();
token = Token.DOTDOTDOT;
} else {
token = Token.DOTDOT;
}
} else {
token = Token.DOT;
}
return;
case '\'':
scanString();
return;
case '\"':
scanAlias();
return;
case '*':
scanChar();
token = Token.STAR;
return;
case '?':
scanChar();
nextTokenQues();
return;
case ';':
scanChar();
token = Token.SEMI;
return;
case '`':
throw new ParserException("TODO. " + info()); // TODO
case '@':
scanVariable_at();
return;
case '-':
char next = charAt(pos + 1);
if (next == '-') {
scanComment();
if ((token == Token.LINE_COMMENT || token == Token.MULTI_LINE_COMMENT) && skipComment) {
bufPos = 0;
continue;
}
} else if (next >= '0' && next <= '9') {
if (token == null) {
scanNumber();
return;
}
switch (token) {
case COMMA:
case LPAREN:
case WITH:
case BY:
scanNumber();
break;
default:
scanOperator();
break;
}
} else {
scanOperator();
}
return;
case '/':
char nextChar = charAt(pos + 1);
if (nextChar == '/'
|| nextChar == '*'
|| (nextChar == '!' && isEnabled(SQLParserFeature.TDDLHint))) {
scanComment();
if ((token == Token.LINE_COMMENT || token == Token.MULTI_LINE_COMMENT) && skipComment) {
bufPos = 0;
continue;
}
} else if (nextChar == ' ' && charAt(pos + 2) == '*') {
scanComment();
if ((token == Token.LINE_COMMENT || token == Token.MULTI_LINE_COMMENT) && skipComment) {
bufPos = 0;
continue;
}
} else if (nextChar == ' ' && charAt(pos + 2) == ' ' && charAt(pos + 3) == '*') {
scanComment();
if ((token == Token.LINE_COMMENT || token == Token.MULTI_LINE_COMMENT) && skipComment) {
bufPos = 0;
continue;
}
} else {
token = Token.SLASH;
scanChar();
}
return;
default:
if (Character.isLetter(ch)) {
scanIdentifier();
return;
}
if (isOperator(ch)) {
scanOperator();
return;
}
if (ch == '\\' && charAt(pos + 1) == 'N'
&& dialectFeatureEnabled(NextTokenPrefixN)) {
scanChar();
scanChar();
token = Token.NULL;
return;
}
// QS_TODO ?
if (isEOF()) { // JLS
token = EOF;
} else {
lexError("illegal.char", String.valueOf((int) ch));
scanChar();
}
return;
}
}
}