现在你有两类操作符。考虑使用递归下降。
您将有规则:
表达:: = 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 + ")";
}
}
现在你有两类运营商,你会像下面这样使用它。考虑使用递归下降。 –