/*
* Copyright 2015 Eediom Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.araqne.logdb.query.parser;
import java.util.ArrayList;
import java.util.List;
public enum EvalEqOpTerm 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),
Assign("=", 250, false, false, false, null),
Comma(",", 200), ListEndComma(",", 200),
NOP("", 0, true, false, true, null)
;
EvalEqOpTerm(String symbol, int precedence) {
this(symbol, precedence, true, false, false, null);
}
EvalEqOpTerm(String symbol, int precedence, boolean leftAssoc, boolean unary, boolean isAlpha, EvalEqOpTerm 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 EvalEqOpTerm altOp;
public final boolean isAlpha;
@Override
public String toString() {
return symbol;
}
@Override
public OpTerm parse(String token) {
for (EvalEqOpTerm op : values()) {
if (op.symbol.equals(token) && op != NOP) {
return op;
}
}
return null;
}
@Override
public boolean isInstance(Object o) {
return o instanceof EvalEqOpTerm;
}
@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 (EvalEqOpTerm 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 (EvalEqOpTerm 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;
}
}