import java.util.*;

class Calc implements Visitor{
    Map<String,Integer> env = new HashMap<String,Integer>();
    int current=0;
    boolean currentB=false;

    public void visit(Var x){current=env.get(x.x);}
    public void visit(Num x){current=x.i;}
    public void visit(Assign as){
	as.r.welcome(this);
	env.put(((Var)as.l).x,current);
    }
    public void visit(Add as){
	as.l.welcome(this);
	int left = current;
	as.r.welcome(this);
	current=left+current;
    }
    public void visit(Eq as){
	as.l.welcome(this);
	int left = current;
	as.r.welcome(this);
	currentB=left==current;
    }
    public void visit(Sub as){
	as.l.welcome(this);
	int left = current;
	as.r.welcome(this);
	current=left-current;
    }
    public void visit(Mul as){
	as.l.welcome(this);
	int left = current;
	as.r.welcome(this);
	current=left*current;
    }
    public void visit(Div as){
	as.l.welcome(this);
	int left = current;
	as.r.welcome(this);
	current=left/current;
    }
    public void visit(Not as){
	as.l.welcome(this);
	currentB=!currentB;
    }
    public void visit(While w){
	w.cond.welcome(this);
	while (currentB){
	   w.body.welcome(this);
	   w.cond.welcome(this);
	}
    }
    public void visit(Seq s){
	for (Klip klip:s.klips){
	    klip.welcome(this);
	}
    }
}
