https://docs.python.org/3/reference/expressions.html#parenthesized-forms
(&mut self)
| 1614 | |
| 1615 | // https://docs.python.org/3/reference/expressions.html#parenthesized-forms |
| 1616 | fn parse_paren_form_or_generator(&mut self) -> Result<Expression, ParsingError> { |
| 1617 | let node = self.start_node(); |
| 1618 | self.expect(Kind::LeftParen)?; |
| 1619 | if self.at(Kind::RightParen) { |
| 1620 | return Ok(Expression::Tuple(Box::new(Tuple { |
| 1621 | node: self.finish_node(node), |
| 1622 | elements: vec![], |
| 1623 | }))); |
| 1624 | } |
| 1625 | // paren form starts with either an expression or a star expression |
| 1626 | // Generator starts with an expression |
| 1627 | // we need to first check if we have a generator or a paren form |
| 1628 | // we do this by checking if the next expression is assignment expression |
| 1629 | // if not we consume the expression and check if the next token is a for |
| 1630 | // if not we have a paren form |
| 1631 | // The first expression we consume have three cases |
| 1632 | // Either an starred item https://docs.python.org/3/reference/expressions.html#grammar-token-python-grammar-starred_expression |
| 1633 | // or an assignment expression |
| 1634 | // This is a star named expression |
| 1635 | let first_expr = |
| 1636 | if self.at(Kind::Identifier) && matches!(self.peek_kind(), Ok(Kind::Walrus)) { |
| 1637 | self.parse_named_expression()? |
| 1638 | } else if self.eat(Kind::Mul) { |
| 1639 | let expr = self.parse_or_expr()?; |
| 1640 | Expression::Starred(Box::new(Starred { |
| 1641 | node: self.finish_node(node), |
| 1642 | value: expr, |
| 1643 | })) |
| 1644 | } else { |
| 1645 | self.parse_expression()? |
| 1646 | }; |
| 1647 | |
| 1648 | if matches!(self.cur_kind(), Kind::For) || matches!(self.peek_kind(), Ok(Kind::For)) { |
| 1649 | let generators = self.parse_comp_for()?; |
| 1650 | self.expect(Kind::RightParen)?; |
| 1651 | return Ok(Expression::Generator(Box::new(Generator { |
| 1652 | node: self.finish_node(node), |
| 1653 | element: first_expr, |
| 1654 | generators, |
| 1655 | }))); |
| 1656 | } |
| 1657 | |
| 1658 | let expr = self.parse_starred_expression(node, first_expr)?; |
| 1659 | Ok(expr) |
| 1660 | } |
| 1661 | |
| 1662 | // https://docs.python.org/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries |
| 1663 | fn parse_comp_for(&mut self) -> Result<Vec<Comprehension>, ParsingError> { |
no test coverage detected