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;
}
}
}
}