https://docs.python.org/3/reference/simple_stmts.html#grammar-token-python-grammar-target
(&mut self)
| 1719 | |
| 1720 | // https://docs.python.org/3/reference/simple_stmts.html#grammar-token-python-grammar-target |
| 1721 | fn parse_target(&mut self) -> Result<Expression, ParsingError> { |
| 1722 | let node = self.start_node(); |
| 1723 | let mut targets = vec![]; |
| 1724 | let target = match self.cur_kind() { |
| 1725 | Kind::Type | Kind::Match | Kind::Identifier => match self.peek_kind() { |
| 1726 | Ok(Kind::LeftBrace) => { |
| 1727 | let atom = self.parse_atom()?; |
| 1728 | self.parse_subscript(node, atom)? |
| 1729 | } |
| 1730 | Ok(Kind::Dot) => { |
| 1731 | let atom = self.parse_atom()?; |
| 1732 | self.parse_attribute_ref(node, atom)? |
| 1733 | } |
| 1734 | _ => { |
| 1735 | let identifier = self.cur_token().to_string(self.source); |
| 1736 | let mut identifier_node = self.start_node(); |
| 1737 | identifier_node = self.finish_node(identifier_node); |
| 1738 | self.expect(Kind::Identifier)?; |
| 1739 | identifier_node = self.finish_node(identifier_node); |
| 1740 | return Ok(Expression::Name(Box::new(Name { |
| 1741 | node: identifier_node, |
| 1742 | id: identifier, |
| 1743 | parenthesized: false, |
| 1744 | }))); |
| 1745 | } |
| 1746 | }, |
| 1747 | Kind::LeftBrace => { |
| 1748 | let mut elements = vec![]; |
| 1749 | self.bump(Kind::LeftBrace); |
| 1750 | loop { |
| 1751 | elements.push(self.parse_target()?); |
| 1752 | if !self.eat(Kind::Comma) { |
| 1753 | break; |
| 1754 | } |
| 1755 | } |
| 1756 | self.expect(Kind::RightBrace)?; |
| 1757 | Expression::List(Box::new(List { |
| 1758 | node: self.finish_node(node), |
| 1759 | elements, |
| 1760 | })) |
| 1761 | } |
| 1762 | Kind::LeftParen => { |
| 1763 | let mut targets = vec![]; |
| 1764 | self.bump(Kind::LeftParen); |
| 1765 | loop { |
| 1766 | targets.push(self.parse_target()?); |
| 1767 | if !self.eat(Kind::Comma) { |
| 1768 | break; |
| 1769 | } |
| 1770 | } |
| 1771 | self.expect(Kind::RightParen)?; |
| 1772 | if targets.len() == 1 { |
| 1773 | targets.pop().unwrap() |
| 1774 | } else { |
| 1775 | Expression::Tuple(Box::new(Tuple { |
| 1776 | node: self.finish_node(node), |
| 1777 | elements: targets, |
| 1778 | })) |
no test coverage detected