/**
 * Version "optimisée" de Prog5Traduit.java
 * fact prend un paramètre et renvoie une valeur de retour, le bloc/frame est de taille 3
 * Par conséquent on "optimise" un peu la gestion de la pile
 */
public class Prog5Traduit2 {
  public static void main(String []args) {
    int []memoire = new int[1000];
    int instruction=1;
    int sommetDePile=0;
    while (true) {
      switch(instruction) {
      case 1:
        sommetDePile = sommetDePile+3; // création VR+AR+param
        memoire[sommetDePile-2] = 2;   // AR=2 
        memoire[sommetDePile-1] = 10;  // param=10
        instruction = 100; break;
      case 2:
        System.out.println("10!="+memoire[sommetDePile-1]);
        sommetDePile = sommetDePile-1; // suppression VR
        instruction++; break;
      case 3:
        System.exit(0);

      case 100: // if (n==1)
        System.out.println("fact("+memoire[sommetDePile-1]+")");
        if (memoire[sommetDePile-1]==1) instruction++;
        else instruction = 102;
        break;
      case 101: // return 1
        instruction = memoire[sommetDePile-2]; // récupère AR
        sommetDePile = sommetDePile-2; // suppression AR+param
        memoire[sommetDePile-1] = 1;   // VR=1
        break;
      case 102: // int r
        sommetDePile = sommetDePile+1; // création de 'r'
        instruction++; break;
      case 103: // fact(n-1)
        sommetDePile = sommetDePile+3; // création VR+AR+param
        memoire[sommetDePile-2] = 104; // AR=104
        memoire[sommetDePile-1] = memoire[sommetDePile-5]-1; // n-1
        instruction = 100; break;
      case 104: // r = ...
        memoire[sommetDePile-2] = memoire[sommetDePile-1];
        sommetDePile = sommetDePile-1; // suppression VR
        instruction++; break;
      case 105:
        sommetDePile = sommetDePile-1; // suppression r
        instruction = memoire[sommetDePile-2]; //récupère AR
        memoire[sommetDePile-3] = memoire[sommetDePile-1]*memoire[sommetDePile]; // VR=n*r
        sommetDePile = sommetDePile-2;
        break;
      }        
    }
  } 
}