diff --git a/juno_scheduler/src/lang.y b/juno_scheduler/src/lang.y
index 55c82b9dc368e7cade9500fb852c9d48320be7d2..7d04bee1f9f94a104d67d4928f72c9ed8eab1a00 100644
--- a/juno_scheduler/src/lang.y
+++ b/juno_scheduler/src/lang.y
@@ -27,14 +27,23 @@ Stmt -> Stmt
       { Stmt::ExprStmt { span: $span, exp: $1 } }
   | 'fixpoint' FixpointLimit '{' Schedule '}'
       { Stmt::Fixpoint { span: $span, limit: $2, body: Box::new($4) } }
-  | 'if' Expr '{' Schedule '}'
-      { Stmt::IfThenElse { span: $span, cond: $2, thn: Box::new($4), els: None } }
-  | 'if' Expr '{' Schedule '}' 'else' '{' Schedule '}'
-      { Stmt::IfThenElse { span: $span, cond: $2, thn: Box::new($4), els: Some(Box::new($8)) } }
+  | 'if' Expr '{' Schedule '}' ElseStmt
+      { Stmt::IfThenElse { span: $span, cond: $2, thn: Box::new($4), els: $6 } }
   | MacroDecl
       { Stmt::MacroDecl { span: $span, def: $1 } }
   ;
 
+ElseStmt -> Option<Box<OperationList>>
+  :   { None }
+  | 'else' '{' Schedule '}'
+      { Some(Box::new($3)) }
+  | 'else' 'if' Expr '{' Schedule '}' ElseStmt
+      { Some(Box::new(OperationList::ConsStmt(
+          Stmt::IfThenElse { span: $span, cond: $3, thn: Box::new($5), els: $7 },
+          Box::new(OperationList::NilStmt()),
+        ))) }
+  ;
+
 FixpointLimit -> FixpointLimit
   : { FixpointLimit::NoLimit { span: $span } }
   | 'stop_after' 'INT'