// classe contenitore per i metodi

// va importato il package perche' siamo la di fuori di esso

import espressioni.*;

import java.util.*;

public class Valuta {

  public static Integer valuta(EspressioneIntera e, Map<String, Integer> m) {

    if(e instanceof EspressioneVariabile) {
      EspressioneVariabile v=(EspressioneVariabile) e;

      return m.get(v.getVar());
    }
    else if(e instanceof EspressioneSomma) {
      EspressioneSomma s=(EspressioneSomma) e;

      Iterator<EspressioneIntera> i=s.iterator();
      int somma=0;
      while(i.hasNext())
        somma+=valuta(i.next(), m);		// autobox

      return somma;				// autobox
    }
    else
      throw new RuntimeException("Tipo di EspressioneIntera non riconosciuto");

  }

// il metodo e' sovraccarico

  public static String valuta(EspressioneStringa e, Map<String, Integer> m) {

    if(e instanceof EspressioneSingola) {
      EspressioneSingola s=(EspressioneSingola) e;

      return s.getStringa();
    }
    else if(e instanceof EspressioneScelta) {
      EspressioneScelta s=(EspressioneScelta) e;

      int val=valuta(s.getCond(), m);		// valuta la condizione

      if(val==1)
        return valuta(s.getTrue(), m);
      else if(val==2)
        return valuta(s.getFalse(), m);
      else
        throw new RuntimeException("Valore non ammesso di EspressioneIntera nella valutazione di una EspressioneScelta: deve essere 1 oppure 2");
    }
    else
      throw new RuntimeException("Tipo di EspressioneStringa non riconosciuto");

  }



}


