import java.util.*;
import linguaggio.*;

class ServiziProgrammi {

// in questo caso, la stampa si puo' fare semplicemente
// invocando il metodo toString; non e' detto che si faccia
// sempre cosi'

  static void stampa(Istruzione i) {
    System.out.println(i);
  }


// metodo che ha come argomento una mappa; consideriamo la
// versione con tipi specifici

  static void esegui(Istruzione e, Map<Variabile,Boolean> m) {

// prima cosa: di che tipo e' l'istruzione?
// dove possibile, occorre evitare di agire diversamente a
// seconda del tipo specifico di una variabile di classe
// astratta, ma in questo caso non c'e' altro modo

// nel caso di una istruzione di stampa, si stampa la
// stringa corrispondente

    if(e instanceof IstruzioneStampa) {
      IstruzioneStampa s=(IstruzioneStampa) e;
      System.out.println(s.getStr());
    }

    if(e instanceof IstruzioneSequenza) {
      IstruzioneSequenza s=(IstruzioneSequenza) e;
      Iterator<Istruzione> i=s.iterator();

      while(i.hasNext())
        esegui(i.next(), m);
    }

    if(e instanceof IstruzioneIf) {
      IstruzioneIf s=(IstruzioneIf) e;
      Variabile v=s.getCond();

      Boolean b=m.get(v);

      if(b)
        esegui(s.getThen(), m);
      else
        esegui(s.getElse(), m);
    }

// errore: es. si puo' lanciare una eccezione
 
  }
}

