package org.araqne.logdb.query.parser; import java.util.ArrayList; import java.util.List; import org.araqne.logdb.query.parser.OpTerm; public enum EvalOpTerm implements OpTerm { Add("+", 500), Sub("-", 500), Mul("*", 510), Div("/", 510), Neg("-", 520, false, true, false, Sub), Gte(">=", 410), Lte("<=", 410), Gt(">", 410), Lt("<", 410), Eq("==", 400), Neq("!=", 400), And("and", 310, true, false, true, null), Or("or", 300, true, false, true, null), Comma(",", 200), ListEndComma(",", 200), NOP("", 0, true, false, true, null); EvalOpTerm(String symbol, int precedence) { this(symbol, precedence, true, false, false, null); } EvalOpTerm(String symbol, int precedence, boolean leftAssoc, boolean unary, boolean isAlpha, EvalOpTerm altOp) { this.symbol = symbol; this.precedence = precedence; this.leftAssoc = leftAssoc; this.unary = unary; this.isAlpha = isAlpha; this.altOp = altOp; if (altOp != null) altOp.altOp = this; } public final String symbol; public final int precedence; public final boolean leftAssoc; public final boolean unary; private EvalOpTerm altOp; public final boolean isAlpha; @Override public String toString() { return symbol; } @Override public OpTerm parse(String token) { for (EvalOpTerm op : values()) { if (op.symbol.equals(token) && op != NOP) { return op; } } return null; } @Override public boolean isInstance(Object o) { return o instanceof EvalOpTerm; } @Override public boolean isUnary() { return unary && this.equals(Neg); } @Override public boolean isAlpha() { return isAlpha; } @Override public boolean isLeftAssoc() { return leftAssoc; } @Override public boolean isDelimiter(String s) { for (EvalOpTerm op : values()) { if (!op.isAlpha && op.symbol.equals(s)) { return true; } } return false; } @Override public String getSymbol() { return symbol; } @Override public int getPrecedence() { return precedence; } @Override public List<OpTerm> delimiters() { List<OpTerm> delims = new ArrayList<OpTerm>(); for (EvalOpTerm op : values()) { if (!op.isAlpha()) { delims.add(op); } } return delims; } @Override public OpTerm postProcessCloseParen() { if (!this.equals(Comma)) { return this; } return ListEndComma; } @Override public boolean hasAltOp() { return altOp != null; } @Override public OpTerm getAltOp() { return altOp; } }