write to variables

This commit is contained in:
Jana Dönszelmann 2026-01-05 16:27:53 +01:00
parent 1a1a09f7fb
commit ab2849da6f
No known key found for this signature in database

View file

@ -1,14 +1,14 @@
From 074d19076df40ace10bc115f8154bfbb96526649 Mon Sep 17 00:00:00 2001 From d947b1d3160d8a6990f9b7bed476184271fedd9a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jana=20D=C3=B6nszelmann?= <jana@donsz.nl> From: =?UTF-8?q?Jana=20D=C3=B6nszelmann?= <jana@donsz.nl>
Date: Mon, 5 Jan 2026 11:21:45 +0100 Date: Mon, 5 Jan 2026 16:14:52 +0100
Subject: [PATCH] add to parser Subject: [PATCH] add to parser
--- ---
Grammar/Tokens | 1 + Grammar/Tokens | 1 +
Grammar/python.gram | 73 +++++++++++++++++++++++++++++------------ Grammar/python.gram | 77 ++++++++++++++++++++++++++++++-----------
Parser/action_helpers.c | 26 +++++++++++++++ Parser/action_helpers.c | 26 ++++++++++++++
Parser/pegen.h | 1 + Parser/pegen.h | 1 +
4 files changed, 80 insertions(+), 21 deletions(-) 4 files changed, 84 insertions(+), 21 deletions(-)
diff --git a/Grammar/Tokens b/Grammar/Tokens diff --git a/Grammar/Tokens b/Grammar/Tokens
index 0547e6ed08f..fd0ce412f6c 100644 index 0547e6ed08f..fd0ce412f6c 100644
@ -23,7 +23,7 @@ index 0547e6ed08f..fd0ce412f6c 100644
OP OP
TYPE_IGNORE TYPE_IGNORE
diff --git a/Grammar/python.gram b/Grammar/python.gram diff --git a/Grammar/python.gram b/Grammar/python.gram
index 110136af81b..48cebe45d5b 100644 index 110136af81b..7afaa1c140e 100644
--- a/Grammar/python.gram --- a/Grammar/python.gram
+++ b/Grammar/python.gram +++ b/Grammar/python.gram
@@ -726,13 +726,13 @@ star_expressions[expr_ty]: @@ -726,13 +726,13 @@ star_expressions[expr_ty]:
@ -58,7 +58,7 @@ index 110136af81b..48cebe45d5b 100644
compare_op_bitwise_or_pair[CmpopExprPair*]: compare_op_bitwise_or_pair[CmpopExprPair*]:
| eq_bitwise_or | eq_bitwise_or
@@ -787,21 +787,47 @@ compare_op_bitwise_or_pair[CmpopExprPair*]: @@ -787,21 +787,51 @@ compare_op_bitwise_or_pair[CmpopExprPair*]:
| isnot_bitwise_or | isnot_bitwise_or
| is_bitwise_or | is_bitwise_or
@ -87,6 +87,10 @@ index 110136af81b..48cebe45d5b 100644
# ----------------- # -----------------
+pipe[expr_ty]: +pipe[expr_ty]:
+ | lhs=pipe '|>' rhs=NAME !'(' {
+ CHECK_VERSION(expr_ty, 8, "Assignment expressions are",
+ _PyAST_NamedExpr(CHECK(expr_ty, _PyPegen_set_expr_context(p, rhs, Store)), lhs, EXTRA))
+ }
+ | lhs=pipe '|>' rhs=primary_nocall b=genexp { + | lhs=pipe '|>' rhs=primary_nocall b=genexp {
+ _PyAST_Call(rhs, + _PyAST_Call(rhs,
+ _PyPegen_desugar_pipe( + _PyPegen_desugar_pipe(
@ -115,7 +119,7 @@ index 110136af81b..48cebe45d5b 100644
bitwise_or[expr_ty]: bitwise_or[expr_ty]:
| a=bitwise_or '|' b=bitwise_xor { _PyAST_BinOp(a, BitOr, b, EXTRA) } | a=bitwise_or '|' b=bitwise_xor { _PyAST_BinOp(a, BitOr, b, EXTRA) }
| bitwise_xor | bitwise_xor
@@ -856,6 +882,11 @@ await_primary[expr_ty] (memo): @@ -856,6 +886,11 @@ await_primary[expr_ty] (memo):
| 'await' a=primary { CHECK_VERSION(expr_ty, 5, "Await expressions are", _PyAST_Await(a, EXTRA)) } | 'await' a=primary { CHECK_VERSION(expr_ty, 5, "Await expressions are", _PyAST_Await(a, EXTRA)) }
| primary | primary
@ -127,7 +131,7 @@ index 110136af81b..48cebe45d5b 100644
primary[expr_ty]: primary[expr_ty]:
| a=primary '.' b=NAME { _PyAST_Attribute(a, b->v.Name.id, Load, EXTRA) } | a=primary '.' b=NAME { _PyAST_Attribute(a, b->v.Name.id, Load, EXTRA) }
| a=primary b=genexp { _PyAST_Call(a, CHECK(asdl_expr_seq*, (asdl_expr_seq*)_PyPegen_singleton_seq(p, b)), NULL, EXTRA) } | a=primary b=genexp { _PyAST_Call(a, CHECK(asdl_expr_seq*, (asdl_expr_seq*)_PyPegen_singleton_seq(p, b)), NULL, EXTRA) }
@@ -1020,7 +1051,7 @@ dict[expr_ty]: @@ -1020,7 +1055,7 @@ dict[expr_ty]:
double_starred_kvpairs[asdl_seq*]: a=','.double_starred_kvpair+ [','] { a } double_starred_kvpairs[asdl_seq*]: a=','.double_starred_kvpair+ [','] { a }
double_starred_kvpair[KeyValuePair*]: double_starred_kvpair[KeyValuePair*]:
@ -136,7 +140,7 @@ index 110136af81b..48cebe45d5b 100644
| kvpair | kvpair
kvpair[KeyValuePair*]: a=expression ':' b=expression { _PyPegen_key_value_pair(p, a, b) } kvpair[KeyValuePair*]: a=expression ':' b=expression { _PyPegen_key_value_pair(p, a, b) }
@@ -1098,7 +1129,7 @@ kwarg_or_double_starred[KeywordOrStarred*]: @@ -1098,7 +1133,7 @@ kwarg_or_double_starred[KeywordOrStarred*]:
# Generic targets # Generic targets
# --------------- # ---------------
@ -145,7 +149,7 @@ index 110136af81b..48cebe45d5b 100644
star_targets[expr_ty]: star_targets[expr_ty]:
| a=star_target !',' { a } | a=star_target !',' { a }
| a=star_target b=(',' c=star_target { c })* [','] { | a=star_target b=(',' c=star_target { c })* [','] {
@@ -1266,9 +1297,9 @@ invalid_named_expression(memo): @@ -1266,9 +1301,9 @@ invalid_named_expression(memo):
| a=expression ':=' expression { | a=expression ':=' expression {
RAISE_SYNTAX_ERROR_KNOWN_LOCATION( RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
a, "cannot use assignment expressions with %s", _PyPegen_get_expr_name(a)) } a, "cannot use assignment expressions with %s", _PyPegen_get_expr_name(a)) }
@ -157,7 +161,7 @@ index 110136af81b..48cebe45d5b 100644
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot assign to %s here. Maybe you meant '==' instead of '='?", RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot assign to %s here. Maybe you meant '==' instead of '='?",
_PyPegen_get_expr_name(a)) } _PyPegen_get_expr_name(a)) }
@@ -1334,7 +1365,7 @@ invalid_comprehension: @@ -1334,7 +1369,7 @@ invalid_comprehension:
| ('[' | '{') a=star_named_expression b=',' for_if_clauses { | ('[' | '{') a=star_named_expression b=',' for_if_clauses {
RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "did you forget parentheses around the comprehension target?") } RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "did you forget parentheses around the comprehension target?") }
invalid_dict_comprehension: invalid_dict_comprehension:
@ -166,7 +170,7 @@ index 110136af81b..48cebe45d5b 100644
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "dict unpacking cannot be used in dict comprehension") } RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "dict unpacking cannot be used in dict comprehension") }
invalid_parameters: invalid_parameters:
| a="/" ',' { | a="/" ',' {
@@ -1397,7 +1428,7 @@ invalid_with_item: @@ -1397,7 +1432,7 @@ invalid_with_item:
RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) } RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) }
invalid_for_if_clause: invalid_for_if_clause:
@ -175,7 +179,7 @@ index 110136af81b..48cebe45d5b 100644
RAISE_SYNTAX_ERROR("'in' expected after for-loop variables") } RAISE_SYNTAX_ERROR("'in' expected after for-loop variables") }
invalid_for_target: invalid_for_target:
@@ -1531,12 +1562,12 @@ invalid_class_def_raw: @@ -1531,12 +1566,12 @@ invalid_class_def_raw:
invalid_double_starred_kvpairs: invalid_double_starred_kvpairs:
| ','.double_starred_kvpair+ ',' invalid_kvpair | ','.double_starred_kvpair+ ',' invalid_kvpair
@ -191,7 +195,7 @@ index 110136af81b..48cebe45d5b 100644
invalid_starred_expression_unpacking: invalid_starred_expression_unpacking:
| a='*' expression '=' b=expression { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot assign to iterable argument unpacking") } | a='*' expression '=' b=expression { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "cannot assign to iterable argument unpacking") }
diff --git a/Parser/action_helpers.c b/Parser/action_helpers.c diff --git a/Parser/action_helpers.c b/Parser/action_helpers.c
index 50856686335..53887c4fb55 100644 index 50856686335..44d617f48cc 100644
--- a/Parser/action_helpers.c --- a/Parser/action_helpers.c
+++ b/Parser/action_helpers.c +++ b/Parser/action_helpers.c
@@ -1152,6 +1152,32 @@ _PyPegen_get_last_comprehension_item(comprehension_ty comprehension) { @@ -1152,6 +1152,32 @@ _PyPegen_get_last_comprehension_item(comprehension_ty comprehension) {