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