提交 a121fcd7 编写于 作者: T terrymanu

move skipParentheses from lexer to parser

上级 1c846566
......@@ -103,6 +103,6 @@ public class MySQLSelectParser extends AbstractSelectParser {
getExprParser().getLexer().accept(DefaultKeyword.BY);
}
}
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
}
}
......@@ -103,7 +103,7 @@ public class OracleSelectParser extends AbstractSelectParser {
while (getExprParser().getLexer().skipIfEqual(OracleKeyword.REFERENCE)) {
getExprParser().getLexer().nextToken();
getExprParser().getLexer().accept(DefaultKeyword.ON);
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
skipModelColumnClause();
skipCellReferenceOptions();
}
......@@ -129,9 +129,9 @@ public class OracleSelectParser extends AbstractSelectParser {
skipQueryPartitionClause();
getExprParser().getLexer().accept(OracleKeyword.DIMENSION);
getExprParser().getLexer().accept(DefaultKeyword.BY);
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
getExprParser().getLexer().accept(OracleKeyword.MEASURES);
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
skipCellReferenceOptions();
skipModelRulesClause();
}
......@@ -147,19 +147,19 @@ public class OracleSelectParser extends AbstractSelectParser {
}
}
if (getExprParser().getLexer().skipIfEqual(DefaultKeyword.ITERATE)) {
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
if (getExprParser().getLexer().skipIfEqual(DefaultKeyword.UNTIL)) {
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
}
}
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
}
private void skipQueryPartitionClause() {
if (getExprParser().getLexer().skipIfEqual(OracleKeyword.PARTITION)) {
getExprParser().getLexer().accept(DefaultKeyword.BY);
if (getExprParser().getLexer().equal(Symbol.LEFT_PAREN)) {
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
} else {
throw new UnsupportedOperationException("Cannot support PARTITION BY without ()");
}
......@@ -239,9 +239,9 @@ public class OracleSelectParser extends AbstractSelectParser {
private void parseSample() {
if (getExprParser().getLexer().skipIfEqual(OracleKeyword.SAMPLE)) {
getExprParser().getLexer().skipIfEqual(OracleKeyword.BLOCK);
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
if (getExprParser().getLexer().skipIfEqual(OracleKeyword.SEED)) {
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
}
}
}
......@@ -253,9 +253,9 @@ public class OracleSelectParser extends AbstractSelectParser {
private void skipPartition(final OracleKeyword keyword) {
if (getExprParser().getLexer().skipIfEqual(keyword)) {
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
if (getExprParser().getLexer().skipIfEqual(DefaultKeyword.FOR)) {
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
}
}
}
......@@ -263,14 +263,14 @@ public class OracleSelectParser extends AbstractSelectParser {
private void skipPivotClause() {
if (getExprParser().getLexer().skipIfEqual(OracleKeyword.PIVOT)) {
getExprParser().getLexer().skipIfEqual(OracleKeyword.XML);
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
} else if (getExprParser().getLexer().skipIfEqual(OracleKeyword.UNPIVOT)) {
if (getExprParser().getLexer().skipIfEqual(OracleKeyword.INCLUDE)) {
getExprParser().getLexer().accept(OracleKeyword.NULLS);
} else if (getExprParser().getLexer().skipIfEqual(OracleKeyword.EXCLUDE)) {
getExprParser().getLexer().accept(OracleKeyword.NULLS);
}
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
}
}
......
......@@ -62,7 +62,7 @@ public class SQLServerSelectParser extends AbstractSelectParser {
@Override
protected void parseJoinTable() {
if (getExprParser().getLexer().skipIfEqual(DefaultKeyword.WITH)) {
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
}
super.parseJoinTable();
}
......
......@@ -204,33 +204,4 @@ public class Lexer {
nextToken();
}
}
/**
* 跳过小括号内所有的语言符号.
*
* @return 小括号内所有的语言符号
*/
public final String skipParentheses() {
StringBuilder result = new StringBuilder("");
int count = 0;
if (Symbol.LEFT_PAREN == token.getType()) {
int beginPosition = position;
result.append(Symbol.LEFT_PAREN.getLiterals());
nextToken();
while (true) {
if (Assist.EOF == token.getType() || (Symbol.RIGHT_PAREN == token.getType() && 0 == count)) {
break;
}
if (Symbol.LEFT_PAREN == token.getType()) {
count++;
} else if (Symbol.RIGHT_PAREN == token.getType()) {
count--;
}
nextToken();
}
result.append(input.substring(beginPosition, position));
nextToken();
}
return result.toString();
}
}
......@@ -102,7 +102,7 @@ public abstract class AbstractInsertParser {
while (getSkippedTokensBetweenTableAndValues().contains(exprParser.getLexer().getToken().getType())) {
exprParser.getLexer().nextToken();
if (exprParser.getLexer().equal(Symbol.LEFT_PAREN)) {
exprParser.getLexer().skipParentheses();
exprParser.skipParentheses();
}
}
}
......
......@@ -84,7 +84,7 @@ public abstract class AbstractSelectParser {
getExprParser().getLexer().nextToken();
if (hasDistinctOn() && getExprParser().getLexer().equal(DefaultKeyword.ON)) {
getExprParser().getLexer().nextToken();
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
}
} else if (getExprParser().getLexer().equal(DefaultKeyword.ALL)) {
getExprParser().getLexer().nextToken();
......@@ -201,7 +201,7 @@ public abstract class AbstractSelectParser {
parseTableCondition(getExprParser().getLexer().getToken().getEndPosition() - getExprParser().getLexer().getToken().getLiterals().length());
} while (getExprParser().getLexer().skipIfEqual(DefaultKeyword.AND));
} else if (getExprParser().getLexer().skipIfEqual(DefaultKeyword.USING)) {
getExprParser().getLexer().skipParentheses();
getExprParser().skipParentheses();
}
parseJoinTable();
}
......
......@@ -76,7 +76,7 @@ public abstract class AbstractUpdateParser {
private void parseSetItem() {
if (exprParser.getLexer().equal(Symbol.LEFT_PAREN)) {
exprParser.getLexer().skipParentheses();
exprParser.skipParentheses();
} else {
int beginPosition = exprParser.getLexer().getToken().getEndPosition();
String literals = exprParser.getLexer().getToken().getLiterals();
......
......@@ -204,7 +204,7 @@ public class SQLExprParser {
return new CommonSelectItemContext(Symbol.STAR.getLiterals(), as(), index, true);
}
if (getLexer().skipIfEqual(DefaultKeyword.MAX, DefaultKeyword.MIN, DefaultKeyword.SUM, DefaultKeyword.AVG, DefaultKeyword.COUNT)) {
return new AggregationSelectItemContext(getLexer().skipParentheses(), as(), index, AggregationColumn.AggregationType.valueOf(literals.toUpperCase()));
return new AggregationSelectItemContext(skipParentheses(), as(), index, AggregationColumn.AggregationType.valueOf(literals.toUpperCase()));
}
StringBuilder expression = new StringBuilder();
// FIXME 无as的alias解析, 应该做成倒数第二个token不是运算符,倒数第一个token是Identifier或char,则为别名, 不过CommonSelectItemContext类型并不关注expression和alias
......@@ -330,7 +330,7 @@ public class SQLExprParser {
return new SQLIgnoreExpr();
}
if (lexer.equal(Symbol.LEFT_PAREN)) {
getLexer().skipParentheses();
skipParentheses();
skipRest();
return new SQLIgnoreExpr();
}
......@@ -345,7 +345,7 @@ public class SQLExprParser {
if (!lexer.equal(Symbol.PLUS, Symbol.SUB, Symbol.STAR, Symbol.SLASH)) {
return result;
}
getLexer().skipParentheses();
skipParentheses();
skipRest();
return new SQLIgnoreExpr();
}
......@@ -359,7 +359,7 @@ public class SQLExprParser {
if (lexer.skipIfEqual(Symbol.DOT)) {
getLexer().nextToken();
}
getLexer().skipParentheses();
skipParentheses();
}
}
......@@ -385,4 +385,33 @@ public class SQLExprParser {
}
return new SQLIgnoreExpr();
}
/**
* 跳过小括号内所有的语言符号.
*
* @return 小括号内所有的语言符号
*/
public final String skipParentheses() {
StringBuilder result = new StringBuilder("");
int count = 0;
if (Symbol.LEFT_PAREN == getLexer().getToken().getType()) {
int beginPosition = getLexer().getToken().getEndPosition();
result.append(Symbol.LEFT_PAREN.getLiterals());
getLexer().nextToken();
while (true) {
if (Assist.EOF == getLexer().getToken().getType() || (Symbol.RIGHT_PAREN == getLexer().getToken().getType() && 0 == count)) {
break;
}
if (Symbol.LEFT_PAREN == getLexer().getToken().getType()) {
count++;
} else if (Symbol.RIGHT_PAREN == getLexer().getToken().getType()) {
count--;
}
getLexer().nextToken();
}
result.append(getLexer().getInput().substring(beginPosition, getLexer().getToken().getEndPosition()));
getLexer().nextToken();
}
return result.toString();
}
}
......@@ -77,7 +77,7 @@ public final class SQLStatementParser {
do {
exprParser.getLexer().skipUntil(DefaultKeyword.AS);
exprParser.getLexer().accept(DefaultKeyword.AS);
exprParser.getLexer().skipParentheses();
exprParser.skipParentheses();
} while (exprParser.getLexer().skipIfEqual(Symbol.COMMA));
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册