現在你有兩類操作符。考慮使用遞歸下降。
您將有規則:
表達:: = BinaryExpression(BooleanOperator BinaryExpression)*
BooleanOperator :: = 「或」 | 「和」
BinaryExpression :: =名稱BinaryOperator值
BinaryOperator :: = 「EQ」 | 「LT」 | 「GT」 | 「IN」
因此,這裏是一個非常簡單的實現:
public class QueryBuilder {
final String[] token;
int i = 0;
public static Expression parse(String query) {
return new QueryBuilder(query).expression();
}
private QueryBuilder(String query) {
token = query.split("\\s+");
}
private Expression expression() {
Expression expr = binaryExpression();
while (i < token.length) {
String operator = token[i++];
Expression right = binaryExpression();
switch (operator) {
case "AND":
expr = new BooleanExpression(expr, Operator.AND, right);
break;
default:
expr = new BooleanExpression(expr, Operator.OR, right);
break;
}
}
return expr;
}
private Expression binaryExpression() {
String field = token[i++];
String operator = token[i++];
String value = token[i++];
switch (operator) {
case "EQ":
return new BinaryExpression(field, Operator.EQ, value);
case "LT":
return new BinaryExpression(field, Operator.LT, value);
case "GT":
return new BinaryExpression(field, Operator.GT, value);
default:
return new BinaryExpression(field, Operator.IN, value);
}
}
}
正如你所看到的,QueryBuilder現在有一個狀態。
public static void main(String args[]) {
Expression expr = QueryBuilder.parse("eid EQ 2 AND deptname EQ foo");
System.out.println(expr);
}
UPDATE
我爲測試定義這些類:
abstract class Expression {
}
enum Operator {
EQ, LT, GT, IN, AND, OR;
}
class BinaryExpression extends Expression {
private final String field;
private final Operator op;
private final String value;
BinaryExpression(String field, Operator op, String value) {
this.field = field;
this.op = op;
this.value = value;
}
@Override
public String toString() {
return "(" + field + " " + op + " " + value + ")";
}
}
class BooleanExpression extends Expression {
private final Expression left;
private final Operator op;
private final Expression right;
BooleanExpression(Expression left, Operator op, Expression right) {
this.left = left;
this.op = op;
this.right = right;
}
@Override
public String toString() {
return "(" + left + " " + op + " " + right + ")";
}
}
現在你有兩類運營商,你會像下面這樣使用它。考慮使用遞歸下降。 –