bpo-40631: Disallow single parenthesized star target (GH-24027)
diff --git a/Grammar/python.gram b/Grammar/python.gram
index 4915cc4..8517bf2 100644
--- a/Grammar/python.gram
+++ b/Grammar/python.gram
@@ -580,18 +580,23 @@
| a=star_target !',' { a }
| a=star_target b=(',' c=star_target { c })* [','] {
_Py_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Store, EXTRA) }
-star_targets_seq[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_target+ [','] { a }
+star_targets_list_seq[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_target+ [','] { a }
+star_targets_tuple_seq[asdl_expr_seq*]:
+ | a=star_target b=(',' c=star_target { c })+ [','] { (asdl_expr_seq*) _PyPegen_seq_insert_in_front(p, a, b) }
+ | a=star_target ',' { (asdl_expr_seq*) _PyPegen_singleton_seq(p, a) }
star_target[expr_ty] (memo):
| '*' a=(!'*' star_target) {
_Py_Starred(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), Store, EXTRA) }
+ | target_with_star_atom
+target_with_star_atom[expr_ty] (memo):
| a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Store, EXTRA) }
| a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Store, EXTRA) }
| star_atom
star_atom[expr_ty]:
| a=NAME { _PyPegen_set_expr_context(p, a, Store) }
- | '(' a=star_target ')' { _PyPegen_set_expr_context(p, a, Store) }
- | '(' a=[star_targets_seq] ')' { _Py_Tuple(a, Store, EXTRA) }
- | '[' a=[star_targets_seq] ']' { _Py_List(a, Store, EXTRA) }
+ | '(' a=target_with_star_atom ')' { _PyPegen_set_expr_context(p, a, Store) }
+ | '(' a=[star_targets_tuple_seq] ')' { _Py_Tuple(a, Store, EXTRA) }
+ | '[' a=[star_targets_list_seq] ']' { _Py_List(a, Store, EXTRA) }
single_target[expr_ty]:
| single_subscript_attribute_target