package uva.ql.ast.expression.evaluation;
import uva.ql.ast.expressions.BinaryExpression;
import uva.ql.ast.expressions.Expression;
import uva.ql.ast.expressions.literals.BooleanLiteral;
import uva.ql.ast.expressions.literals.Identifier;
import uva.ql.ast.expressions.literals.IntLiteral;
import uva.ql.ast.expressions.literals.MoneyLiteral;
import uva.ql.ast.expressions.literals.StringLiteral;
import uva.ql.ast.expressions.logic.And;
import uva.ql.ast.expressions.logic.Equal;
import uva.ql.ast.expressions.logic.Greater;
import uva.ql.ast.expressions.logic.Greater_Eq;
import uva.ql.ast.expressions.logic.Less;
import uva.ql.ast.expressions.logic.Less_Eq;
import uva.ql.ast.expressions.logic.NotEqual;
import uva.ql.ast.expressions.logic.Or;
import uva.ql.ast.expressions.math.Addition;
import uva.ql.ast.expressions.math.Division;
import uva.ql.ast.expressions.math.Exponentiation;
import uva.ql.ast.expressions.math.Multiplication;
import uva.ql.ast.expressions.math.Substraction;
import uva.ql.ast.value.BooleanValue;
import uva.ql.ast.value.GenericValue;
import uva.ql.ast.value.NumberValue;
import uva.ql.ast.value.StringValue;
import uva.ql.ast.visitor.ExpressionVisitor;
public class ExpressionEvaluator implements ExpressionVisitor<Object>{
private ValueTable valueTable;
public GenericValue<?> visitExpressionWithValueTable(Expression expression, ValueTable valueTable){
this.valueTable = valueTable;
return this.visitExpression(expression);
}
@Override
public Expression visitBinaryExpression(BinaryExpression expression) {
return null;
}
@Override
public GenericValue<?> visitExpression(Expression expression) {
return (GenericValue<?>)expression.accept(this);
}
@Override
public NumberValue visitExponentiation(Exponentiation exponentiation) {
NumberValue leftValue = (NumberValue)exponentiation.getLeftExpr().accept(this);
NumberValue rightValue = (NumberValue)exponentiation.getRightExpr().accept(this);
return leftValue.exponentiation(rightValue);
}
@Override
public NumberValue visitAddition(Addition addition) {
NumberValue leftValue = (NumberValue)addition.getLeftExpr().accept(this);
NumberValue rightValue = (NumberValue)addition.getRightExpr().accept(this);
return leftValue.addition(rightValue);
}
@Override
public NumberValue visitSubstraction(Substraction substraction) {
NumberValue leftValue = (NumberValue)substraction.getLeftExpr().accept(this);
NumberValue rightValue = (NumberValue)substraction.getRightExpr().accept(this);
return leftValue.substraction(rightValue);
}
@Override
public NumberValue visitMultiplication(Multiplication multipllication) {
NumberValue leftValue = (NumberValue)multipllication.getLeftExpr().accept(this);
NumberValue rightValue = (NumberValue)multipllication.getRightExpr().accept(this);
return leftValue.multiplication(rightValue);
}
@Override
public NumberValue visitDivision(Division division) {
NumberValue leftValue = (NumberValue)division.getLeftExpr().accept(this);
NumberValue rightValue = (NumberValue)division.getRightExpr().accept(this);
return leftValue.division(rightValue);
}
@Override
public BooleanValue visitAnd(And and) {
BooleanValue leftValue = (BooleanValue)and.getLeftExpr().accept(this);
BooleanValue rightValue = (BooleanValue)and.getRightExpr().accept(this);
return leftValue.and(rightValue);
}
@Override
public BooleanValue visitOr(Or or) {
BooleanValue leftValue = (BooleanValue)or.getLeftExpr().accept(this);
BooleanValue rightValue = (BooleanValue)or.getRightExpr().accept(this);
return leftValue.or(rightValue);
}
@Override
public BooleanValue visitEqual(Equal equal) {
GenericValue<?> leftValue = (GenericValue<?>)equal.getLeftExpr().accept(this);
GenericValue<?> rightValue = (GenericValue<?>)equal.getRightExpr().accept(this);
return new BooleanValue(leftValue.equalsTo(rightValue));
}
@Override
public BooleanValue visitNotEqual(NotEqual notEqual) {
GenericValue<?> leftValue = (GenericValue<?>)notEqual.getLeftExpr().accept(this);
GenericValue<?> rightValue = (GenericValue<?>)notEqual.getRightExpr().accept(this);
return new BooleanValue(leftValue.equalsTo(rightValue));
}
@Override
public BooleanValue visitGreaterEqual(Greater_Eq greaterEqual) {
NumberValue leftValue = (NumberValue)greaterEqual.getLeftExpr().accept(this);
NumberValue rightValue = (NumberValue)greaterEqual.getRightExpr().accept(this);
return leftValue.greaterEqual(rightValue);
}
@Override
public BooleanValue visitGreater(Greater greater) {
NumberValue leftValue = (NumberValue)greater.getLeftExpr().accept(this);
NumberValue rightValue = (NumberValue)greater.getRightExpr().accept(this);
return leftValue.greater(rightValue);
}
@Override
public BooleanValue visitLessEqual(Less_Eq lessEqual) {
NumberValue leftValue = (NumberValue)lessEqual.getLeftExpr().accept(this);
NumberValue rightValue = (NumberValue)lessEqual.getRightExpr().accept(this);
return leftValue.lessEqual(rightValue);
}
@Override
public BooleanValue visitLess(Less less) {
NumberValue leftValue = (NumberValue)less.getLeftExpr().accept(this);
NumberValue rightValue = (NumberValue)less.getRightExpr().accept(this);
return leftValue.less(rightValue);
}
@Override
public GenericValue<?> visitIdentifier(Identifier identifier) {
return identifier.getValueFromValueTable(this.valueTable);
}
@Override
public BooleanValue visitBooleanLiteral(BooleanLiteral booleanLiteral) {
return booleanLiteral.evaluate();
}
@Override
public NumberValue visitMoneyLiteral(MoneyLiteral moneyLiteral) {
return moneyLiteral.evaluate();
}
@Override
public NumberValue visitIntLiteral(IntLiteral intLiteral) {
return intLiteral.evaluate();
}
@Override
public StringValue visitStringLiteral(StringLiteral stringLiteral) {
return stringLiteral.evaluate();
}
}