/* une idée


/** 
 *
 * @author  MR DAZY
 * @version 1.0
 */

public abstract interface Visiteur{
  public abstract Object visiteEntier(Entier n);
  public abstract Object visiteInverse(Inverse i);
  public abstract Object visiteAddition(Addition a);
  public abstract Object visiteSoustraction(Soustraction s);
  public abstract Object visiteMultiplication(Multiplication m);
  public abstract Object visiteDivision(Division d);
  public abstract Object visiteSuccesseur(Successeur s);
  public abstract Object visitePredecesseur(Predecesseur p);
}

/** * * @author MR DAZY * @version 1.0 */ public class VisiteurParDefaut implements Visiteur{ public Object visiteEntier(Entier n) {return n;} public Object visiteInverse(Inverse i) {return i;} public Object visiteAddition(Addition a) {return a;} public Object visiteSoustraction(Soustraction s) {return s;} public Object visiteMultiplication(Multiplication m){return m;} public Object visiteDivision(Division d) {return d;} public Object visiteSuccesseur(Successeur s) {return s;} public Object visitePredecesseur(Predecesseur p) {return p;} }
/* * VisiteurEvaluation.java * * @author MR DAZY * @version 1.0 */ public class VisiteurEvaluation extends VisiteurParDefaut { public Object visiteEntier(Entier n){ return new Integer(n.n); } public Object visiteInverse(Inverse i){ return new Integer(-evalExpr(i.e)); } public Object visiteAddition(Addition a){ return new Integer(evalExpr(a.e1)+evalExpr(a.e2)) ; } public Object visiteSoustraction(Soustraction s){ return new Integer(evalExpr(s.e1)-evalExpr(s.e2)) ; } public Object visiteMultiplication(Multiplication m){ return new Integer(evalExpr(m.e1)*evalExpr(m.e2)) ; } public Object visiteDivision(Division d){ return new Integer(evalExpr(d.e1)/evalExpr(d.e2)) ; } public Object visiteSuccesseur(Successeur s){ return new Integer(evalExpr(s.e)+1) ; } public Object visitePredecesseur(Predecesseur p){ return new Integer(evalExpr(p.e)-1) ; } /** * methodes de service */ public int evalExpr(Expression e){ Visiteur v = new VisiteurEvaluation(); return ((Integer)e.accept(v)).intValue(); } }
/** vision Objet des expressions entières... * * @see ExpressionSimple , ExpressionComposee * @author dazy */ public abstract class Expression { /** Schéma de méthode imposé pour l'évaluation des expressions */ /** toutes les actions sur les feuilles de la structure * sont regroupées dans les visiteurs */ public abstract Object accept(Visiteur v); } /* end class Expression */
/** Expression Composée : contient 2 sous expressions * * @see OtherClasses * @author dazy */ public class Addition extends ExpressionBinaire { Addition(Expression e1 , Expression e2){ super(e1,e2); } /** toutes les actions sur les feuilles de la structure * sont regroupées dans les visiteurs */ public Object accept(Visiteur v){ return v.visiteAddition(this); } } /* end class Addition */
/* * Successeur.java * * @author MR DAZY * @version 1.0 */ public class Successeur extends ExpressionUnaire { /** Creates new Suc */ public Successeur(Expression e) { super(e); } /** toutes les actions sur les feuilles de la structure * sont regroupées dans les visiteurs */ public Object accept(Visiteur v){ return v.visiteSuccesseur(this); } } /* end class Successeur */
/* * VisiteurSimplication.java * * @author MR DAZY * @version 1.0 */ public class VisiteurSimplication extends VisiteurParDefaut { public Object visiteAddition(Addition a){ if ((a.e1 instanceof Entier) && (((Entier)a.e1).n == 1)){ return new Successeur(a.e2); }else{ if ((a.e2 instanceof Entier) && (((Entier)a.e2).n == 1)){ return new Successeur(a.e1); }else{return a;} } } public Object visiteSoustraction(Soustraction s){ if ((s.e1 instanceof Entier) && (((Entier)s.e1).n == 1)){ return new Predecesseur(s.e2); }else{ if ((s.e1 instanceof Entier) && (((Entier)s.e1).n == 1)){ return new Predecesseur(s.e1); }else{return s;} } } }