package gui;
import java.util.Map;
import ast.Visitor;
import ast.evaluate.Bool;
import ast.evaluate.Int;
import ast.evaluate.Str;
import ast.evaluate.Undefined;
import ast.evaluate.Value;
import ast.form.Block;
import ast.form.Computedquest;
import ast.form.Form;
import ast.form.IfElse;
import ast.form.Ifstate;
import ast.form.Question;
import ast.form.StatementList;
import ast.literals.BoolLiteral;
import ast.literals.IntLiteral;
import ast.literals.StrLiteral;
import ast.type.Booltype;
import ast.type.Inttype;
import ast.type.Strtype;
import expr.Expr;
import expr.Ident;
import expr.conditional.And;
import expr.conditional.Or;
import expr.operation.Add;
import expr.operation.Div;
import expr.operation.Mul;
import expr.operation.Sub;
import expr.relational.Eq;
import expr.relational.GEq;
import expr.relational.GT;
import expr.relational.LEq;
import expr.relational.LT;
import expr.relational.NEq;
import expr.unary.Neg;
import expr.unary.Not;
import expr.unary.Pos;
public class Evaluation implements Visitor<Value> {
private final Map<String, Value> env;
public Evaluation(Map<String, Value> env)
{
//this.env = Collections.unmodifiableMap(env);
this.env = env;
}
public static Value Evaluate(Expr expr, Map<String, Value> env){
Evaluation evaluator = new Evaluation(env);
return expr.accept(evaluator);
}
@Override
public Value visit(And node) {
Value lhs = node.getLhs().accept(this);
Value rhs = node.getRhs().accept(this);
return lhs.and(rhs);
}
@Override
public Value visit(Or node) {
Value lhs = node.getLhs().accept(this);
Value rhs = node.getRhs().accept(this);
return lhs.or(rhs);
}
@Override
public Value visit(Ident node) {
if (env.containsKey(node.id)){
return env.get(node.id);
}
return null;
}
@Override
public Value visit(Add node) {
Value lhs = node.getLhs().accept(this);
Value rhs = node.getRhs().accept(this);
if(lhs.getClass()!=Undefined.class && rhs.getClass()!=Undefined.class){
return lhs.add(rhs);
}
return null;
}
@Override
public Value visit(Div node) {
Value lhs = node.getLhs().accept(this);
Value rhs = node.getRhs().accept(this);
return lhs.div(rhs);
}
@Override
public Value visit(Mul node) {
Value lhs = node.getLhs().accept(this);
Value rhs = node.getRhs().accept(this);
return lhs.mul(rhs);
}
@Override
public Value visit(Sub node) {
Value lhs = node.getLhs().accept(this);
Value rhs = node.getRhs().accept(this);
if(lhs.getClass()!=Undefined.class && rhs.getClass()!=Undefined.class){
return lhs.sub(rhs);}
return null;
}
@Override
public Value visit(Eq node) {
Value lhs = node.getLhs().accept(this);
Value rhs = node.getRhs().accept(this);
//System.out.println(this.env.values().toString());
//System.out.println(this);
return lhs.eq(rhs);
}
@Override
public Value visit(GEq node) {
Value lhs = node.getLhs().accept(this);
Value rhs = node.getRhs().accept(this);
return lhs.geq(rhs);
}
@Override
public Value visit(GT node) {
Value lhs = node.getLhs().accept(this);
Value rhs = node.getRhs().accept(this);
return lhs.gt(rhs);
}
@Override
public Value visit(LEq node) {
Value lhs = node.getLhs().accept(this);
Value rhs = node.getRhs().accept(this);
return lhs.leq(rhs);
}
@Override
public Value visit(LT node) {
Value lhs = node.getLhs().accept(this);
Value rhs = node.getRhs().accept(this);
return lhs.lt(rhs);
}
@Override
public Value visit(NEq node) {
Value lhs = node.getLhs().accept(this);
Value rhs = node.getRhs().accept(this);
return lhs.neq(rhs);
}
@Override
public Value visit(Neg node) {
Value operand = node.getOperand().accept(this);
return operand.neg();
}
@Override
public Value visit(Not node) {
Value operand = node.getOperand().accept(this);
return operand.not();
}
@Override
public Value visit(BoolLiteral node) {
return new Bool(node.getValue());
}
@Override
public Value visit(IntLiteral node) {
return new Int(node.getValue());
}
@Override
public Value visit(StrLiteral node) {
return new Str(node.getValue());
}
@Override
public Value visit(Form node) {
return null;
}
@Override
public Value visit(Question node) {
return null;
}
@Override
public Value visit(IfElse node) {
return null;
}
@Override
public Value visit(Ifstate node) {
return null;
}
@Override
public Value visit(Booltype node) {
return null;
}
@Override
public Value visit(Inttype node) {
return null;
}
@Override
public Value visit(Strtype node) {
return null;
}
@Override
public Value visit(Pos node) {
return null;
}
@Override
public Value visit(StatementList statementList) {
return null;
}
@Override
public Value visit(Computedquest node) {
return null;
}
@Override
public Value visit(Block block) {
return null;
}
}