package gui.render;
import java.util.Map;
import ast.expr.Identifier;
import ast.expr.binExpr.Add;
import ast.expr.binExpr.And;
import ast.expr.binExpr.Div;
import ast.expr.binExpr.Eq;
import ast.expr.binExpr.GEq;
import ast.expr.binExpr.GT;
import ast.expr.binExpr.LEq;
import ast.expr.binExpr.LT;
import ast.expr.binExpr.Mul;
import ast.expr.binExpr.NEq;
import ast.expr.binExpr.Or;
import ast.expr.binExpr.Sub;
import ast.expr.literal.BoolLiteral;
import ast.expr.literal.IntLiteral;
import ast.expr.literal.StrLiteral;
import ast.expr.unExpr.Neg;
import ast.expr.unExpr.Not;
import ast.expr.unExpr.Pos;
import ast.value.Bool;
import ast.value.Int;
import ast.value.Str;
import ast.value.Value;
import ast.visitors.ExprVisitor;
public class Evaluator implements ExprVisitor<Value> {
private Map<Identifier, Value> environment;
public Evaluator(Map<Identifier, Value> environment) {
this.environment = environment ;
}
@Override
public Value visit(Pos node) {
return node.getOperand().accept(this).pos();
}
@Override
public Value visit(Neg node) {
return node.getOperand().accept(this).neg();
}
@Override
public Value visit(Not node) {
return node.getOperand().accept(this).not();
}
@Override
public Value visit(Add node) {
Value l = node.getLhs().accept(this);
Value r = node.getRhs().accept(this);
return l.add(r);
}
@Override
public Value visit(And node) {
Value l = node.getLhs().accept(this);
Value r = node.getRhs().accept(this);
return l.and(r);
}
@Override
public Value visit(Div node) {
Value l = node.getLhs().accept(this);
Value r = node.getRhs().accept(this);
return l.div(r);
}
@Override
public Value visit(Eq node) {
Value l = node.getLhs().accept(this);
Value r = node.getRhs().accept(this);
return l.eq(r);
}
@Override
public Value visit(GEq node) {
Value l = node.getLhs().accept(this);
Value r = node.getRhs().accept(this);
return l.geq(r);
}
@Override
public Value visit(GT node) {
Value l = node.getLhs().accept(this);
Value r = node.getRhs().accept(this);
return l.gt(r);
}
@Override
public Value visit(LEq node) {
Value l = node.getLhs().accept(this);
Value r = node.getRhs().accept(this);
return l.leq(r);
}
@Override
public Value visit(LT node) {
Value l = node.getLhs().accept(this);
Value r = node.getRhs().accept(this);
return l.lt(r);
}
@Override
public Value visit(Mul node) {
Value l = node.getLhs().accept(this);
Value r = node.getRhs().accept(this);
return l.mul(r);
}
@Override
public Value visit(NEq node) {
Value l = node.getLhs().accept(this);
Value r = node.getRhs().accept(this);
return l.neq(r);
}
@Override
public Value visit(Or node) {
Value l = node.getLhs().accept(this);
Value r = node.getRhs().accept(this);
return l.or(r);
}
@Override
public Value visit(Sub node) {
Value l = node.getLhs().accept(this);
Value r = node.getRhs().accept(this);
return l.sub(r);
}
@Override
public Value visit(BoolLiteral node) {
return new Bool(node.getVal());
}
@Override
public Value visit(Identifier node) {
assert environment.containsKey(node);
return environment.get(node);
}
@Override
public Value visit(IntLiteral node) {
return new Int(node.getVal());
}
@Override
public Value visit(StrLiteral node) {
return new Str(node.getVal());
}
}