/** Visiteur de l'AST calculette. */ public class Evaluation extends AstVisitorDefault { /** Valeur de retour desvisit()!. */ static Integer RETOUR; /** Constructeur. */ public Evaluation(AstNode n) { n.accept(this); System.out.println("Visitor Evaluation = " + RETOUR); } /* visites : */ public void visit(ExpAff n) { n.e.accept(this); parser.symTab.put(n.v.name, RETOUR); } public void visit(ExpFor n) { n.n.accept(this); int max = RETOUR; for (int i=1; i<=max; i++) { parser.symTab.put(n.v.name, i); n.e.accept(this); } n.v.accept(this); } public void visit(ExpEntier n){ RETOUR = n.value; } public void visit(ExpFmax n){ Integer max = Integer.MIN_VALUE; for ( AstNode f : n.args ){ f.accept(this); if (RETOUR > max) max = RETOUR; } RETOUR = max; } public void visit(ExpFmin n){ n.e1.accept(this); Integer r1 = RETOUR; n.e2.accept(this); Integer r2 = RETOUR; if (r2 >r1) RETOUR = r1; else RETOUR = r2; } public void visit(ExpOpBin n){ n.e1.accept(this); Integer r1 = RETOUR; n.e2.accept(this); Integer r2 = RETOUR; switch (n.op) { case '+' : RETOUR = r1 + r2; return; case '-' : RETOUR = r1 - r2; return; case '*' : RETOUR = r1 * r2; return; case '/' : RETOUR = r1 / r2; return; case '%' : RETOUR = r1 % r2; return; } } public void visit(ExpVar n) { RETOUR = parser.symTabGet(n.name); } public void visit(ExpWhile n) { Integer res = -1; n.e1.accept(this); boolean cont = ( RETOUR !=0 ); while (cont) { n.e2.accept(this); res = RETOUR; n.e1.accept(this); cont= ( RETOUR !=0 ); } RETOUR = res; } }