import java.util.*;

public class Sam31 {
  static Map<String,Integer> vars = new TreeMap<String,Integer>();

  public static void main(String[] args) {
    vars.put("x", 5);
    Node expr = new Add(new Mul(new Var("x"), new Lit(3)), new Lit(1));
    System.out.println(expr);
    System.out.println(expr.eval());
  }
  abstract static class Node {
    List<Node> child = new ArrayList<Node>();
    public void add(Node n) { child.add(n); }
    public abstract int eval();
  }
  static class Lit extends Node {
    int val;
    public Lit(int v) { val = v; }
    public int eval() { return val; }
    public String toString() { return ""+val; }
  }
  static class Var extends Node {
    String name;
    public Var(String n) { name = n; }
    public int eval() { return vars.get(name); }
    public String toString() { return name; }
  }
  abstract static class BinOp extends Node {
    String op;
    public BinOp(String o, Node n1, Node n2) { op = o; add(n1); add(n2); }
    public String toString() { return "("+child.get(0)+op+child.get(1)+")"; }
  }
  static class Add extends BinOp {
    public Add(Node n1, Node n2) { super("+", n1, n2); }
    public int eval() { return child.get(0).eval() + child.get(1).eval(); }
  }
  static class Mul extends BinOp {
    public Mul(Node n1, Node n2) { super("*", n1, n2); }
    public int eval() { return child.get(0).eval() * child.get(1).eval(); }
  }
}
import java.util.*;

public class Sam32 {
  static Map<String,Integer> vars = new TreeMap<String,Integer>();
  
  public static void main(String[] args) {
    Node prog = new Seq(
      new Read(new Var("x")),
      new Assign(new Var("i"), new Lit(0)),
      new Assign(new Var("p"), new Lit(1)),
      new While(new Lt(new Var("i"), new Var("x")),
        new Seq(
          new Assign(new Var("i"), new Add(new Var("i"), new Lit(1))),
          new Assign(new Var("p"), new Mul(new Var("p"), new Var("i"))),
          new Print(new Var("p")))));
    System.out.println(prog);
    System.out.println(prog.eval());
  }
  abstract static class Node {
    List<Node> child = new ArrayList<Node>();
    public void add(Node n) { child.add(n); }
    public abstract int eval();
  }
  static class Lit extends Node {
    int val;
    public Lit(int v) { val = v; }
    public int eval() { return val; }
    public String toString() { return ""+val; }
  }
  static class Var extends Node {
    String name;
    public Var(String n) { name = n; }
    public int eval() { return vars.get(name); }
    public String toString() { return name; }
  }
  abstract static class BinOp extends Node {
    String op;
    public BinOp(String o, Node n1, Node n2) { op = o; add(n1); add(n2); }
    public String toString() { return "("+child.get(0)+op+child.get(1)+")"; }
  }
  static class Add extends BinOp {
    public Add(Node n1, Node n2) { super("+", n1, n2); }
    public int eval() { return child.get(0).eval() + child.get(1).eval(); }
  }
  static class Mul extends BinOp {
    public Mul(Node n1, Node n2) { super("*", n1, n2); }
    public int eval() { return child.get(0).eval() * child.get(1).eval(); }
  }
  static class Sub extends BinOp {
    public Sub(Node n1, Node n2) { super("-", n1, n2); }
    public int eval() { return child.get(0).eval() - child.get(1).eval(); }
  }
  static class Div extends BinOp {
    public Div(Node n1, Node n2) { super("/", n1, n2); }
    public int eval() { return child.get(0).eval() / child.get(1).eval(); }
  }
  static class Mod extends BinOp {
    public Mod(Node n1, Node n2) { super("%", n1, n2); }
    public int eval() { return child.get(0).eval() % child.get(1).eval(); }
  }
  static class Eq extends BinOp {
    public Eq(Node n1, Node n2) { super("==", n1, n2); }
    public int eval() { return child.get(0).eval()==child.get(1).eval()?1:0; }
  }
  static class Ne extends BinOp {
    public Ne(Node n1, Node n2) { super("!=", n1, n2); }
    public int eval() { return child.get(0).eval()!=child.get(1).eval()?1:0; }
  }
  static class Gt extends BinOp {
    public Gt(Node n1, Node n2) { super(">", n1, n2); }
    public int eval() { return child.get(0).eval()>child.get(1).eval()?1:0; }
  }
  static class Ge extends BinOp {
    public Ge(Node n1, Node n2) { super(">=", n1, n2); }
    public int eval() { return child.get(0).eval()>=child.get(1).eval()?1:0; }
  }
  static class Lt extends BinOp {
    public Lt(Node n1, Node n2) { super("<", n1, n2); }
    public int eval() { return child.get(0).eval()<child.get(1).eval()?1:0; }
  }
  static class Le extends BinOp {
    public Le(Node n1, Node n2) { super("<=", n1, n2); }
    public int eval() { return child.get(0).eval()<=child.get(1).eval()?1:0; }
  }
  static class And extends BinOp {
    public And(Node n1, Node n2) { super("&&", n1, n2); }
    public int eval() {
      int v = child.get(0).eval();
      if(v == 0) { return 0; } else { return child.get(1).eval(); }
    }
  }
  static class Or extends BinOp {
    public Or(Node n1, Node n2) { super("||", n1, n2); }
    public int eval() {
      int v = child.get(0).eval();
      if(v != 0) { return v; } else { return child.get(1).eval(); }
    }
  }
  abstract static class UniOp extends Node {
    String op;
    public UniOp(String o, Node n1) { op = o; add(n1); }
    public String toString() { return "("+op+child.get(0)+")"; }
  }
  static class Not extends UniOp {
    public Not(Node n1) { super("!", n1); }
    public int eval() { return child.get(0).eval()==0?1:0; }
  }
  static class Assign extends Node {
    Var v1; Node n1; 
    public Assign(Var v, Node n) { v1 = v; n1 = n; }
    public int eval() {
      int v = n1.eval(); vars.put(v1.toString(), v); return v;
    }
    public String toString() { return v1+"="+n1; }
  }
  static class Seq extends Node {
    public Seq(Node... a) { for(Node n:a) { child.add(n); } }
    public int eval() {
      int v = 0;
      for(Node n:child) { v = n.eval(); }
      return v;
    }
    public String toString() {
      String s = "{\n";
      for(Node n:child) { s += n.toString() + ";\n"; }
      return s + "}";
    }
  }
  static class Read extends Node {
    Var v1;
    public Read(Var v) { v1 = v; }
    public int eval() {
      System.out.print(v1+"? ");
      Scanner sc = new Scanner(System.in);
      String str = sc.nextLine();
      int i = Integer.parseInt(str);
      vars.put(v1.toString(), i); return i;
    }
    public String toString() { return "read "+v1; }
  }
  static class Print extends Node {
    public Print(Node n1) { child.add(n1); }
    public int eval() {
      int v = child.get(0).eval(); System.out.println(v); return v;
    }
    public String toString() { return "print "+child.get(0); }
  }
  static class While extends Node {
    public While(Node n1, Node n2) { child.add(n1); child.add(n2); }
    public int eval() {
      int v = 0;
      while(child.get(0).eval() != 0) { v = child.get(1).eval(); }
      return v;
    }
    public String toString() {
      return "while("+child.get(0)+")"+child.get(1);
    }
  }
  static class If1 extends Node {
    public If1(Node n1, Node n2) { child.add(n1); child.add(n2); }
    public int eval() {
      int v = 0;
      if(child.get(0).eval() != 0) { v = child.get(1).eval(); }
      return v;
    }
    public String toString() { return "if("+child.get(0)+")"+child.get(1); }
  }
}