import java.util.*;

/**
 * Traduction du programme <a href="Prog3.java.html">Prog3</a>. Le point
 * important à noter est qu'un appel de fonction est ici représenté comme
 * un saut inconditionnel vers la première instruction de la fonction. Mais
 * cet appel (ce saut) est précédé du stockage du numéro de l'instruction
 * à laquelle il faudra revenir lorsque la fonction aura terminé son travail. Ce
 * numéro est trivialement le numéro de l'instruction qui suit l'appel!
 * On notera l'utilisation d'une pile pour stocker les appels, bien que cela
 * ne soit pas ici strictement nécessaire, dans le cas le plus général on ne
 * pourra s'en passer (attendre patiemment la suite du cours pour en savoir plus).
 * @author Jean-Baptiste Yunès
 * @date Février 2013
 */
public class Prog3Traduit {
  public static void main(String []args) {
    int instructionCourante = 1;
    Stack<Integer> pileDesRetours = new Stack<Integer>();
    while(true) {
      System.out.println(">>>>>>>"+instructionCourante); // Trace d'observation
      switch(instructionCourante) {
      case 1:
        System.out.println("Bonjour");
        instructionCourante++; break;
      case 2:
        pileDesRetours.push(3); // appel: stockage retour + saut
        instructionCourante=7; break;
      case 3:
        System.out.println("Ici");
        instructionCourante++; break;
      case 4:
        pileDesRetours.push(5); // appel: stockage retour + saut
        instructionCourante = 7; break;
      case 5:
        System.out.println("Au revoir");
        instructionCourante++; break;
      case 6:
        System.exit(0);
      case 7: // début de la fonction f
        System.out.println("Coucou");
        instructioCourante++; break;
      case 8: // retour: restauration du numéro d'instruction où revenir...
        instructionCourante = pileDesRetours.pop();
        break;
      }
    }
  }
}