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'