<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package mil;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;

import java.util.HashMap;
import java.util.List;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.math.BigInteger;

public class InterpMIL {

   private static final BufferedReader entree = 
      new BufferedReader( 
         new InputStreamReader(System.in) ); 
         
   protected Prog programme;
   private HashMap&lt;String, BigInteger&gt; memoire ;

   public InterpMIL (Prog p) {
   
      memoire = new HashMap&lt;String, BigInteger&gt;();
      programme = p;

      List&lt;Var&gt; vars = p.getVariables().getVar();
//      System.out.println(vars.size());
      for( Var v : vars ){
            memoire.put(v.getNom(), null);
      }
   }// constructeur
   
   public void exec (Prog p){
   	exec ( p.getSequence() );
   }// exec (Prog)
   
   protected void exec (TypSeq seq) {
      List&lt;Object&gt; instrs = seq.getInst();
      for( Object i : instrs ){
         if( i instanceof Affectation ){
            exec( (Affectation) i );
         }else{
         if( i instanceof Lecture ){
            exec( (Lecture) i );
         }else{
         if( i instanceof Ecriture ){
            exec( (Ecriture) i );
         }else{
         if( i instanceof Boucle ){
            exec( (Boucle) i );
         }else{
         if( i instanceof Conditionnelle ){
            exec( (Conditionnelle) i );
         }else{
         if( i instanceof Espace ){
            exec( (Espace) i );
         }else{
         if( i instanceof Ligne ){
            exec( (Ligne) i );
         }else{
             System.out.println("Instruction inconnue") ;
         }}}}}}}}
  }// exec (Sequence)
  
  protected void exec (Affectation aff){
    memoire.put(aff.getVar().getNom(), evalar(aff.getExpAr())) ;
  }// exec (Affectation)
  
  protected void exec (Lecture lec){
	String nv = lec.getVar().getNom();
    System.out.println("Valeur de "+nv+" ?") ;
    BigInteger lu;
    try{
    	lu = new BigInteger(entree.readLine());
    }catch (IOException e){
    	System.out.println("Erreur en lecture");
        lu = new BigInteger("0");
    }catch (NumberFormatException e) {
        System.out.println("Nombre incorrect");
        lu = new BigInteger("0");
    }
    memoire.put(nv, lu);
  }// exec (Lecture)
  
  protected void exec (Ecriture ec){
  	System.out.print(evalar(ec.getExpAr())); // sans saut de ligne
  }// exec (Ecriture)
  
  protected void exec (Espace ec){
  	System.out.print(" "); // sans saut de ligne
  }// exec (Espace)
  
  protected void exec (Ligne ec){
  	System.out.println();
  }// exec (Ligne)
  
  protected void exec (Boucle bcl){
	Comparaison cmp = bcl.getComparaison();
  	while( evalbool(cmp) ){
  		exec (bcl.getSequence());
  	}	
  }// exec (Boucle)
  
  protected void exec (Conditionnelle cnd){
	Comparaison cmp = cnd.getComparaison();
  	if( evalbool(cmp) ){
  		exec (cnd.getAltSiVrai());
  	}else{
  		exec (cnd.getAltSiFaux());
  	}	
  }// exec (Conditionnelle)
  
  protected BigInteger evalar (TypExp ex) {
  	Cte ct = ex.getCte() ;
  	if( ct != null ){// System.out.println("Cte ")
  		return ct.getVal();
  	}
  	VarExp ve = ex.getVarExp();
  	if( ve != null ){// System.out.println("VarExp "
  		String nv = ve.getVar().getNom();
  		BigInteger res = memoire.get(nv);
  		if( res == null ){
  			System.out.println("Variable non initialisÃ©e : "+nv);
            res = new BigInteger("0");
        }
        return res;
    }
  	Bin bi = ex.getBin();
  	//System.out.println("Bin "+bi.getOp());
  	char op = bi.getOp().charAt(0);
  	BigInteger og = evalar(bi.getOpGauche());
  	BigInteger od = evalar(bi.getOpDroit());
  	BigInteger res = new BigInteger("0");
  	switch( op ){
  		case '+' : res = og.add(od); break;
  		case '*' : res = og.multiply(od); break;
  	 	case '-' : res = og.subtract(od); break;
   		case '/' : res = og.divide(od);
   	}
   	return res;
 }// evalar 	
  
 protected boolean evalbool (Comparaison cmp){
 	BigInteger tg = evalar(cmp.getTermeGauche());
  	BigInteger td = evalar(cmp.getTermeDroit());
  	String rel = cmp.getOp();
  	
  	//System.out.println(rel+ "!!!"+tg + "////" +td);
  	
  	boolean res = true;
  	if( rel.equals("=") ){
  		res = tg.compareTo(td) == 0;
  	}else{  	
  	if( rel.equals("&gt;") ){
  		res = tg.compareTo(td) &gt; 0;
  	}else{
  	if( rel.equals("&lt;") ){
  		res = tg.compareTo(td) &lt; 0;
  	}else{  	
  	if( rel.equals("&gt;=") ){
  		res = tg.compareTo(td) &gt;= 0;
  	}else{
  	if( rel.equals("&lt;=") ){
  		res = tg.compareTo(td) &lt;= 0;
  	}else{
  	if( rel.equals("&lt;&gt;") ){
  		res = tg.compareTo(td) != 0;
  	}}}}}}
  	return res;
  }
//===============================================================

  public static void main (String[] args) throws Exception{
  
  	String fichIn = args[0]; // programme MIL en XML
  	
    JAXBContext jc = JAXBContext.newInstance("mil");
    Unmarshaller um = jc.createUnmarshaller();
    Prog p = (Prog) um.unmarshal(new FileInputStream(fichIn));
    InterpMIL inter = new InterpMIL(p);
    inter.exec(p);
  }// main
  
}//  InterpMIL</pre></body></html>