package org.fugazi.ql.evaluator.visitor; import org.fugazi.ql.ast.expression.IExpressionVisitor; import org.fugazi.ql.ast.expression.comparison.*; import org.fugazi.ql.ast.expression.literal.BOOL; import org.fugazi.ql.ast.expression.literal.ID; import org.fugazi.ql.ast.expression.literal.INT; import org.fugazi.ql.ast.expression.literal.STRING; import org.fugazi.ql.ast.expression.logical.And; import org.fugazi.ql.ast.expression.logical.Or; import org.fugazi.ql.ast.expression.numerical.Add; import org.fugazi.ql.ast.expression.numerical.Div; import org.fugazi.ql.ast.expression.numerical.Mul; import org.fugazi.ql.ast.expression.numerical.Sub; import org.fugazi.ql.ast.expression.unary.Negative; import org.fugazi.ql.ast.expression.unary.Not; import org.fugazi.ql.ast.expression.unary.Positive; import org.fugazi.ql.evaluator.ValueStorage; import org.fugazi.ql.evaluator.expression_value.BoolValue; import org.fugazi.ql.evaluator.expression_value.ExpressionValue; import org.fugazi.ql.evaluator.expression_value.IntValue; import org.fugazi.ql.evaluator.expression_value.StringValue; public class EvaluationExprVisitor implements IExpressionVisitor <ExpressionValue> { private final ValueStorage valueStorage; public EvaluationExprVisitor(ValueStorage _values) { this.valueStorage = _values; } /** * Logical */ public ExpressionValue visitAnd(And _and) { ExpressionValue left = _and.getLeft().accept(this); ExpressionValue right = _and.getRight().accept(this); return left.and(right); } public ExpressionValue visitOr(Or _or) { ExpressionValue left = _or.getLeft().accept(this); ExpressionValue right = _or.getRight().accept(this); return left.or(right); } /** * Unary */ public ExpressionValue visitNot(Not _not) { ExpressionValue expression = _not.getExpr().accept(this); return expression.not(); } public ExpressionValue visitNegative(Negative _negative) { ExpressionValue expression = _negative.getExpr().accept(this); return expression.negative(); } public ExpressionValue visitPositive(Positive _positive) { ExpressionValue expression = _positive.getExpr().accept(this); return expression.positive(); } /** * Comparison */ public ExpressionValue visitEQ(EQ _eq) { ExpressionValue left = _eq.getLeft().accept(this); ExpressionValue right = _eq.getRight().accept(this); return left.equal(right); } public ExpressionValue visitNotEq(NotEq _notEq) { ExpressionValue left = _notEq.getLeft().accept(this); ExpressionValue right = _notEq.getRight().accept(this); return left.notEqual(right); } public ExpressionValue visitGreater(Greater _greater) { ExpressionValue left = _greater.getLeft().accept(this); ExpressionValue right = _greater.getRight().accept(this); return left.greater(right); } public ExpressionValue visitLesser(Less _less) { ExpressionValue left = _less.getLeft().accept(this); ExpressionValue right = _less.getRight().accept(this); return left.less(right); } public ExpressionValue visitGE(GE _ge) { ExpressionValue left = _ge.getLeft().accept(this); ExpressionValue right = _ge.getRight().accept(this); return left.greaterEqual(right); } public ExpressionValue visitLE(LE _le) { ExpressionValue left = _le.getLeft().accept(this); ExpressionValue right = _le.getRight().accept(this); return left.lessEqual(right); } /** * Numerical */ public ExpressionValue visitAdd(Add _add) { ExpressionValue left = _add.getLeft().accept(this); ExpressionValue right = _add.getRight().accept(this); return left.add(right); } public ExpressionValue visitSub(Sub _sub) { ExpressionValue left = _sub.getLeft().accept(this); ExpressionValue right = _sub.getRight().accept(this); return left.sub(right); } public ExpressionValue visitMul(Mul _mul) { ExpressionValue left = _mul.getLeft().accept(this); ExpressionValue right = _mul.getRight().accept(this); return left.mul(right); } public ExpressionValue visitDiv(Div _div) { ExpressionValue left = _div.getLeft().accept(this); ExpressionValue right = _div.getRight().accept(this); return left.div(right); } /** * Literals */ public ExpressionValue visitID(ID _id) { return this.valueStorage.getExpressionValue(_id.getName()); } public ExpressionValue visitINT(INT _int) { return new IntValue(_int.getValue()); } public ExpressionValue visitSTRING(STRING _string) { return new StringValue(_string.getValue()); } public ExpressionValue visitBOOL(BOOL _bool) { return new BoolValue(_bool.getValue()); } }