diff --git a/juno_frontend/src/lang.y b/juno_frontend/src/lang.y
index 13d7e292a366dca1ae8bc9f859ee592293d5da7d..7efc01256c68ad07cc8234475bfebba3f7294104 100644
--- a/juno_frontend/src/lang.y
+++ b/juno_frontend/src/lang.y
@@ -99,13 +99,18 @@ TypeDef -> Result<TyDef, ()>
   ;
 
 ObjFields -> Result<Vec<ObjField>, ()>
-  :                     { Ok(vec![]) }
-  | ObjFields ObjField  { flatten($1, $2) }
+  : ObjFieldList { Ok($1?.into_iter().collect()) }
+  ;
+ObjFieldList -> Result<VecDeque<ObjField>, ()>
+  :                           { Ok(VecDeque::new()) }
+  | ObjField                  { Ok(VecDeque::from([$1?])) }
+  | ObjField ',' ObjFieldList { let mut lst = $3?; lst.push_front($1?); Ok(lst) }
+  | ObjField ';' ObjFieldList { let mut lst = $3?; lst.push_front($1?); Ok(lst) }
   ;
 ObjField -> Result<ObjField, ()>
-  : PubOption 'ID' ';'
+  : PubOption 'ID'
         { Ok(ObjField{ span : $span, public : $1?, name : span_of_tok($2)?, typ : None }) }
-  | PubOption 'ID' ':' Type ';'
+  | PubOption 'ID' ':' Type
         { Ok(ObjField{ span : $span, public : $1?, name : span_of_tok($2)?, typ : Some($4?) }) }
   ;
 
@@ -457,12 +462,16 @@ Expr -> Result<Expr, ()>
       { Ok(Expr::IntrinsicExpr{ span : $span, name : $1?, ty_args : Some($5?), args: $8? }) }
   ;
 IdExprs -> Result<Vec<(Id, Expr)>, ()>
-  : 'ID' '=' Expr               { Ok(vec![(span_of_tok($1)?, $3?)]) }
-  | IdExprsS ',' 'ID' '=' Expr  { flatten($1, res_pair(span_of_tok($3), $5)) }
+  : IdExprList  { Ok($1?.into_iter().collect()) }
+  ;
+IdExprList -> Result<VecDeque<(Id, Expr)>, ()>
+  :                       { Ok(VecDeque::new()) }
+  | IdExpr                { Ok(VecDeque::from([$1?])) }
+  | IdExpr ',' IdExprList { let mut lst = $3?; lst.push_front($1?); Ok(lst) }
   ;
-IdExprsS -> Result<Vec<(Id, Expr)>, ()>
-  : 'ID' '=' Expr               { Ok(vec![(span_of_tok($1)?, $3?)]) }
-  | IdExprsS ',' 'ID' '=' Expr  { flatten($1, res_pair(span_of_tok($3), $5)) }
+IdExpr -> Result<(Id, Expr), ()>
+  : 'ID' ':' Expr               { Ok((span_of_tok($1)?, $3?)) }
+  | 'ID' '=' Expr               { Ok((span_of_tok($1)?, $3?)) }
   ;
 Params -> Result<Vec<(bool, Expr)>, ()>
   :                       { Ok(vec![]) }