public class ProgAppelFonctionTraduit2 {
  public static int []memoire = new int[2];
  // 0 : sert à stocker l'adresse à laquelle il faudra
  // revenir quand l'appel à f() sera terminé
  // 1 : sert à stocker l'adresse à laquelle il faudra
  // revenir quand l'appel à g() sera terminé
  public static int insC;
  public static void main(String []a) {
    insC = 1;
    while (true) {
      switch(insC) {
        // traduction du main du programme original
      case 1:
        System.out.println("debut");
        insC++; break;
      case 2:
        memoire[0] = insC+1; // stockage point de retour f
        insC = 8; break; // saut vers 1ere instruction de f()
      case 3:
        System.out.println("entre les deux appels");
        insC++; break;
      case 4:
        memoire[0] = insC+1; // stockage point de retour f
        insC = 8; break; // saut vers 1ere ins de f();
      case 5:
        System.out.println("a la fin");
        insC++; break;
      case 6:
        memoire[1] = insC+1; // stockage retour g
        insC = 11; break; // saut 1ere ins g
      case 7:
        System.exit(0);



        
        // traduction de la fonction f
      case 8:
        System.out.println("je suis dans f()");
        insC++; break;
      case 9:
        memoire[1] = insC+1; // stockage retour g
        insC = 11; break; // saut vers 1ere ins g
      case 10:
        insC = memoire[0]; break; // retour point d'appel


        // traduction g
      case 11:
        System.out.println("dans g()");
        insC = memoire[1]; break; // retour point d'appel
      }
    }
  }
}