public class SuiteTraduite {
  public static void main(String []args) {
    // memoire[0] : n
    // à partir de 1 c'est la pile
    // un appel consiste à:
    // - empiler l'adresse de retour
    // - réserver un emplacement pour la valeur de retour
    //   c'est la fonction qui lorsqu'elle aura déterminé la
    //   valeur la placera pour que l'appelant puisse la récupérer
    // - empiler dans l'ordre les paramètres transmis à la fonction
    //   ceux-ci sont utilisés par l'appel pour «travailler »
    int []memoire = new int[10000];
    int instruction = 1;
    int sommet = 1;
    memoire[0] = 5; // initialisation des globales
    while (true) {
      // affichage instruction courante
      System.out.println("Instruction courante="+instruction);
      // examen de la pile
      for (int i=1; i<sommet; i++) {
        System.out.print(memoire[i]+" ");
      }
      System.out.println();
      switch(instruction) {
      case 1: // appel à la fonction suite
        memoire[sommet] = 2; // instruction où revenir
        // réservation place pour valeur de retour
        memoire[sommet+2] = memoire[0];
        sommet += 3;
        instruction = 100; // saut vers début fonction suite
        break;
      case 2: // instruction qui suit l'appel à suite dans le main
        sommet -= 3; // suppression de la stack frame
        System.out.println("U("+memoire[0]+")="+memoire[sommet+1]);
        instruction++;
        break;
      case 3:
        System.exit(0);


      case 100: // debut de f
        if (memoire[sommet-1]==0) instruction++;
        else instruction = 102;
        break;
      case 101: // préparation du retour valeur de base
        memoire[sommet-2] = 1;
        instruction = memoire[sommet-3];
        break;
      case 102: // cas "général"
        memoire[sommet] = 103; // où revenir
        // emplacement valeur de retour
        memoire[sommet+2] = memoire[sommet-1]-1; // paramètre
        sommet += 3;
        instruction = 100; // saut debut de suite
        break;
      case 103:
        sommet -= 3; // suppression stack frame
        memoire[sommet-2] = memoire[sommet+1]+2; // valeur de retour
        instruction = memoire[sommet-3]; // retour à l'appelant
        break;
      }
    }
  }
}