import java.util.*;
class Fak{
    static Klip fak;
    static {
	Var x = new Var("x");
	Var result = new Var("result");
	Klip num5 = new Num(5);
	Klip num1 = new Num(1);
	Klip l1 = new Assign(x,num5);
	Klip l2 = new Assign(result,num1);
	Klip m = new Mul(result,x);
	Klip s = new Sub(x,num1);
	Klip l4= new Assign(result,m);
	Klip l5=  new Assign(x,s);
	List<Klip> l4_5=new LinkedList<Klip>();
	l4_5.add(l4);
	l4_5.add(l5);
	Klip body=new Seq(l4_5);
	Klip num0 = new Num(0);
	Klip eq = new Eq(x,num0); 
	Klip not = new Not(eq);
	Klip w= new While(not,body);
	List<Klip> prog=new LinkedList<Klip>();
	prog.add(l1);
	prog.add(l2);
	prog.add(w);
	prog.add(result);
	fak=new Seq(prog);
    }
  public static void main(String [] args){
      PP pp = new PP();
      fak.welcome(pp);
      TypeChecker tch= new TypeChecker();
      fak.welcome(tch);
      System.out.println(tch.vars);
      Calc calc= new Calc();
      fak.welcome(calc);
      System.out.println(pp.buf);
      System.out.println(calc.current);
  }
}
