pub(super) fn parse_mul_assign_rhs(
        &mut self,
        term: impl Into<Option<Punct>>,
    ) -> Result<Vec<Node>, ParseErr> {
        let term = term.into();
        let old = self.suppress_mul_assign;
        // multiple assignment must be suppressed in parsing arg list.
        self.suppress_mul_assign = true;

        let mut args = vec![];
        loop {
            if let Some(term) = term {
                if self.consume_punct(term)? {
                    self.suppress_mul_assign = old;
                    return Ok(args);
                }
            };
            if self.consume_punct(Punct::Mul)? {
                // splat argument
                let loc = self.prev_loc();
                let array = self.parse_arg()?;
                args.push(Node::new_splat(array, loc));
            } else {
                let node = self.parse_arg()?;
                args.push(node);
            }
            if !self.consume_punct(Punct::Comma)? {
                break;
            }
        }
        self.suppress_mul_assign = old;
        if let Some(term) = term {
            self.expect_punct(term)?;
        };
        Ok(args)
    }
Parse rhs of multiple assignment. cf: a,b,*c,d
ruruby-parse/src/parser/expression.rs