diff --git a/AST/AST.java b/AST/AST.java
index f30471767ef46d5ffe5a3c806085c21d51fe8166..badfadc9ff74a213aa478a5f81c8a9133f01eab1 100644
--- a/AST/AST.java
+++ b/AST/AST.java
@@ -1,3 +1,4 @@
+
 package AST;
 import java.util.Deque;
 import java.util.ArrayDeque;
diff --git a/AST/Assignment.java b/AST/Assignment.java
new file mode 100644
index 0000000000000000000000000000000000000000..85482ba80db9c5eaf059db4278893e6e694dc0e8
--- /dev/null
+++ b/AST/Assignment.java
@@ -0,0 +1,24 @@
+package AST;
+
+// Classe pour représenter une affectation de variable
+public class Assignment extends ExpressionA {
+    private String varName;
+    private ExpressionA expression;
+
+    public Assignment(String varName, ExpressionA expr) {
+        this.varName = varName;
+        this.expression = expr;
+    }
+
+    @Override
+    public String toAssembly() {
+        return expression.toAssembly() + "SetVar " + varName + "\n";
+    }
+
+    
+    public Object evaluate() {
+        Object value = expression.evaluate();
+        SymbolTable.assignVariable(varName, value);
+        return value;
+    }
+}
diff --git a/AST/Bool.java b/AST/Bool.java
index 27652641fcb9e8f9cd7a1fc34951adede4dffee4..2272a4994eae24baf63158c50d66a448c66fab42 100644
--- a/AST/Bool.java
+++ b/AST/Bool.java
@@ -13,4 +13,9 @@ public class Bool extends ExpressionA {
     public String toAssembly() {
         return "CsteBo " + num+"\n";
     }
+
+     @Override
+    public Object evaluate() {
+        return num;
+    }
 }
diff --git a/AST/Commande.java b/AST/Commande.java
index 6c6ea437c6e153b80f55132c31b03a363d38b4f9..48a8a7656261c621ea8138e4c4c7234157a4133a 100644
--- a/AST/Commande.java
+++ b/AST/Commande.java
@@ -1,4 +1,6 @@
 package AST;
 public abstract class Commande extends AST{
     public abstract String toAssembly();
-}
\ No newline at end of file
+}
+
+
diff --git a/AST/Div.java b/AST/Div.java
index 5aa829622d633efd542ecfb54df08a22842cd85b..e9306b577190004d32c783f70c75c17df727f1d3 100644
--- a/AST/Div.java
+++ b/AST/Div.java
@@ -12,4 +12,23 @@ public class Div extends ExpressionA_Binaire {
     public String toAssembly() {
         return gauche.toAssembly() + droite.toAssembly() + "DivNb\n";
     }
+
+    @Override
+    public Object evaluate() {
+        Object leftValue = gauche.evaluate();
+        Object rightValue = droite.evaluate();
+
+        if (leftValue instanceof Integer && rightValue instanceof Integer) {
+            return (Integer) leftValue / (Integer) rightValue;
+        } else if (leftValue instanceof Float && rightValue instanceof Float) {
+            return (Float) leftValue / (Float) rightValue;
+        } else if (leftValue instanceof Integer && rightValue instanceof Float) {
+            return (Integer) leftValue / (Float) rightValue;
+        } else if (leftValue instanceof Float && rightValue instanceof Integer) {
+            return (Float) leftValue / (Integer) rightValue;
+        } else {
+            throw new RuntimeException("Unsupported types for Div operation: " 
+                + leftValue.getClass().getName() + " and " + rightValue.getClass().getName());
+        }
+    }
 }
diff --git a/AST/DoWhileCommand.java b/AST/DoWhileCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..c3e7629f1f7bfcf3f4e18bbe7ebb1e9309cfac91
--- /dev/null
+++ b/AST/DoWhileCommand.java
@@ -0,0 +1,18 @@
+package AST;
+
+// Classe pour représenter une variable
+public class DoWhileCommand extends Commande {
+    private ExpressionA cond;
+    private Commande cmd;
+
+    public DoWhileCommand(Commande cmd, ExpressionA expr) {
+        this.cmd=cmd;
+        this.cond=expr;
+    }
+    @Override
+    public String toAssembly() {
+        String s = (this.cmd).toAssembly();
+        String c = (this.cond).toAssembly();
+        return s + c + "ConJmp -" + (Tools.countNewLines(s) + Tools.countNewLines(c)-1) + "\n";
+    }
+}
diff --git a/AST/Egal.java b/AST/Egal.java
index 4a61e077a231a3496b8ba643340674e487e1a645..2d6f6d87c7858c839036ce9083c9f530956338ac 100644
--- a/AST/Egal.java
+++ b/AST/Egal.java
@@ -12,4 +12,21 @@ public class Egal extends ExpressionA_Binaire {
     public String toAssembly() {
         return gauche.toAssembly() + droite.toAssembly() + "Equals\n";
     }
+
+    @Override
+    public Object evaluate() {
+        Object leftValue = gauche.evaluate();
+        Object rightValue = droite.evaluate();
+
+        if (leftValue == null || rightValue == null) {
+            return leftValue == rightValue;
+        }
+
+        if (!leftValue.getClass().equals(rightValue.getClass())) {
+            throw new RuntimeException("Cannot compare values of different types: " 
+                + leftValue.getClass().getName() + " and " + rightValue.getClass().getName());
+        }
+
+        return leftValue.equals(rightValue);
+    }
 }
diff --git a/AST/EmptyCommand.java b/AST/EmptyCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..909bd311cd6e8572097b7c688c84601a7d97b8a0
--- /dev/null
+++ b/AST/EmptyCommand.java
@@ -0,0 +1,10 @@
+package AST;
+
+public class EmptyCommand extends Commande{
+    public EmptyCommand(){}
+
+    @Override
+    public String toAssembly(){
+        return "";
+    }
+}
\ No newline at end of file
diff --git a/AST/Et.java b/AST/Et.java
index f0ff6e286338510a7c9a4e30536358eb286e2818..81d3b60cd769dfe83728b9c4fade631d6d9aa241 100644
--- a/AST/Et.java
+++ b/AST/Et.java
@@ -12,4 +12,17 @@ public class Et extends ExpressionA_Binaire {
     public String toAssembly() {
         return gauche.toAssembly() +"ConJmp "+Tools.countNewLines(droite.toAssembly())+"\n"+ droite.toAssembly() + "Jump 2\n"+"CstBo False\n";
     }
+
+    @Override
+    public Object evaluate() {
+        Object leftValue = gauche.evaluate();
+        Object rightValue = droite.evaluate();
+
+        if (leftValue instanceof Boolean && rightValue instanceof Boolean) {
+            return (Boolean) leftValue && (Boolean) rightValue;
+        } else {
+            throw new RuntimeException("Unsupported types for Et operation: " 
+                + leftValue.getClass().getName() + " and " + rightValue.getClass().getName());
+        }
+    }
 }
diff --git a/AST/ExpressionA.java b/AST/ExpressionA.java
index f453d8084c6b6275cb1efa29adee1cb2a79f737e..10f91a237b6a46c92ac9d07b8233bc87b3d2f658 100644
--- a/AST/ExpressionA.java
+++ b/AST/ExpressionA.java
@@ -1,6 +1,5 @@
 package AST;
 
 public abstract class ExpressionA extends Commande {
-    // un jour il y aura d'autres choses ici
-    //public abstract String toAssembly();
+    public abstract Object evaluate();
 }
diff --git a/AST/ExpressionA_Binaire.java b/AST/ExpressionA_Binaire.java
index 2fb339e132d482ffbe795925308ba7d003ff21c3..c270213aff7788452350d5509c42171fb6b846fc 100644
--- a/AST/ExpressionA_Binaire.java
+++ b/AST/ExpressionA_Binaire.java
@@ -16,4 +16,6 @@ abstract class ExpressionA_Binaire extends ExpressionA {
   public String toString() {
     return String.format("%1$s(%2$s,%3$s)", symbole(), gauche.toString(), droite.toString());
   }
+
+  public abstract Object evaluate();
 }
diff --git a/AST/FloatT.java b/AST/FloatT.java
index ae7215bd75ccf218a0a036cbac32e597d2e60e4a..c3eb2964a16dfe4ffd6fbb11d9243f53b81ddf78 100644
--- a/AST/FloatT.java
+++ b/AST/FloatT.java
@@ -19,4 +19,9 @@ public class FloatT extends ExpressionA {
     public String toAssembly() {
         return "CsteNb " + this.arg + "\n";
     }
+
+    @Override
+    public Object evaluate() {
+        return this.arg;
+    }
 }
diff --git a/AST/GrEgNb.java b/AST/GrEgNb.java
index 03c2aab41852088fb0ee091131cb72cdf6f280db..955f1ea8390ce547310c9348f267ab406bd3067c 100644
--- a/AST/GrEgNb.java
+++ b/AST/GrEgNb.java
@@ -12,4 +12,23 @@ public class GrEgNb extends ExpressionA_Binaire {
     public String toAssembly() {
         return gauche.toAssembly() + droite.toAssembly() + "GrEqNb\n";
     }
+
+     @Override
+    public Object evaluate() {
+        Object leftValue = gauche.evaluate();
+        Object rightValue = droite.evaluate();
+
+        if (leftValue instanceof Integer && rightValue instanceof Integer) {
+            return (Integer) leftValue >= (Integer) rightValue;
+        } else if (leftValue instanceof Float && rightValue instanceof Float) {
+            return (Float) leftValue >= (Float) rightValue;
+        } else if (leftValue instanceof Integer && rightValue instanceof Float) {
+            return (Integer) leftValue >= (Float) rightValue;
+        } else if (leftValue instanceof Float && rightValue instanceof Integer) {
+            return (Float) leftValue >= (Integer) rightValue;
+        } else {
+            throw new RuntimeException("Unsupported types for GrEqNb operation: " 
+                + leftValue.getClass().getName() + " and " + rightValue.getClass().getName());
+        }
+    }
 }
diff --git a/AST/GrStNb.java b/AST/GrStNb.java
index 4db76e1b9428f07fab22b899a3b90dc0a540e6f4..8f6458d0253446154a6e0b665e409afe927ac908 100644
--- a/AST/GrStNb.java
+++ b/AST/GrStNb.java
@@ -12,4 +12,23 @@ public class GrStNb extends ExpressionA_Binaire {
     public String toAssembly() {
         return gauche.toAssembly() + droite.toAssembly() + "GrStNb\n";
     }
+
+    @Override
+    public Object evaluate() {
+        Object leftValue = gauche.evaluate();
+        Object rightValue = droite.evaluate();
+
+        if (leftValue instanceof Integer && rightValue instanceof Integer) {
+            return (Integer) leftValue > (Integer) rightValue;
+        } else if (leftValue instanceof Float && rightValue instanceof Float) {
+            return (Float) leftValue > (Float) rightValue;
+        } else if (leftValue instanceof Integer && rightValue instanceof Float) {
+            return (Integer) leftValue > (Float) rightValue;
+        } else if (leftValue instanceof Float && rightValue instanceof Integer) {
+            return (Float) leftValue > (Integer) rightValue;
+        } else {
+            throw new RuntimeException("Unsupported types for GrStNb operation: " 
+                + leftValue.getClass().getName() + " and " + rightValue.getClass().getName());
+        }
+    }
 }
diff --git a/AST/Ident.java b/AST/Ident.java
index 204efa21bfbc766cd21aa5a5a887cc97169158a5..264cf28efe594c6f924963498a81f5dee355fc16 100644
--- a/AST/Ident.java
+++ b/AST/Ident.java
@@ -9,6 +9,10 @@ public class Ident extends ExpressionA{
     }
 
     public String toAssembly() {
-        return  "" ;
+        return  "GetVar " + this.arg + "\n";
+    }
+    @Override
+    public Object evaluate() {
+        return SymbolTable.getVariable(arg);
     }
 }
\ No newline at end of file
diff --git a/AST/IfElseCommand.java b/AST/IfElseCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..042def16b18ce4b4353dbab33cd96dbf5a7f2173
--- /dev/null
+++ b/AST/IfElseCommand.java
@@ -0,0 +1,26 @@
+package AST;
+
+// Classe pour représenter une commande if-then-else
+public class IfElseCommand extends Commande {
+    private ExpressionA condition;
+    private Commande trueBranch;
+    private Commande falseBranch;
+
+    public IfElseCommand(ExpressionA condition, Commande trueBranch, Commande falseBranch) {
+        this.condition = condition;
+        this.trueBranch = trueBranch;
+        this.falseBranch = falseBranch;
+    }
+
+    @Override
+    public String toAssembly() {
+
+        String t = trueBranch.toAssembly();
+        String f = falseBranch.toAssembly();
+        String e = this.condition.toAssembly();
+
+
+
+        return e + "Conjmp "+ Tools.countNewLines(t) +"\n"+ t + "Jump "+ Tools.countNewLines(f) + "\n" + t ;
+    }
+}
diff --git a/AST/LoEqNb.java b/AST/LoEqNb.java
index fd6a521a0f13da6554de3c4de888a8e8e6ba6664..2cb6794e427ffcbb2960451b137fd74aa8e36bff 100644
--- a/AST/LoEqNb.java
+++ b/AST/LoEqNb.java
@@ -12,4 +12,22 @@ public class LoEqNb extends ExpressionA_Binaire {
     public String toAssembly() {
         return gauche.toAssembly() + droite.toAssembly() + "LoEqNb\n";
     }
+    @Override
+    public Object evaluate() {
+        Object leftValue = gauche.evaluate();
+        Object rightValue = droite.evaluate();
+
+        if (leftValue instanceof Integer && rightValue instanceof Integer) {
+            return (Integer) leftValue <= (Integer) rightValue;
+        } else if (leftValue instanceof Float && rightValue instanceof Float) {
+            return (Float) leftValue <= (Float) rightValue;
+        } else if (leftValue instanceof Integer && rightValue instanceof Float) {
+            return (Integer) leftValue <= (Float) rightValue;
+        } else if (leftValue instanceof Float && rightValue instanceof Integer) {
+            return (Float) leftValue <= (Integer) rightValue;
+        } else {
+            throw new RuntimeException("Unsupported types for LoEqNb operation: " 
+                + leftValue.getClass().getName() + " and " + rightValue.getClass().getName());
+        }
+    }
 }
diff --git a/AST/LoStNb.java b/AST/LoStNb.java
index 953f9624d946c854bc166e9cc9ba787dd42eb740..c2bce2bd5b6d4406a31c872507e10c1b9d5cc3bf 100644
--- a/AST/LoStNb.java
+++ b/AST/LoStNb.java
@@ -12,4 +12,24 @@ public class LoStNb extends ExpressionA_Binaire {
     public String toAssembly() {
         return gauche.toAssembly() + droite.toAssembly() + "LoStNb\n";
     }
+
+
+    @Override
+    public Object evaluate() {
+        Object leftValue = gauche.evaluate();
+        Object rightValue = droite.evaluate();
+
+        if (leftValue instanceof Integer && rightValue instanceof Integer) {
+            return (Integer) leftValue < (Integer) rightValue;
+        } else if (leftValue instanceof Float && rightValue instanceof Float) {
+            return (Float) leftValue < (Float) rightValue;
+        } else if (leftValue instanceof Integer && rightValue instanceof Float) {
+            return (Integer) leftValue < (Float) rightValue;
+        } else if (leftValue instanceof Float && rightValue instanceof Integer) {
+            return (Float) leftValue < (Integer) rightValue;
+        } else {
+            throw new RuntimeException("Unsupported types for LoStNb operation: " 
+                + leftValue.getClass().getName() + " and " + rightValue.getClass().getName());
+        }
+    }
 }
diff --git a/AST/Modulo.java b/AST/Modulo.java
index b02615f3782638f78ebcd67c4f2b9c116a1c3ad1..506f5e8452ce1ac3bc2ed83369c106d71a27bed4 100644
--- a/AST/Modulo.java
+++ b/AST/Modulo.java
@@ -8,4 +8,23 @@ public class Modulo extends ExpressionA_Binaire {
     public String toAssembly() {
         return gauche.toAssembly() + droite.toAssembly() + "ModuNb\n";
     }
+
+    @Override
+    public Object evaluate() {
+        Object leftValue = gauche.evaluate();
+        Object rightValue = droite.evaluate();
+
+        if (leftValue instanceof Integer && rightValue instanceof Integer) {
+            return (Integer) leftValue % (Integer) rightValue;
+        } else if (leftValue instanceof Float && rightValue instanceof Float) {
+            return (Float) leftValue % (Float) rightValue;
+        } else if (leftValue instanceof Integer && rightValue instanceof Float) {
+            return (Integer) leftValue % (Float) rightValue;
+        } else if (leftValue instanceof Float && rightValue instanceof Integer) {
+            return (Float) leftValue % (Integer) rightValue;
+        } else {
+            throw new RuntimeException("Unsupported types for Modulo operation: " 
+                + leftValue.getClass().getName() + " and " + rightValue.getClass().getName());
+        }
+    }
 }
diff --git a/AST/Moins.java b/AST/Moins.java
index 76182ca95966da15cfdfccec3d9fbbb161fb5e16..025f82d49a2edc05febefd2153e43bcefd8b2958 100644
--- a/AST/Moins.java
+++ b/AST/Moins.java
@@ -8,4 +8,23 @@ public String symbole() {return "moins";};
     public String toAssembly() {
         return gauche.toAssembly() + droite.toAssembly() + "SubiNb\n";
     }
+
+@Override
+    public Object evaluate() {
+        Object leftValue = gauche.evaluate();
+        Object rightValue = droite.evaluate();
+
+        if (leftValue instanceof Integer && rightValue instanceof Integer) {
+            return (Integer) leftValue - (Integer) rightValue;
+        } else if (leftValue instanceof Float && rightValue instanceof Float) {
+            return (Float) leftValue - (Float) rightValue;
+        } else if (leftValue instanceof Integer && rightValue instanceof Float) {
+            return (Integer) leftValue - (Float) rightValue;
+        } else if (leftValue instanceof Float && rightValue instanceof Integer) {
+            return (Float) leftValue - (Integer) rightValue;
+        } else {
+            throw new RuntimeException("Unsupported types for Moins operation: " 
+                + leftValue.getClass().getName() + " and " + rightValue.getClass().getName());
+        }
+    }
 }
diff --git a/AST/Mult.java b/AST/Mult.java
index 5c5c8044114d8200d50583ac4736e173b120aa81..02a76f549be9d6f3ca7c7614bdcd2d25efc0d707 100644
--- a/AST/Mult.java
+++ b/AST/Mult.java
@@ -8,4 +8,23 @@ public String symbole() {return "fois";};
     public String toAssembly() {
         return gauche.toAssembly() + droite.toAssembly() + "MultNb\n";
     }
+
+@Override
+    public Object evaluate() {
+        Object leftValue = gauche.evaluate();
+        Object rightValue = droite.evaluate();
+
+        if (leftValue instanceof Integer && rightValue instanceof Integer) {
+            return (Integer) leftValue * (Integer) rightValue;
+        } else if (leftValue instanceof Float && rightValue instanceof Float) {
+            return (Float) leftValue * (Float) rightValue;
+        } else if (leftValue instanceof Integer && rightValue instanceof Float) {
+            return (Integer) leftValue * (Float) rightValue;
+        } else if (leftValue instanceof Float && rightValue instanceof Integer) {
+            return (Float) leftValue * (Integer) rightValue;
+        } else {
+            throw new RuntimeException("Unsupported types for Mult operation: " 
+                + leftValue.getClass().getName() + " and " + rightValue.getClass().getName());
+        }
+    }
 }
diff --git a/AST/Neg.java b/AST/Neg.java
index d3bf1aa30d5a8d08e6519230ccd135daa85acf1b..dd2218d3a693344757eba6c0609f546eefda2588 100644
--- a/AST/Neg.java
+++ b/AST/Neg.java
@@ -14,4 +14,16 @@ public String toString() {
   public String toAssembly() {
     return  (arg.toAssembly())+"NegaNb\n";
   }
+  @Override
+    public Object evaluate() {
+        Object value = arg.evaluate();
+
+        if (value instanceof Integer) {
+            return -(Integer) value;
+        } else if (value instanceof Float) {
+            return -(Float) value;
+        } else {
+            throw new RuntimeException("Unsupported type for Neg operation: " + value.getClass().getName());
+        }
+    }
 }	
diff --git a/AST/Not.java b/AST/Not.java
index 8cdde2e820e275752a3de321017d3efc2eabec9c..b7a085a2d7f9efb4e5f97b01157d3b455ec822e8 100644
--- a/AST/Not.java
+++ b/AST/Not.java
@@ -14,4 +14,14 @@ public class Not extends ExpressionA {
     public String toAssembly() {
         return  (arg.toAssembly())+"Not\n";
     }
+
+    @Override
+    public Object evaluate() {
+        Object value = arg.evaluate();
+        if (value instanceof Boolean) {
+            return !(Boolean) value;
+        } else {
+            throw new RuntimeException("Invalid type for Not operation: " + value.getClass().getName());
+        }
+    }
 }
diff --git a/AST/NotEql.java b/AST/NotEql.java
index 33e5304dc634e2fa93d2faa7ba1b7ce158dde9eb..fd9c350965987b92a7147883f2175b0a19a6fec6 100644
--- a/AST/NotEql.java
+++ b/AST/NotEql.java
@@ -12,4 +12,28 @@ public class NotEql extends ExpressionA_Binaire {
     public String toAssembly() {
         return gauche.toAssembly() + droite.toAssembly() + "NotEql\n";
     }
+
+    @Override
+    public Object evaluate() {
+        Object leftValue = gauche.evaluate();
+        Object rightValue = droite.evaluate();
+        
+        if (leftValue == null || rightValue == null) {
+            return leftValue != rightValue;
+        }
+
+        if (!leftValue.getClass().equals(rightValue.getClass())) {
+            throw new RuntimeException("Cannot compare values of different types: " + leftValue.getClass().getName() + " and " + rightValue.getClass().getName());
+        }
+
+        if (leftValue instanceof Integer) {
+            return !leftValue.equals(rightValue);
+        } else if (leftValue instanceof Boolean) {
+            return !leftValue.equals(rightValue);
+        } else if (leftValue instanceof Float) {
+            return !leftValue.equals(rightValue);
+        } else {
+            throw new RuntimeException("Unsupported types for NotEqual operation: " + leftValue.getClass().getName());
+        }
+    }
 }
diff --git a/AST/Num.java b/AST/Num.java
index 461a153e1ac95cc581d1db8cd2fa8806d2918025..1024fe05c524da69ce2e1cd20564feeb559a4d7b 100644
--- a/AST/Num.java
+++ b/AST/Num.java
@@ -13,4 +13,9 @@ public class Num extends ExpressionA {
   public String toAssembly() {
     return "CsteNb " + num+"\n";
   }
+
+  @Override
+    public Object evaluate() {
+        return num;
+    }
 }
diff --git a/AST/Plus.java b/AST/Plus.java
index 17d4083196c2d344f634f7491fd2bb0c9efdb44e..41b6682515bf9e26e00432f1a38be2e85bceb1eb 100644
--- a/AST/Plus.java
+++ b/AST/Plus.java
@@ -8,4 +8,10 @@ public String symbole() {return "plus";};
 public String toAssembly() {
     return gauche.toAssembly() + droite.toAssembly() + "AddiNb\n";
 }
+
+
+@Override
+    public Object evaluate() {
+        return (Integer) gauche.evaluate() + (Integer) droite.evaluate();
+    }
 }
diff --git a/AST/Programme.java b/AST/Programme.java
index d75d30a8c6a0bc1263667448286b200a28b6ffe7..75f2d5dbf9bce4362a0358f348d562d5f8e7e3b8 100644
--- a/AST/Programme.java
+++ b/AST/Programme.java
@@ -15,7 +15,10 @@ public class Programme extends AST {
     public String toAssembly() {
         String assembly = "";
         for (Commande commande : commandes) {
-            assembly = assembly+commande.toAssembly()+"Drop\n";
+            assembly = assembly+commande.toAssembly();
+            if(commande instanceof ExpressionA){
+                assembly+="Drop"+"\n";
+            }
 
         }
         return assembly;
diff --git a/AST/SymbolTable.java b/AST/SymbolTable.java
new file mode 100644
index 0000000000000000000000000000000000000000..6cc23c304e4108e8dabe1f2409b5dff101fc8964
--- /dev/null
+++ b/AST/SymbolTable.java
@@ -0,0 +1,27 @@
+package AST;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class SymbolTable {
+    private static Map<String, Object> table = new HashMap<>();
+
+    // Assign a variable with a value
+    public static void assignVariable(String name, Object value) {
+        table.put(name, value);
+    }
+
+    // Retrieve a variable's value
+    public static Object getVariable(String name) {
+        if (table.containsKey(name)) {
+            return table.get(name);
+        }
+        throw new RuntimeException("Variable " + name + " not defined.");
+    }
+
+    // Check if a variable is already defined
+    public static boolean isVariableDefined(String name) {
+        return table.containsKey(name);
+    }
+}
+
diff --git a/AST/VariableExpr.java b/AST/VariableExpr.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7be3e5da456c8616b6afbc02d5b8b50ad038f24
--- /dev/null
+++ b/AST/VariableExpr.java
@@ -0,0 +1,20 @@
+package AST;
+
+// Classe pour représenter une variable
+public class VariableExpr extends ExpressionA {
+    private String name;
+
+    public VariableExpr(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String toAssembly() {
+        return "GetVar " + name + "\n";
+    }
+
+    @Override
+    public Object evaluate() {
+        return SymbolTable.getVariable(name);
+    }
+}
diff --git a/Compilateur$JJCalls.class b/Compilateur$JJCalls.class
new file mode 100644
index 0000000000000000000000000000000000000000..3d0aa7fce1b2f43f24b9be3321d8f0397f1108c1
Binary files /dev/null and b/Compilateur$JJCalls.class differ
diff --git a/Compilateur$LookaheadSuccess.class b/Compilateur$LookaheadSuccess.class
new file mode 100644
index 0000000000000000000000000000000000000000..bd052506d726cd77265dab73e2ae256b1d557a5b
Binary files /dev/null and b/Compilateur$LookaheadSuccess.class differ
diff --git a/Compilateur.jj b/Compilateur.jj
index 5bed1612e55c4ecdbee2a6b1c1eb9e9936454761..ad7c78c74e3b0ac8a1b9cd32d10f9328851b5e9a 100644
--- a/Compilateur.jj
+++ b/Compilateur.jj
@@ -9,128 +9,130 @@ import java.io.InputStream;
 public class Compilateur {
     public static void main(String args[]) {
         try {
-            //System.out.print("Tapez une Expression : ");
+            // Ouvre le fichier "test.js" pour lecture
             FileInputStream fis = new FileInputStream("test.js");
+            // Crée une instance du parseur
             Compilateur parseur = new Compilateur(fis);
-            Programme programme = parseur.mainNT(); // Changer pour Programme
-            System.out.println("Assembly code  : \n" + programme.toAssembly()+"Halt"); // Modifier pour générer l'assembleur
+            // Parse le fichier et obtient le programme
+            Programme programme = parseur.mainNT();
+            // Affiche le code assembleur généré
+            System.out.println("Assembly code  : \n" + programme.toAssembly() + "Halt");
             System.out.println("C'est bien une expression arithmétique !!");
-        }catch (FileNotFoundException e) {
+        } catch (FileNotFoundException e) {
             System.out.println("Le fichier spécifié n'a pas été trouvé.");
-        }catch (TokenMgrError e) {
-            System.out.println("Ceci n'est pas une expression arithm\u00e9tique :"+e.toString());
-        }catch (ParseException e){
-            System.out.println("Ceci n'est pas une expression arithm\u00e9tique :"+e);
-    }   }
+        } catch (TokenMgrError e) {
+            System.out.println("Ceci n'est pas une expression arithmétique : " + e.toString());
+        } catch (ParseException e) {
+            System.out.println("Ceci n'est pas une expression arithmétique : " + e);
+        }
+    }
 }
 PARSER_END(Compilateur)
 
-
 TOKEN :
 {
       < FLOAT: (("0" | ["1"-"9"] (["0"-"9"])* )? "." (["0"-"9"])+ (("E" | "e") ("+" | "-")? (["0"-"9"])+)? ) | (["0"-"9"])+ (("E" | "e") ("+" | "-")? (["0"-"9"])+)>
     | < NOMBRE: (["1"-"9"] (["0"-"9"])* | "0") (("E" | "e") ("+" | "-")? (["0"-"9"])+)?>
     | < BOOLEAN: "True" | "False">
-    | < EOL: ";\n" | ";" >
     | < NAN: "NaN">
     | < IMPORT: "import">
-    | < IDENT : (["a"-"z", "A"-"Z", "0"-"9", "/"])+ >
+    | < IF: "if" >
+    | < ELSE: "else" >
+    | < DO: "do" >
+    | < WHILE: "while" >
+    | < EOL: ";\n" | ";" >
+    | < SEMICOLON: ";" >
+    | < ASSIGN: "=" >
+    | < PLUS: "+" >
+    | < MINUS: "-" >
+    | < MULTIPLY: "*" >
+    | < DIVIDE: "/" >
+    | < LPAREN: "(" >
+    | < RPAREN: ")" >
+    | < LBRACE: "{" >
+    | < RBRACE: "}" >
+    | < IDENT: (["a"-"z"])+ (["a"-"z", "A"-"Z", "0"-"9", "_"])* >
 }
+
 SKIP :
 { " " | "\t" | "\n" | < "//" (~["\n", "\r"])* ("\n" | "\r" | "\r\n") > | < "/*" (~["*"])* "*" (~["/", "*"] (~["*"])* "*" )* "/" >}
 
-
-Programme mainNT () :
-{
-    Programme prg;
+Programme mainNT() : {
+    Programme programme;
+} {
+    programme=programme() <EOF> { return programme; }
 }
-{
-    prg=programme() <EOF> { return prg; }
 
-
-}
-Programme programme() :
-{
-    List<Commande> programme = new ArrayList<>();
+Programme programme() : {
+    List<Commande> programme = new ArrayList<Commande>();
     Commande commande;
-}
-{
+} {
     (
-        commande=commande() {
-
-            programme.add(commande);
-
-        }
-    )*
-    {
-            return new Programme(programme);}
-
-}
-Commande commande() :
-{
-    Commande expr;
-    Programme prg;
+        commande=commande() { programme.add(commande); }
+    )* {
+        return new Programme(programme);
+    }
 }
-{
-       expr=expression() <EOL> { return expr; }
-     | <IMPORT> expr=facteur() <EOL> { return new Import(expr); }
-     | "{" prg=programme() "}" {return new Bloc(prg);}
 
+Commande commande() : {
+    Token id;
+    ExpressionA expr;
+    Commande cmd1, cmd2;
+    Programme prg;
+} {
+    LOOKAHEAD(2) id=<IDENT> "=" expr=expression() <EOL> { return new Assignment(id.image, expr); }
+    | expr=expression() <EOL> { return expr; }
+    | <IMPORT> expr=facteur() <EOL> { return new Import(expr); }
+    | <LBRACE> prg=programme() <RBRACE> { return new Bloc(prg); }
+    | <EOL> {return new EmptyCommand();}
+    | <IF> <LPAREN> expr=expression() <RPAREN> cmd1=commande() <ELSE> cmd2=commande() { return new IfElseCommand(expr, cmd1, cmd2); }
+    | <DO> cmd1=commande() <WHILE> <LPAREN> expr=expression() <RPAREN> <EOL> { return new DoWhileCommand(cmd1, expr); }
 }
 
-
-
-ExpressionA expression() :
-{
+ExpressionA expression() : {
     ExpressionA gauche, droite;
-}
-{
+} {
     gauche=comp() (
-              "==" droite=comp()  { gauche = new Egal(gauche, droite); }
-            | ">=" droite=comp()  { gauche = new GrEgNb(gauche, droite); }
-            | ">"  droite=comp()  { gauche = new GrStNb(gauche, droite);}
-            | "<"  droite=comp()  { gauche = new LoStNb(gauche, droite);}
-            | "<=" droite=comp()  { gauche = new LoEqNb(gauche, droite); }
-            | "!=" droite=comp()  { gauche = new NotEql(gauche, droite); }
-            | "&&" droite=comp()  { gauche = new Et(gauche, droite); }
-    )*
-    { return gauche; }
-}
-
-ExpressionA comp() :
-{
+        "=="  droite=comp() { gauche = new Egal(gauche, droite); }
+        | ">=" droite=comp() { gauche = new GrEgNb(gauche, droite); }
+        | ">" droite=comp() { gauche = new GrStNb(gauche, droite); }
+        | "<" droite=comp() { gauche = new LoStNb(gauche, droite); }
+        | "<=" droite=comp() { gauche = new LoEqNb(gauche, droite); }
+        | "!=" droite=comp() { gauche = new NotEql(gauche, droite); }
+        | "&&" droite=comp() { gauche = new Et(gauche, droite); }
+    )* {
+        return gauche;
+    }
+}
+
+ExpressionA comp() : {
     ExpressionA gauche, droite;
-}
-{
+} {
     gauche=terme() (
-         "+" droite=terme() { gauche = new Plus(gauche, droite); }
+        "+" droite=terme() { gauche = new Plus(gauche, droite); }
         | "-" droite=terme() { gauche = new Moins(gauche, droite); }
-         )*
-    { return gauche; }
+    )* {
+        return gauche;
+    }
 }
-ExpressionA terme () :
-{
+
+ExpressionA terme() : {
     ExpressionA gauche, droite;
-}
-{
+} {
     gauche=facteur() (
           "*" droite=facteur() { gauche = new Mult(gauche, droite); }
-        | "/" droite=facteur() { gauche = new Div(gauche, droite);}
+        | "/" droite=facteur() { gauche = new Div(gauche, droite); }
         | "%" droite=facteur() { gauche = new Modulo(gauche, droite); }
-    )*
-    { return gauche; }
+    )* {
+        return gauche;
+    }
 }
 
-ExpressionA facteur() :
-{
+ExpressionA facteur() : {
     ExpressionA expr;
-}
-{
-      "(" expr=expression() ")" { return expr; }
-    | "-" expr=facteur() { return new Neg(expr); }
-    | "!" expr=facteur() { return new Not(expr); }
-    | <NOMBRE> { return new Num(Integer.parseInt(token.image));}
-    | <FLOAT> { return new FloatT(Float.parseFloat(token.image));}
-    | <BOOLEAN> { return new Bool(Boolean.parseBoolean(token.image));}// Construit un nœud Num
-    | <IDENT> { return new Ident(token.image);}// Construit un nœud Num
+} {
+    <NOMBRE> { return new Num(Integer.parseInt(token.image)); }
+  | <FLOAT> { return new FloatT(Float.parseFloat(token.image)); }
+  | <BOOLEAN> { return new Bool(Boolean.parseBoolean(token.image)); }
+  | <IDENT> { return new Ident(token.image); }
 }
diff --git a/test.js b/test.js
index dcf8e1c655cf00bb97acd230fe302236803784c6..4d638576a3ca393334a409d2ce6ba8448a57659f 100644
--- a/test.js
+++ b/test.js
@@ -1,9 +1,21 @@
-import malib;
-/// True + False
-/* cgvhjbkn +1 */
-{
-    9-1;
+// to test the if else
+if (x<10){
     x+1;
+}else{
+    y=10;
+}
+// to test the do while
+do {
+    y=y+1;
+}while(y<10);
 
+// to test the compressed sequence of commands
+
+{
+    e+1;
+    a-10;
+    3+1;
 }
-5*5;
+// to test the EmptyCommand
+;
+    
\ No newline at end of file