package evaluator;
import ast.expression.Brackets;
import ast.expression.Expression;
import ast.expression.IExpressionVisitor;
import ast.expression.arithmetic.Addition;
import ast.expression.arithmetic.Division;
import ast.expression.arithmetic.Multiplication;
import ast.expression.arithmetic.Substraction;
import ast.expression.comparison.Equal;
import ast.expression.comparison.GreaterEqual;
import ast.expression.comparison.GreaterThan;
import ast.expression.comparison.LessEqual;
import ast.expression.comparison.LessThan;
import ast.expression.comparison.NotEqual;
import ast.expression.logical.And;
import ast.expression.logical.Or;
import ast.expression.variables.BooleanVariable;
import ast.expression.variables.Id;
import ast.expression.variables.IntegerVariable;
import ast.expression.variables.StringVariable;
import ast.unary.Minus;
import ast.unary.Not;
import ast.unary.Plus;
public class EvaluatorVisitor implements IExpressionVisitor<Value> {
private final ValueRepository valueRepository;
public EvaluatorVisitor(ValueRepository valueRepository) {
this.valueRepository = valueRepository;
}
@Override
public Value visit(Multiplication expr) {
Value left = expr.getLeftExpression().accept(this);
Value right = expr.getRightExpression().accept(this);
return left.multiply(right);
}
@Override
public Value visit(Division expr) {
Value left = expr.getLeftExpression().accept(this);
Value right = expr.getRightExpression().accept(this);
return left.divide(right);
}
@Override
public Value visit(Addition expr) {
Value left = expr.getLeftExpression().accept(this);
Value right = expr.getRightExpression().accept(this);
return left.add(right);
}
@Override
public Value visit(Substraction expr) {
Value left = expr.getLeftExpression().accept(this);
Value right = expr.getRightExpression().accept(this);
return left.substract(right);
}
@Override
public Value visit(Equal expr) {
Value left = expr.getLeftExpression().accept(this);
Value right = expr.getRightExpression().accept(this);
return left.equality(right);
}
@Override
public Value visit(NotEqual expr) {
Value left = expr.getLeftExpression().accept(this);
Value right = expr.getRightExpression().accept(this);
return left.notEqual(right);
}
@Override
public Value visit(LessThan expr) {
Value left = expr.getLeftExpression().accept(this);
Value right = expr.getRightExpression().accept(this);
return left.less(right);
}
@Override
public Value visit(GreaterThan expr) {
Value left = expr.getLeftExpression().accept(this);
Value right = expr.getRightExpression().accept(this);
return left.greater(right);
}
@Override
public Value visit(LessEqual expr) {
Value left = expr.getLeftExpression().accept(this);
Value right = expr.getRightExpression().accept(this);
return left.lessEqual(right);
}
@Override
public Value visit(GreaterEqual expr) {
Value left = expr.getLeftExpression().accept(this);
Value right = expr.getRightExpression().accept(this);
return left.greaterEqual(right);
}
@Override
public Value visit(Not expr) {
Value value = expr.getUnaryExpression().accept(this);
return value.not();
}
@Override
public Value visit(Plus expr) {
Value value = expr.getUnaryExpression().accept(this);
return value.plus();
}
@Override
public Value visit(Minus expr) {
Value value = expr.getUnaryExpression().accept(this);
return value.minus();
}
@Override
public Value visit(And expr) {
Value left = expr.getLeftExpression().accept(this);
Value right = expr.getRightExpression().accept(this);
return left.and(right);
}
@Override
public Value visit(Or expr) {
Value left = expr.getLeftExpression().accept(this);
Value right = expr.getRightExpression().accept(this);
return left.or(right);
}
@Override
public Value visit(Brackets expr) {
return expr.getBracketsExpression().accept(this);
}
@Override
public Value visit(StringVariable string) {
return new StringValue(string.getVariable());
}
@Override
public Value visit(IntegerVariable integer) {
return new IntegerValue(integer.getVariable());
}
@Override
public Value visit(BooleanVariable bool) {
return new BooleanValue(bool.getVariable());
}
@Override
public Value visit(Id identifier) {
return valueRepository.getValue(identifier.getID());
}
}