diff --git a/src/Lib/Script/Ast/IrExpression.cc b/src/Lib/Script/Ast/IrExpression.cc
index d7c2ce71c337b734b8fc2bb73c81f2261d11bd7a..a2b1faf01cf8fd87ccc0a52c112cedbd840ae6bc 100644
--- a/src/Lib/Script/Ast/IrExpression.cc
+++ b/src/Lib/Script/Ast/IrExpression.cc
@@ -312,15 +312,49 @@ namespace Vivy::Script
 IrELogicOp::OpType
 IrELogicOp::getOpFromToken(Token tok)
 {
+    if (tok.isSimple(TOKEN_AND))
+        return IrELogicOp::OpType::And;
+    else if (tok.isSimple(TOKEN_OR))
+        return IrELogicOp::OpType::Or;
+    // else if (tok.isSimple(TOKEN_XOR))
+    //     return IrELogicOp::OpType::Xor;
+    else
+        throw std::runtime_error(tok.location().toString() + ": Not a LogicOp");
 }
 
 IrECompOp::OpType
 IrECompOp::getOpFromToken(Token tok)
 {
+    if (tok.isSimple(TOKEN_LE))
+        return IrECompOp::OpType::LE;
+    else if (tok.isSimple(TOKEN_LT))
+        return IrECompOp::OpType::LT;
+    else if (tok.isSimple(TOKEN_GE))
+        return IrECompOp::OpType::GE;
+    else if (tok.isSimple(TOKEN_GT))
+        return IrECompOp::OpType::GT;
+    else if (tok.isSimple(TOKEN_EQ))
+        return IrECompOp::OpType::EQ;
+    else if (tok.isSimple(TOKEN_NEQ))
+        return IrECompOp::OpType::NEQ;
+    else
+        throw std::runtime_error(tok.location().toString() + ": Not a CompOp");
 }
 
 IrEArithmeticOp::OpType
 IrEArithmeticOp::getOpFromToken(Token tok)
 {
+    if (tok.isSimple(TOKEN_PLUS))
+        return IrEArithmeticOp::OpType::Add;
+    else if (tok.isSimple(TOKEN_MINUS))
+        return IrEArithmeticOp::OpType::Sub;
+    else if (tok.isSimple(TOKEN_TIMES))
+        return IrEArithmeticOp::OpType::Mul;
+    else if (tok.isSimple(TOKEN_DIV))
+        return IrEArithmeticOp::OpType::Div;
+    else if (tok.isSimple(TOKEN_MOD))
+        return IrEArithmeticOp::OpType::Mod;
+    else
+        throw std::runtime_error(tok.location().toString() + ": Not a ArithmeticOp");
 }
 }