MCPcopy Create free account
hub / github.com/Glyphack/enderpy / parse_paren_form_or_generator

Method parse_paren_form_or_generator

parser/src/parser/parser.rs:1616–1660  ·  view source on GitHub ↗

https://docs.python.org/3/reference/expressions.html#parenthesized-forms

(&mut self)

Source from the content-addressed store, hash-verified

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> {

Callers 1

parse_atomMethod · 0.80

Calls 13

TupleClass · 0.85
StarredClass · 0.85
GeneratorClass · 0.85
start_nodeMethod · 0.80
expectMethod · 0.80
atMethod · 0.80
finish_nodeMethod · 0.80
eatMethod · 0.80
parse_or_exprMethod · 0.80
parse_expressionMethod · 0.80
parse_comp_forMethod · 0.80

Tested by

no test coverage detected