package serviziesprbooleane;

// questa classe usa il package esprbooleane, quindi lo deve importare

import esprbooleane.*;

// questa classe usa Map

import java.util.*;

public class ServiziEsprBooleane {

  public static boolean valuta(EspressioneBooleana e, Map a) {
    if(e instanceof EspressioneCostante) {
      EspressioneCostante ec=(EspressioneCostante) e;

      return ec.getValore();
    }

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

      String n=ev.getNome();

      Boolean val=(Boolean) a.get(n);

      return val.booleanValue();
    }

    if(e instanceof EspressioneAnd) {
      EspressioneAnd ea=(EspressioneAnd) e;
      Iterator<EspressioneBooleana> i=ea.iteratoreAnd();

      while(i.hasNext())
        if(!valuta(i.next(), a))
          return false;

      return true;
    }

    if(e instanceof EspressioneOr) {
      EspressioneOr eo=(EspressioneOr) e;

      EspressioneBooleana p=eo.getPrima();
      EspressioneBooleana s=eo.getSeconda();

      return valuta(p, a) || valuta(s, a);
    }

    throw new RuntimeException("Sottoclasse di EspressioneBooleana non prevista nel metodo valuta");
  }

}
