提交 ec1ac49a 编写于 作者: T terrymanu

refactor

上级 b6210225
......@@ -20,7 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.parser.sql.dialect.mysql.lexer;
import com.dangdang.ddframe.rdb.sharding.parser.sql.lexer.Keyword;
/**
* MySQL关键词.
* MySQL词法关键词.
*
* @author zhangliang
*/
......
......@@ -35,16 +35,16 @@ public final class MySQLLexer extends Lexer {
@Override
protected boolean isHintBegin() {
return '/' == currentChar() && '*' == currentCharAt(1) && '!' == currentCharAt(2);
return '/' == getCurrentChar(0) && '*' == getCurrentChar(1) && '!' == getCurrentChar(2);
}
@Override
protected boolean isCommentBegin() {
return '#' == currentChar() || super.isCommentBegin();
return '#' == getCurrentChar(0) || super.isCommentBegin();
}
@Override
protected boolean isVariableBegin() {
return '@' == currentChar();
return '@' == getCurrentChar(0);
}
}
......@@ -42,11 +42,11 @@ public class MySQLExprParser extends SQLExprParser {
public LimitContext parseLimit(final int parametersIndex, final SelectSQLContext sqlContext) {
skipIfEqual(MySQLKeyword.LIMIT);
int valueIndex = -1;
int valueBeginPosition = getLexer().getToken().getEndPosition();
int valueBeginPosition = getLexer().getCurrentToken().getEndPosition();
int value;
boolean isParameterForValue = false;
if (equal(Literals.INT)) {
value = Integer.parseInt(getLexer().getToken().getLiterals());
value = Integer.parseInt(getLexer().getCurrentToken().getLiterals());
valueBeginPosition = valueBeginPosition - (value + "").length();
} else if (equal(Symbol.QUESTION)) {
valueIndex = parametersIndex;
......@@ -73,12 +73,12 @@ public class MySQLExprParser extends SQLExprParser {
}
private LimitContext getLimitContextWithComma(final int parametersIndex, final SelectSQLContext sqlContext, final int valueIndex, final int valueBeginPosition, final int value, final boolean isParameterForValue) {
int rowCountBeginPosition = getLexer().getToken().getEndPosition();
int rowCountBeginPosition = getLexer().getCurrentToken().getEndPosition();
int rowCount;
int rowCountIndex = -1;
boolean isParameterForRowCount = false;
if (equal(Literals.INT)) {
rowCount = Integer.parseInt(getLexer().getToken().getLiterals());
rowCount = Integer.parseInt(getLexer().getCurrentToken().getLiterals());
rowCountBeginPosition = rowCountBeginPosition - (rowCount + "").length();
} else if (equal(Symbol.QUESTION)) {
rowCountIndex = -1 == valueIndex ? parametersIndex : valueIndex + 1;
......@@ -102,12 +102,12 @@ public class MySQLExprParser extends SQLExprParser {
}
private LimitContext getLimitContextWithOffset(final int parametersIndex, final SelectSQLContext sqlContext, final int valueIndex, final int valueBeginPosition, final int value, final boolean isParameterForValue) {
int offsetBeginPosition = getLexer().getToken().getEndPosition();
int offsetBeginPosition = getLexer().getCurrentToken().getEndPosition();
int offset;
int offsetIndex = -1;
boolean isParameterForOffset = false;
if (equal(Literals.INT)) {
offset = Integer.parseInt(getLexer().getToken().getLiterals());
offset = Integer.parseInt(getLexer().getCurrentToken().getLiterals());
offsetBeginPosition = offsetBeginPosition - (offset + "").length();
} else if (equal(Symbol.QUESTION)) {
offsetIndex = -1 == valueIndex ? parametersIndex : valueIndex + 1;
......
......@@ -65,11 +65,11 @@ public final class MySQLInsertParser extends AbstractInsertParser {
getExprParser().accept(Symbol.EQ);
SQLExpr sqlExpr;
if (getExprParser().equal(Literals.INT)) {
sqlExpr = new SQLNumberExpr(Integer.parseInt(getExprParser().getLexer().getToken().getLiterals()));
sqlExpr = new SQLNumberExpr(Integer.parseInt(getExprParser().getLexer().getCurrentToken().getLiterals()));
} else if (getExprParser().equal(Literals.FLOAT)) {
sqlExpr = new SQLNumberExpr(Double.parseDouble(getExprParser().getLexer().getToken().getLiterals()));
sqlExpr = new SQLNumberExpr(Double.parseDouble(getExprParser().getLexer().getCurrentToken().getLiterals()));
} else if (getExprParser().equal(Literals.CHARS)) {
sqlExpr = new SQLCharExpr(getExprParser().getLexer().getToken().getLiterals());
sqlExpr = new SQLCharExpr(getExprParser().getLexer().getCurrentToken().getLiterals());
} else if (getExprParser().equal(DefaultKeyword.NULL)) {
sqlExpr = new SQLIgnoreExpr();
} else if (getExprParser().equal(Symbol.QUESTION)) {
......
......@@ -54,7 +54,7 @@ public class MySQLSelectParser extends AbstractSelectParser {
getSqlContext().setLimitContext(((MySQLExprParser) getExprParser()).parseLimit(getParametersIndex(), getSqlContext()));
}
if (getExprParser().equal(DefaultKeyword.PROCEDURE)) {
throw new ParserUnsupportedException(getExprParser().getLexer().getToken().getType());
throw new ParserUnsupportedException(getExprParser().getLexer().getCurrentToken().getType());
}
queryRest();
}
......
......@@ -20,7 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.parser.sql.dialect.oracle.lexer;
import com.dangdang.ddframe.rdb.sharding.parser.sql.lexer.Keyword;
/**
* Oracle关键词.
* Oracle词法关键词.
*
* @author zhangliang
*/
......
......@@ -35,6 +35,6 @@ public final class OracleLexer extends Lexer {
@Override
protected boolean isHintBegin() {
return '/' == currentChar() && '*' == currentCharAt(1) && '+' == currentCharAt(2);
return '/' == getCurrentChar(0) && '*' == getCurrentChar(1) && '+' == getCurrentChar(2);
}
}
......@@ -49,7 +49,7 @@ public class OracleExprParser extends SQLExprParser {
if (skipIfEqual(OracleKeyword.NULLS)) {
getLexer().nextToken();
if (!skipIfEqual(OracleKeyword.FIRST, OracleKeyword.LAST)) {
throw new ParserUnsupportedException(getLexer().getToken().getType());
throw new ParserUnsupportedException(getLexer().getCurrentToken().getType());
}
}
return result;
......
......@@ -62,7 +62,7 @@ public class OracleSelectParser extends AbstractSelectParser {
private void skipInto() {
if (getExprParser().equal(DefaultKeyword.INTO)) {
throw new ParserUnsupportedException(getExprParser().getLexer().getToken().getType());
throw new ParserUnsupportedException(getExprParser().getLexer().getCurrentToken().getType());
}
}
......@@ -167,7 +167,7 @@ public class OracleSelectParser extends AbstractSelectParser {
}
private void skipModelColumnClause() {
throw new ParserUnsupportedException(getExprParser().getLexer().getToken().getType());
throw new ParserUnsupportedException(getExprParser().getLexer().getCurrentToken().getType());
}
@Override
......@@ -214,7 +214,7 @@ public class OracleSelectParser extends AbstractSelectParser {
throw new UnsupportedOperationException("Cannot support subquery");
}
if (getExprParser().equal(DefaultKeyword.SELECT)) {
throw new ParserUnsupportedException(getExprParser().getLexer().getToken().getType());
throw new ParserUnsupportedException(getExprParser().getLexer().getCurrentToken().getType());
}
if (getExprParser().skipIfEqual(OracleKeyword.ONLY)) {
getExprParser().skipIfEqual(Symbol.LEFT_PAREN);
......
......@@ -20,7 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.parser.sql.dialect.postgresql.lexer;
import com.dangdang.ddframe.rdb.sharding.parser.sql.lexer.Keyword;
/**
* PostgreSQL关键词.
* PostgreSQL词法关键词.
*
* @author zhangliang
*/
......
......@@ -20,7 +20,7 @@ package com.dangdang.ddframe.rdb.sharding.parser.sql.dialect.sqlserver.lexer;
import com.dangdang.ddframe.rdb.sharding.parser.sql.lexer.Keyword;
/**
* SQLServer关键词.
* SQLServer词法关键词.
*
* @author zhangliang
*/
......
......@@ -35,12 +35,12 @@ public final class SQLServerLexer extends Lexer {
@Override
protected boolean isHintBegin() {
return '/' == currentChar() && '*' == currentCharAt(1) && '!' == currentCharAt(2);
return '/' == getCurrentChar(0) && '*' == getCurrentChar(1) && '!' == getCurrentChar(2);
}
@Override
protected boolean isVariableBegin() {
return '@' == currentChar();
return '@' == getCurrentChar(0);
}
@Override
......
......@@ -78,7 +78,7 @@ public class SQLServerExprParser extends SQLExprParser {
int offset;
int offsetIndex = -1;
if (equal(Literals.INT)) {
offset = Integer.parseInt(getLexer().getToken().getLiterals());
offset = Integer.parseInt(getLexer().getCurrentToken().getLiterals());
} else if (equal(Symbol.QUESTION)) {
offsetIndex = getParametersIndex();
offset = (int) getParameters().get(offsetIndex);
......@@ -94,7 +94,7 @@ public class SQLServerExprParser extends SQLExprParser {
int rowCountIndex = -1;
getLexer().nextToken();
if (equal(Literals.INT)) {
rowCount = Integer.parseInt(getLexer().getToken().getLiterals());
rowCount = Integer.parseInt(getLexer().getCurrentToken().getLiterals());
} else if (equal(Symbol.QUESTION)) {
rowCountIndex = getParametersIndex();
rowCount = (int) getParameters().get(rowCountIndex);
......
......@@ -51,7 +51,7 @@ public class SQLServerSelectParser extends AbstractSelectParser {
parseSelectList();
}
if (getExprParser().equal(DefaultKeyword.INTO)) {
throw new ParserUnsupportedException(getExprParser().getLexer().getToken().getType());
throw new ParserUnsupportedException(getExprParser().getLexer().getCurrentToken().getType());
}
parseFrom();
parseWhere();
......@@ -87,7 +87,7 @@ public class SQLServerSelectParser extends AbstractSelectParser {
}
}
} else {
throw new ParserUnsupportedException(getExprParser().getLexer().getToken().getType());
throw new ParserUnsupportedException(getExprParser().getLexer().getCurrentToken().getType());
}
}
}
......@@ -45,4 +45,9 @@ final class CharType {
static boolean isDigital(final char ch) {
return ch >= '0' && ch <= '9';
}
static boolean isSymbol(final char ch) {
return '(' == ch || ')' == ch || '[' == ch || ']' == ch || '{' == ch || '}' == ch || '+' == ch || '-' == ch || '*' == ch || '/' == ch || '%' == ch || '^' == ch || '=' == ch
|| '>' == ch || '<' == ch || '~' == ch || '!' == ch || '?' == ch || '&' == ch || '|' == ch || '.' == ch || ':' == ch || '#' == ch || ',' == ch || ';' == ch;
}
}
......@@ -42,12 +42,12 @@ public final class Dictionary {
}
}
TokenType getToken(final String literals, final TokenType defaultTokenType) {
TokenType findTokenType(final String literals, final TokenType defaultTokenType) {
String key = null == literals ? null : literals.toUpperCase();
return tokens.containsKey(key) ? tokens.get(key) : defaultTokenType;
}
TokenType getToken(final String literals) {
TokenType findTokenType(final String literals) {
String key = null == literals ? null : literals.toUpperCase();
if (tokens.containsKey(key)) {
return tokens.get(key);
......
......@@ -36,7 +36,7 @@ public class Lexer {
private int offset;
@Getter
private Token token;
private Token currentToken;
/**
* 分析下一个词法标记.
......@@ -44,25 +44,25 @@ public class Lexer {
public final void nextToken() {
skipIgnoredToken();
if (isVariableBegin()) {
token = new Tokenizer(input, dictionary, offset).scanVariable();
} else if (isSupportNChars() && isNCharBegin()) {
token = new Tokenizer(input, dictionary, ++offset).scanChars();
currentToken = new Tokenizer(input, dictionary, offset).scanVariable();
} else if (isNCharBegin()) {
currentToken = new Tokenizer(input, dictionary, ++offset).scanChars();
} else if (isIdentifierBegin()) {
token = new Tokenizer(input, dictionary, offset).scanIdentifier();
currentToken = new Tokenizer(input, dictionary, offset).scanIdentifier();
} else if (isHexDecimalBegin()) {
token = new Tokenizer(input, dictionary, offset).scanHexDecimal();
currentToken = new Tokenizer(input, dictionary, offset).scanHexDecimal();
} else if (isNumberBegin()) {
token = new Tokenizer(input, dictionary, offset).scanNumber();
currentToken = new Tokenizer(input, dictionary, offset).scanNumber();
} else if (isSymbolBegin()) {
token = new Tokenizer(input, dictionary, offset).scanSymbol();
currentToken = new Tokenizer(input, dictionary, offset).scanSymbol();
} else if (isCharsBegin()) {
token = new Tokenizer(input, dictionary, offset).scanChars();
currentToken = new Tokenizer(input, dictionary, offset).scanChars();
} else if (isEnd()) {
token = new Token(Assist.END, "", offset);
currentToken = new Token(Assist.END, "", offset);
} else {
token = new Token(Assist.ERROR, "", offset);
currentToken = new Token(Assist.ERROR, "", offset);
}
offset = token.getEndPosition();
offset = currentToken.getEndPosition();
}
private void skipIgnoredToken() {
......@@ -82,8 +82,8 @@ public class Lexer {
}
protected boolean isCommentBegin() {
char current = currentChar();
char next = currentCharAt(1);
char current = getCurrentChar(0);
char next = getCurrentChar(1);
return '/' == current && '/' == next || '-' == current && '-' == next || '/' == current && '*' == next;
}
......@@ -96,11 +96,11 @@ public class Lexer {
}
private boolean isNCharBegin() {
return 'N' == currentChar() && '\'' == currentCharAt(1);
return isSupportNChars() && 'N' == getCurrentChar(0) && '\'' == getCurrentChar(1);
}
private boolean isIdentifierBegin() {
return isIdentifierBegin(currentChar());
return isIdentifierBegin(getCurrentChar(0));
}
private boolean isIdentifierBegin(final char ch) {
......@@ -108,30 +108,26 @@ public class Lexer {
}
private boolean isHexDecimalBegin() {
return '0' == currentChar() && 'x' == currentCharAt(1);
return '0' == getCurrentChar(0) && 'x' == getCurrentChar(1);
}
private boolean isNumberBegin() {
return CharType.isDigital(currentChar()) || ('.' == currentChar() && CharType.isDigital(currentCharAt(1)) && !isIdentifierBegin(currentCharAt(-1)));
return CharType.isDigital(getCurrentChar(0)) || ('.' == getCurrentChar(0) && CharType.isDigital(getCurrentChar(1)) && !isIdentifierBegin(getCurrentChar(-1)));
}
private boolean isSymbolBegin() {
return Symbol.isSymbol(currentChar());
return CharType.isSymbol(getCurrentChar(0));
}
private boolean isCharsBegin() {
return '\'' == currentChar() || '\"' == currentChar();
return '\'' == getCurrentChar(0) || '\"' == getCurrentChar(0);
}
private boolean isEnd() {
return offset >= input.length();
}
protected final char currentChar() {
return currentCharAt(0);
}
protected final char currentCharAt(final int offset) {
protected final char getCurrentChar(final int offset) {
return this.offset + offset >= input.length() ? (char) CharType.EOI : input.charAt(this.offset + offset);
}
}
......@@ -17,13 +17,11 @@
package com.dangdang.ddframe.rdb.sharding.parser.sql.lexer;
import com.google.common.collect.Sets;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 词法符号标记.
......@@ -77,13 +75,10 @@ public enum Symbol implements TokenType {
private static Map<String, Symbol> symbols = new HashMap<>(128);
private static Set<Character> symbolChars;
static {
for (Symbol each : Symbol.values()) {
symbols.put(each.getLiterals(), each);
}
symbolChars = Sets.newHashSet('(', ')', '[', ']', '{', '}', '+', '-', '*', '/', '%', '^', '=', '>', '<', '~', '!', '?', '&', '|', '.', ':', '#', ',', ';');
}
private final String literals;
......@@ -97,14 +92,4 @@ public enum Symbol implements TokenType {
public static Symbol literalsOf(final String literals) {
return symbols.get(literals);
}
/**
* 判断字符是否是词法符号.
*
* @param ch 待判断的字符
* @return 是否为词法符号
*/
public static boolean isSymbol(final char ch) {
return symbolChars.contains(ch);
}
}
......@@ -27,6 +27,16 @@ import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
final class Tokenizer {
private static final int MYSQL_SPECIAL_COMMENT_BEGIN_SYMBOL_LENGTH = 1;
private static final int COMMENT_BEGIN_SYMBOL_LENGTH = 2;
private static final int HINT_BEGIN_SYMBOL_LENGTH = 3;
private static final int COMMENT_AND_HINT_END_SYMBOL_LENGTH = 2;
private static final int HEX_BEGIN_SYMBOL_LENGTH = 2;
private final String input;
private final Dictionary dictionary;
......@@ -42,13 +52,13 @@ final class Tokenizer {
}
int skipComment() {
char currentChar = charAt(offset);
char nextChar = charAt(offset + 1);
if (isSingleLineCommentBegin(currentChar, nextChar)) {
return skipSingleLineComment(2);
} else if ('#' == currentChar) {
return skipSingleLineComment(1);
} else if (isMultipleLineCommentBegin(currentChar, nextChar)) {
char current = charAt(offset);
char next = charAt(offset + 1);
if (isSingleLineCommentBegin(current, next)) {
return skipSingleLineComment(COMMENT_BEGIN_SYMBOL_LENGTH);
} else if ('#' == current) {
return skipSingleLineComment(MYSQL_SPECIAL_COMMENT_BEGIN_SYMBOL_LENGTH);
} else if (isMultipleLineCommentBegin(current, next)) {
return skipMultiLineComment();
}
return offset;
......@@ -58,8 +68,8 @@ final class Tokenizer {
return '/' == ch && '/' == next || '-' == ch && '-' == next;
}
private int skipSingleLineComment(final int commentFlagLength) {
int length = commentFlagLength;
private int skipSingleLineComment(final int commentSymbolLength) {
int length = commentSymbolLength;
while (!CharType.isEndOfInput(charAt(offset + length)) && '\n' != charAt(offset + length)) {
length++;
}
......@@ -71,22 +81,22 @@ final class Tokenizer {
}
private int skipMultiLineComment() {
return untilCommentAndHintTerminateSign(2);
return untilCommentAndHintTerminateSign(COMMENT_BEGIN_SYMBOL_LENGTH);
}
int skipHint() {
return untilCommentAndHintTerminateSign(3);
return untilCommentAndHintTerminateSign(HINT_BEGIN_SYMBOL_LENGTH);
}
private int untilCommentAndHintTerminateSign(final int beginSignLength) {
int length = beginSignLength;
private int untilCommentAndHintTerminateSign(final int beginSymbolLength) {
int length = beginSymbolLength;
while (!isMultipleLineCommentEnd(charAt(offset + length), charAt(offset + length + 1))) {
if (CharType.isEndOfInput(charAt(offset + length))) {
throw new UnterminatedCharException("*/");
}
length++;
}
return offset + length + 2;
return offset + length + COMMENT_AND_HINT_END_SYMBOL_LENGTH;
}
private boolean isMultipleLineCommentEnd(final char ch, final char next) {
......@@ -121,7 +131,7 @@ final class Tokenizer {
if (isAmbiguousIdentifier(literals)) {
return new Token(processAmbiguousIdentifier(offset + length, literals), literals, offset + length);
}
return new Token(dictionary.getToken(literals, Literals.IDENTIFIER), literals, offset + length);
return new Token(dictionary.findTokenType(literals, Literals.IDENTIFIER), literals, offset + length);
}
private int getLengthUntilTerminatedChar(final char terminatedChar) {
......@@ -135,8 +145,7 @@ final class Tokenizer {
}
length++;
}
length++;
return length;
return length + 1;
}
private boolean hasEscapeChar(final char charIdentifier, final int offset) {
......@@ -157,13 +166,13 @@ final class Tokenizer {
i++;
}
if (DefaultKeyword.BY.name().equalsIgnoreCase(String.valueOf(new char[] {charAt(offset + i), charAt(offset + i + 1)}))) {
return dictionary.getToken(literals);
return dictionary.findTokenType(literals);
}
return Literals.IDENTIFIER;
}
Token scanHexDecimal() {
int length = 2;
int length = HEX_BEGIN_SYMBOL_LENGTH;
if ('-' == charAt(offset + length)) {
length++;
}
......@@ -185,11 +194,6 @@ final class Tokenizer {
length += getDigitalLength(offset + length);
boolean isFloat = false;
if ('.' == charAt(offset + length)) {
// TODO 待确认 数字后面加两个点表示什么
if ('.' == charAt(offset + length + 1)) {
length++;
return new Token(Literals.INT, input.substring(offset, offset + length), offset + length);
}
isFloat = true;
length++;
length += getDigitalLength(offset + length);
......@@ -238,7 +242,7 @@ final class Tokenizer {
Token scanSymbol() {
int length = 0;
while (Symbol.isSymbol(charAt(offset + length))) {
while (CharType.isSymbol(charAt(offset + length))) {
length++;
}
String literals = input.substring(offset, offset + length);
......
......@@ -76,9 +76,9 @@ public abstract class AbstractInsertParser {
if (exprParser.equal(DefaultKeyword.SELECT, Symbol.LEFT_PAREN)) {
throw new UnsupportedOperationException("Cannot support subquery");
}
if (getValuesKeywords().contains(exprParser.getLexer().getToken().getType())) {
if (getValuesKeywords().contains(exprParser.getLexer().getCurrentToken().getType())) {
parseValues(columns);
} else if (getCustomizedInsertKeywords().contains(exprParser.getLexer().getToken().getType())) {
} else if (getCustomizedInsertKeywords().contains(exprParser.getLexer().getCurrentToken().getType())) {
parseCustomizedInsert();
}
return sqlContext;
......@@ -89,8 +89,8 @@ public abstract class AbstractInsertParser {
}
private void parseInto() {
if (getUnsupportedKeywords().contains(exprParser.getLexer().getToken().getType())) {
throw new ParserUnsupportedException(exprParser.getLexer().getToken().getType());
if (getUnsupportedKeywords().contains(exprParser.getLexer().getCurrentToken().getType())) {
throw new ParserUnsupportedException(exprParser.getLexer().getCurrentToken().getType());
}
exprParser.skipUntil(DefaultKeyword.INTO);
exprParser.getLexer().nextToken();
......@@ -99,7 +99,7 @@ public abstract class AbstractInsertParser {
}
private void skipBetweenTableAndValues() {
while (getSkippedKeywordsBetweenTableAndValues().contains(exprParser.getLexer().getToken().getType())) {
while (getSkippedKeywordsBetweenTableAndValues().contains(exprParser.getLexer().getCurrentToken().getType())) {
exprParser.getLexer().nextToken();
if (exprParser.equal(Symbol.LEFT_PAREN)) {
exprParser.skipParentheses();
......@@ -120,7 +120,7 @@ public abstract class AbstractInsertParser {
result.add(getColumn(autoIncrementColumns));
exprParser.getLexer().nextToken();
} while (!exprParser.equal(Symbol.RIGHT_PAREN) && !exprParser.equal(Assist.END));
ItemsToken itemsToken = new ItemsToken(exprParser.getLexer().getToken().getEndPosition() - exprParser.getLexer().getToken().getLiterals().length());
ItemsToken itemsToken = new ItemsToken(exprParser.getLexer().getCurrentToken().getEndPosition() - exprParser.getLexer().getCurrentToken().getLiterals().length());
for (String each : autoIncrementColumns) {
itemsToken.getItems().add(each);
result.add(new Condition.Column(each, sqlContext.getTables().get(0).getName(), true));
......@@ -134,7 +134,7 @@ public abstract class AbstractInsertParser {
}
protected final Condition.Column getColumn(final Collection<String> autoIncrementColumns) {
String columnName = SQLUtil.getExactlyValue(exprParser.getLexer().getToken().getLiterals());
String columnName = SQLUtil.getExactlyValue(exprParser.getLexer().getCurrentToken().getLiterals());
if (autoIncrementColumns.contains(columnName)) {
autoIncrementColumns.remove(columnName);
}
......@@ -158,7 +158,7 @@ public abstract class AbstractInsertParser {
do {
sqlExprs.add(exprParser.parseExpr());
} while (exprParser.skipIfEqual(Symbol.COMMA));
ItemsToken itemsToken = new ItemsToken(exprParser.getLexer().getToken().getEndPosition() - exprParser.getLexer().getToken().getLiterals().length());
ItemsToken itemsToken = new ItemsToken(exprParser.getLexer().getCurrentToken().getEndPosition() - exprParser.getLexer().getCurrentToken().getLiterals().length());
int count = 0;
for (Condition.Column each : columns) {
if (each.isAutoIncrement()) {
......
......@@ -105,12 +105,12 @@ public abstract class AbstractSelectParser {
}
index++;
} while (getExprParser().skipIfEqual(Symbol.COMMA));
sqlContext.setSelectListLastPosition(getExprParser().getLexer().getToken().getEndPosition() - getExprParser().getLexer().getToken().getLiterals().length());
sqlContext.setSelectListLastPosition(getExprParser().getLexer().getCurrentToken().getEndPosition() - getExprParser().getLexer().getCurrentToken().getLiterals().length());
}
protected void queryRest() {
if (getExprParser().equal(DefaultKeyword.UNION, DefaultKeyword.EXCEPT, DefaultKeyword.INTERSECT, DefaultKeyword.MINUS)) {
throw new ParserUnsupportedException(getExprParser().getLexer().getToken().getType());
throw new ParserUnsupportedException(getExprParser().getLexer().getCurrentToken().getType());
}
}
......@@ -135,7 +135,7 @@ public abstract class AbstractSelectParser {
}
getExprParser().getLexer().nextToken();
}
while (getExprParser().equal(DefaultKeyword.WITH) || getExprParser().getLexer().getToken().getLiterals().equalsIgnoreCase("ROLLUP")) {
while (getExprParser().equal(DefaultKeyword.WITH) || getExprParser().getLexer().getCurrentToken().getLiterals().equalsIgnoreCase("ROLLUP")) {
getExprParser().getLexer().nextToken();
}
if (getExprParser().skipIfEqual(DefaultKeyword.HAVING)) {
......@@ -178,8 +178,8 @@ public abstract class AbstractSelectParser {
}
protected final void parseTableFactor() {
int beginPosition = getExprParser().getLexer().getToken().getEndPosition() - getExprParser().getLexer().getToken().getLiterals().length();
String literals = getExprParser().getLexer().getToken().getLiterals();
int beginPosition = getExprParser().getLexer().getCurrentToken().getEndPosition() - getExprParser().getLexer().getCurrentToken().getLiterals().length();
String literals = getExprParser().getLexer().getCurrentToken().getLiterals();
getExprParser().getLexer().nextToken();
if (getExprParser().skipIfEqual(Symbol.DOT)) {
getExprParser().getLexer().nextToken();
......@@ -196,9 +196,9 @@ public abstract class AbstractSelectParser {
parseTable();
if (getExprParser().skipIfEqual(DefaultKeyword.ON)) {
do {
parseTableCondition(getExprParser().getLexer().getToken().getEndPosition());
parseTableCondition(getExprParser().getLexer().getCurrentToken().getEndPosition());
getExprParser().accept(Symbol.EQ);
parseTableCondition(getExprParser().getLexer().getToken().getEndPosition() - getExprParser().getLexer().getToken().getLiterals().length());
parseTableCondition(getExprParser().getLexer().getCurrentToken().getEndPosition() - getExprParser().getLexer().getCurrentToken().getLiterals().length());
} while (getExprParser().skipIfEqual(DefaultKeyword.AND));
} else if (getExprParser().skipIfEqual(DefaultKeyword.USING)) {
getExprParser().skipParentheses();
......
......@@ -78,8 +78,8 @@ public abstract class AbstractUpdateParser {
if (exprParser.equal(Symbol.LEFT_PAREN)) {
exprParser.skipParentheses();
} else {
int beginPosition = exprParser.getLexer().getToken().getEndPosition();
String literals = exprParser.getLexer().getToken().getLiterals();
int beginPosition = exprParser.getLexer().getCurrentToken().getEndPosition();
String literals = exprParser.getLexer().getCurrentToken().getLiterals();
exprParser.getLexer().nextToken();
String tableName = sqlContext.getTables().get(0).getName();
if (exprParser.skipIfEqual(Symbol.DOT)) {
......
......@@ -46,22 +46,22 @@ public class Parser {
public final String skipParentheses() {
StringBuilder result = new StringBuilder("");
int count = 0;
if (Symbol.LEFT_PAREN == getLexer().getToken().getType()) {
final int beginPosition = getLexer().getToken().getEndPosition();
if (Symbol.LEFT_PAREN == getLexer().getCurrentToken().getType()) {
final int beginPosition = getLexer().getCurrentToken().getEndPosition();
result.append(Symbol.LEFT_PAREN.getLiterals());
getLexer().nextToken();
while (true) {
if (Assist.END == getLexer().getToken().getType() || (Symbol.RIGHT_PAREN == getLexer().getToken().getType() && 0 == count)) {
if (Assist.END == getLexer().getCurrentToken().getType() || (Symbol.RIGHT_PAREN == getLexer().getCurrentToken().getType() && 0 == count)) {
break;
}
if (Symbol.LEFT_PAREN == getLexer().getToken().getType()) {
if (Symbol.LEFT_PAREN == getLexer().getCurrentToken().getType()) {
count++;
} else if (Symbol.RIGHT_PAREN == getLexer().getToken().getType()) {
} else if (Symbol.RIGHT_PAREN == getLexer().getCurrentToken().getType()) {
count--;
}
getLexer().nextToken();
}
result.append(getLexer().getInput().substring(beginPosition, getLexer().getToken().getEndPosition()));
result.append(getLexer().getInput().substring(beginPosition, getLexer().getCurrentToken().getEndPosition()));
getLexer().nextToken();
}
return result.toString();
......@@ -74,7 +74,7 @@ public class Parser {
* @param tokenType 待判断的标记类型
*/
public final void accept(final TokenType tokenType) {
if (lexer.getToken().getType() != tokenType) {
if (lexer.getCurrentToken().getType() != tokenType) {
throw new ParserException(lexer, tokenType);
}
lexer.nextToken();
......@@ -88,7 +88,7 @@ public class Parser {
*/
public final boolean equal(final TokenType... tokenTypes) {
for (TokenType each : tokenTypes) {
if (each == lexer.getToken().getType()) {
if (each == lexer.getCurrentToken().getType()) {
return true;
}
}
......@@ -119,7 +119,7 @@ public class Parser {
public final void skipUntil(final TokenType... tokenTypes) {
Set<TokenType> tokenTypeSet = Sets.newHashSet(tokenTypes);
tokenTypeSet.add(Assist.END);
while (!tokenTypeSet.contains(lexer.getToken().getType())) {
while (!tokenTypeSet.contains(lexer.getCurrentToken().getType())) {
lexer.nextToken();
}
}
......
......@@ -29,10 +29,10 @@ public class ParserException extends RuntimeException {
private static final String TOKEN_ERROR_MESSAGE = "SQL syntax error, token is '%s', literals is '%s'.";
public ParserException(final Lexer lexer, final TokenType expectedTokenType) {
super(String.format(UNMATCH_MESSAGE, expectedTokenType, lexer.getToken().getType(), lexer.getToken().getLiterals()));
super(String.format(UNMATCH_MESSAGE, expectedTokenType, lexer.getCurrentToken().getType(), lexer.getCurrentToken().getLiterals()));
}
public ParserException(final Lexer lexer) {
super(String.format(TOKEN_ERROR_MESSAGE, lexer.getToken().getType(), lexer.getToken().getLiterals()));
super(String.format(TOKEN_ERROR_MESSAGE, lexer.getCurrentToken().getType(), lexer.getCurrentToken().getLiterals()));
}
}
......@@ -82,13 +82,13 @@ public class SQLExprParser extends Parser {
if (equal(Symbol.LEFT_PAREN)) {
return Optional.absent();
}
String result = SQLUtil.getExactlyValue(getLexer().getToken().getLiterals());
String result = SQLUtil.getExactlyValue(getLexer().getCurrentToken().getLiterals());
getLexer().nextToken();
return Optional.of(result);
}
// TODO 增加哪些数据库识别哪些关键字作为别名的配置
if (equal(Literals.IDENTIFIER, Literals.CHARS, DefaultKeyword.USER, DefaultKeyword.END, DefaultKeyword.CASE, DefaultKeyword.KEY, DefaultKeyword.INTERVAL, DefaultKeyword.CONSTRAINT)) {
String result = SQLUtil.getExactlyValue(getLexer().getToken().getLiterals());
String result = SQLUtil.getExactlyValue(getLexer().getCurrentToken().getLiterals());
getLexer().nextToken();
return Optional.of(result);
}
......@@ -147,11 +147,11 @@ public class SQLExprParser extends Parser {
hasParentheses = true;
}
TableContext tableContext;
final int beginPosition = getLexer().getToken().getEndPosition() - getLexer().getToken().getLiterals().length();
String literals = getLexer().getToken().getLiterals();
final int beginPosition = getLexer().getCurrentToken().getEndPosition() - getLexer().getCurrentToken().getLiterals().length();
String literals = getLexer().getCurrentToken().getLiterals();
getLexer().nextToken();
if (skipIfEqual(Symbol.DOT)) {
String tableName = getLexer().getToken().getLiterals();
String tableName = getLexer().getCurrentToken().getLiterals();
getLexer().nextToken();
if (hasParentheses) {
accept(Symbol.RIGHT_PAREN);
......@@ -194,7 +194,7 @@ public class SQLExprParser extends Parser {
public final SelectItemContext parseSelectItem(final int index, final SelectSQLContext sqlContext) {
skipIfEqual(DefaultKeyword.CONNECT_BY_ROOT);
String literals = getLexer().getToken().getLiterals();
String literals = getLexer().getCurrentToken().getLiterals();
if (equal(Symbol.STAR) || Symbol.STAR.getLiterals().equals(SQLUtil.getExactlyValue(literals))) {
getLexer().nextToken();
return new CommonSelectItemContext(Symbol.STAR.getLiterals(), as(), index, true);
......@@ -206,8 +206,8 @@ public class SQLExprParser extends Parser {
// FIXME 无as的alias解析, 应该做成倒数第二个token不是运算符,倒数第一个token是Identifier或char,则为别名, 不过CommonSelectItemContext类型并不关注expression和alias
// FIXME 解析xxx.*
while (!equal(DefaultKeyword.AS) && !equal(Symbol.COMMA) && !equal(DefaultKeyword.FROM) && !equal(Assist.END)) {
String value = getLexer().getToken().getLiterals();
int position = getLexer().getToken().getEndPosition() - value.length();
String value = getLexer().getCurrentToken().getLiterals();
int position = getLexer().getCurrentToken().getEndPosition() - value.length();
expression.append(value);
getLexer().nextToken();
if (equal(Symbol.DOT)) {
......@@ -240,7 +240,7 @@ public class SQLExprParser extends Parser {
parseComparisonCondition(sqlContext, parseContext);
} while (skipIfEqual(DefaultKeyword.AND));
if (equal(DefaultKeyword.OR)) {
throw new ParserUnsupportedException(getLexer().getToken().getType());
throw new ParserUnsupportedException(getLexer().getCurrentToken().getType());
}
}
......@@ -299,7 +299,7 @@ public class SQLExprParser extends Parser {
}
public SQLExpr parseExpr(final SQLContext sqlContext) {
int beginPosition = getLexer().getToken().getEndPosition();
int beginPosition = getLexer().getCurrentToken().getEndPosition();
SQLExpr result = parseExpr();
if (result instanceof SQLPropertyExpr) {
String tableName = sqlContext.getTables().get(0).getName();
......@@ -312,12 +312,12 @@ public class SQLExprParser extends Parser {
}
public SQLExpr parseExpr() {
String literals = getLexer().getToken().getLiterals();
String literals = getLexer().getCurrentToken().getLiterals();
if (equal(Literals.IDENTIFIER)) {
SQLExpr result = getSQLExpr(SQLUtil.getExactlyValue(literals));
getLexer().nextToken();
if (skipIfEqual(Symbol.DOT)) {
String property = getLexer().getToken().getLiterals();
String property = getLexer().getCurrentToken().getLiterals();
getLexer().nextToken();
if (!equal(Symbol.PLUS, Symbol.SUB, Symbol.STAR, Symbol.SLASH)) {
return new SQLPropertyExpr(new SQLIdentifierExpr(literals), property);
......
......@@ -69,7 +69,7 @@ public final class SQLStatementParser {
if (exprParser.equal(DefaultKeyword.DELETE)) {
return SQLDeleteParserFactory.newInstance(exprParser, dbType).parse();
}
throw new ParserUnsupportedException(exprParser.getLexer().getToken().getType());
throw new ParserUnsupportedException(exprParser.getLexer().getCurrentToken().getType());
}
private void skipWith() {
......
......@@ -10,7 +10,7 @@ public final class LexerAssert {
public static void assertNextToken(final Lexer lexer, final TokenType expectedTokenType, final String expectedLiterals) {
lexer.nextToken();
Token actualToken = lexer.getToken();
Token actualToken = lexer.getCurrentToken();
assertThat(actualToken.getType(), is(expectedTokenType));
assertThat(actualToken.getLiterals(), is(expectedLiterals));
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册