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![]) }