|
// SQLParser.java/**
* 解析表达式.
*
* @return 表达式
*/// TODO 完善Expression解析的各种场景public final SQLExpression parseExpression() { // 解析表达式
String literals = getLexer().getCurrentToken().getLiterals(); final SQLExpression expression = getExpression(literals); // SQLIdentifierExpression 需要特殊处理。考虑自定义函数,表名.属性情况。
if (skipIfEqual(Literals.IDENTIFIER)) { if (skipIfEqual(Symbol.DOT)) { // 例如,ORDER BY o.uid 中的 "o.uid"
String property = getLexer().getCurrentToken().getLiterals();
getLexer().nextToken(); return skipIfCompositeExpression() ? new SQLIgnoreExpression() : new SQLPropertyExpression(new SQLIdentifierExpression(literals), property);
} if (equalAny(Symbol.LEFT_PAREN)) { // 例如,GROUP BY DATE(create_time) 中的 "DATE(create_time)"
skipParentheses();
skipRestCompositeExpression(); return new SQLIgnoreExpression();
} return skipIfCompositeExpression() ? new SQLIgnoreExpression() : expression;
}
getLexer().nextToken(); return skipIfCompositeExpression() ? new SQLIgnoreExpression() : expression;
}/**
* 获得 词法Token 对应的 SQLExpression
*
* @param literals 词法字面量标记
* @return SQLExpression
*/private SQLExpression getExpression(final String literals) { if (equalAny(Symbol.QUESTION)) {
increaseParametersIndex(); return new SQLPlaceholderExpression(getParametersIndex() - 1);
} if (equalAny(Literals.CHARS)) { return new SQLTextExpression(literals);
} // TODO 考虑long的情况
if (equalAny(Literals.INT)) { return new SQLNumberExpression(Integer.parseInt(literals));
} if (equalAny(Literals.FLOAT)) { return new SQLNumberExpression(Double.parseDouble(literals));
} // TODO 考虑long的情况
if (equalAny(Literals.HEX)) { return new SQLNumberExpression(Integer.parseInt(literals, 16));
} if (equalAny(Literals.IDENTIFIER)) { return new SQLIdentifierExpression(SQLUtil.getExactlyValue(literals));
} return new SQLIgnoreExpression();
}/**
* 如果是 复合表达式,跳过。
*
* @return 是否跳过
*/private boolean skipIfCompositeExpression() { if (equalAny(Symbol.PLUS, Symbol.SUB, Symbol.STAR, Symbol.SLASH, Symbol.PERCENT, Symbol.AMP, Symbol.BAR, Symbol.DOUBLE_AMP, Symbol.DOUBLE_BAR, Symbol.CARET, Symbol.DOT, Symbol.LEFT_PAREN)) {
skipParentheses();
skipRestCompositeExpression(); return true;
} return false;
}/**
* 跳过剩余复合表达式
*/private void skipRestCompositeExpression() { while (skipIfEqual(Symbol.PLUS, Symbol.SUB, Symbol.STAR, Symbol.SLASH, Symbol.PERCENT, Symbol.AMP, Symbol.BAR, Symbol.DOUBLE_AMP, Symbol.DOUBLE_BAR, Symbol.CARET, Symbol.DOT)) { if (equalAny(Symbol.QUESTION)) {
increaseParametersIndex();
}
getLexer().nextToken();
skipParentheses();
}
}
|
|
|