package ql.semantics; import ql.ast.expression.*; import ql.semantics.values.*; /** * Created by bore on 23/02/15. */ public class ExprEvaluator implements ExprVisitor<Value> { private final ValueTable valueTable; public static Value evaluate(Expr e, ValueTable valueTable) { ExprEvaluator eval = new ExprEvaluator(valueTable); return e.accept(eval); } private ExprEvaluator(ValueTable valueTable) { this.valueTable = valueTable; } @Override public Value visit(BoolExpr e) { return new BoolValue(e.getValue()); } @Override public Value visit(IntExpr e) { return new IntValue(e.getValue()); } @Override public Value visit(DecExpr e) { return new DecValue(e.getValue()); } @Override public Value visit(StrExpr e) { return new StrValue(e.getValue()); } @Override public Value visit(Ident id) { return this.valueTable.getValue(id.getId()); } @Override public Value visit(Neg e) { Value op = e.getOperand().accept(this); return op.neg(); } @Override public Value visit(Pos e) { Value op = e.getOperand().accept(this); return op.pos(); } @Override public Value visit(Not e) { Value op = e.getOperand().accept(this); return op.not(); } @Override public Value visit(Add e) { Value left = e.getLeft().accept(this); Value right = e.getRight().accept(this); Value leftProm = left.promoteTo(right); Value rightProm = right.promoteTo(left); return leftProm.add(rightProm); } @Override public Value visit(Sub e) { Value left = e.getLeft().accept(this); Value right = e.getRight().accept(this); Value leftProm = left.promoteTo(right); Value rightProm = right.promoteTo(left); return leftProm.sub(rightProm); } @Override public Value visit(Mul e) { Value left = e.getLeft().accept(this); Value right = e.getRight().accept(this); Value leftProm = left.promoteTo(right); Value rightProm = right.promoteTo(left); return leftProm.mul(rightProm); } @Override public Value visit(Div e) { Value left = e.getLeft().accept(this); Value right = e.getRight().accept(this); Value leftProm = left.promoteTo(right); Value rightProm = right.promoteTo(left); return leftProm.div(rightProm); } @Override public Value visit(Gt e) { Value left = e.getLeft().accept(this); Value right = e.getRight().accept(this); Value leftProm = left.promoteTo(right); Value rightProm = right.promoteTo(left); return leftProm.gt(rightProm); } @Override public Value visit(Lt e) { Value left = e.getLeft().accept(this); Value right = e.getRight().accept(this); Value leftProm = left.promoteTo(right); Value rightProm = right.promoteTo(left); return leftProm.lt(rightProm); } @Override public Value visit(GtEqu e) { Value left = e.getLeft().accept(this); Value right = e.getRight().accept(this); Value leftProm = left.promoteTo(right); Value rightProm = right.promoteTo(left); return leftProm.gtEqu(rightProm); } @Override public Value visit(LtEqu e) { Value left = e.getLeft().accept(this); Value right = e.getRight().accept(this); Value leftProm = left.promoteTo(right); Value rightProm = right.promoteTo(left); return leftProm.ltEqu(rightProm); } @Override public Value visit(Equ e) { Value left = e.getLeft().accept(this); Value right = e.getRight().accept(this); Value leftProm = left.promoteTo(right); Value rightProm = right.promoteTo(left); return leftProm.equ(rightProm); } @Override public Value visit(NotEqu e) { Value left = e.getLeft().accept(this); Value right = e.getRight().accept(this); Value leftProm = left.promoteTo(right); Value rightProm = right.promoteTo(left); return leftProm.notEqu(rightProm); } @Override public Value visit(And e) { Value left = e.getLeft().accept(this); Value right = e.getRight().accept(this); Value leftProm = left.promoteTo(right); Value rightProm = right.promoteTo(left); return leftProm.and(rightProm); } @Override public Value visit(Or e) { Value left = e.getLeft().accept(this); Value right = e.getRight().accept(this); Value leftProm = left.promoteTo(right); Value rightProm = right.promoteTo(left); return leftProm.or(rightProm); } }