/**
 * Programme traduit en langage machine illustrant la traduction d'une alternative.
 * L'alternative consiste à linéariser une graphe planaire. L'alternative est
 * un embranchement (conditionné) suivi par une jointure (les voies se rejoignent).
 * L'embranchement et la jointure sont réalisées via des sauts en des points précis
 * dans le code machine.
 *
 * Exercice : certains saut sont calculés inutilement. Lesquels ? Les supprimer.
 * Exercice : cette traduction utilise un décalage systématique pour les saut car
 * il a été choisi d'utiliser une mécanique systématique d'incrémentation du
 * pointeur d'instruction. Un autre choix est possible qui rend inutile ce décalage.
 * Lequel ? Réécrire le programme de façon à faire disparaître le décalage.
 * Exercice : traduire un if sans else
 * Exercice : traduire une boucle for
 * Exercice : traduire une boucle while
 */
public class s2traduit {
  public static void main(String []a) {
    // i:0, j:1
    int []memoire = new int[2];
    int instructionCourante = 1;
    boolean fin = false;
    while (!fin) {
      switch(instructionCourante) {
      case 1: // traduction de i=0;
        memoire[0] = 0;
        break;
      case 2: // traduction de if (i==0) aller à la séquence "test vrai"; sinon aller à la séquence "test faux" (embranchement)
        if (memoire[0]==0) {
          instructionCourante = 3-1; // la première instruction de la séquence "test vrai" est de numéro 3, mais attention la machine est concue pour systématique ajouter un au pointeur d'instruction lorsqu'une instruction est terminée; on tiens compte de ce décalage en enleveant 1 à la valeur souhaitée...
        } else {
          instructionCourante = 5-1; // la première instruction de la séquence "test faux" est de numéro 5; attention au décalage...
        }
        break;
      case 3: // traduction de la séquence j=1; i=i+j;
        memoire[1] = 1;
        break;
      case 4:
        memoire[0] = memoire[0]+memoire[1];
        instructionCourante = 7-1; // attention fin de la séquence, donc saut vers la suite (jointure)
        break;
      case 5: // traduction de la séquence j=1; i=j*i
        memoire[1] = 2;
        break;
      case 6:
        memoire[0] = memoire[1]*memoire[0];
        instructionCourante = 7-1; // attention fin de la séquence, donc saut vers la jointure
        break;
      case 7: // traduction de System.out.println(i+" "+j);
        System.out.println(memoire[0]+" "+memoire[1]);
        break;
      case 8: // fin
        fin = true;
        break;
      }
      instructionCourante++;
    }
  }
}