import java.util.*;

/*
  Esp = INTERO        oppure 
        ( Esp + Esp ) oppure 
        ( Esp * Esp )
*/


class NodoBin {
  public String info;
  public NodoBin sinistro;
  public NodoBin destro;
}


public class EspressioniAritmetiche {
  // conversione in stringa di una espressione aritmetica 
  // rappresentata con alberi binari

  public static String esp2string(NodoBin e) {
    if (e == null) throw new RuntimeException("Esp non valida");
    
    if (e.sinistro == null && e.destro == null) 
      return e.info;
    else return "( " +
           esp2string(e.sinistro) + " " +
           e.info + " " +
           esp2string(e.destro) + " )";
  }

  // conversione di una string in una espressione aritmetica
  // rappresentata con alberi binari
  public static NodoBin string2esp(String s) {
    // s deve contenere una espressione aritmetica corretta con spazi
    // che separano i vari simboli
    StringTokenizer tks = new StringTokenizer(s);
    return string2esp(tks);
  }

  private static NodoBin string2esp(StringTokenizer tks) {
    String t = tks.nextToken(); 
    if (!t.equals("(")) {
      NodoBin e = new NodoBin();
      e.sinistro = null;
      e.info = t; // t = INTERO
      e.destro = null; 
      return e;
    }
    else {
      NodoBin e = new NodoBin();
      e.sinistro = string2esp(tks);
      e.info = tks.nextToken(); // t = "+" oppure t = "*"
      e.destro = string2esp(tks); 
      t = tks.nextToken(); // t =  ")"
      return e;
    }
  }

  public static int valuta(NodoBin e) {
    if (e == null) throw new RuntimeException("Esp non valida");
    
    if (e.sinistro == null && e.destro == null) 
      return Integer.parseInt(e.info);
    else {
      int val1 = valuta(e.sinistro);
      int val2 = valuta(e.destro);
      if (e.info.equals("+")) return val1 + val2;
      else if(e.info.equals("*")) return val1 * val2;
      else throw new RuntimeException("Esp non valida");
    }
  }

  public static void main(String[] args) {
    NodoBin e = string2esp("( ( 10 + 2 ) * 2 )");
    //NodoBin e = string2esp(args[0]); 
    //          Nota: usare "'" per racchiudere la stringa in input  
    System.out.println(esp2string(e) + " = " + valuta(e));
  }

}
