Skip to content

Commit 3941d97

Browse files
authored
bpo-40334: Refactor lambda_parameters similar to parameters (GH-19830)
1 parent d955241 commit 3941d97

File tree

2 files changed

+1188
-1086
lines changed

2 files changed

+1188
-1086
lines changed

Grammar/python.gram

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,7 @@ star_etc[StarEtc*]:
246246
_PyPegen_star_etc(p, NULL, b, c) }
247247
| a=kwds { _PyPegen_star_etc(p, NULL, NULL, a) }
248248

249-
kwds[arg_ty]:
250-
| '**' a=param_no_default { a }
249+
kwds[arg_ty]: '**' a=param_no_default { a }
251250

252251
# One parameter. This *includes* a following comma and type comment.
253252
#
@@ -325,32 +324,47 @@ expression[expr_ty] (memo):
325324

326325
lambdef[expr_ty]:
327326
| 'lambda' a=[lambda_parameters] ':' b=expression { _Py_Lambda((a) ? a : CHECK(_PyPegen_empty_arguments(p)), b, EXTRA) }
327+
328+
# lambda_parameters etc. duplicates parameters but without annotations
329+
# or type comments, and if there's no comma after a parameter, we expect
330+
# a colon, not a close parenthesis. (For more, see parameters above.)
331+
#
328332
lambda_parameters[arguments_ty]:
329-
| a=lambda_slash_without_default b=[',' x=lambda_plain_names { x }] c=[',' y=lambda_names_with_default { y }] d=[',' z=[lambda_star_etc] { z }] {
333+
| a=lambda_slash_no_default b=lambda_param_no_default* c=lambda_param_with_default* d=[lambda_star_etc] {
330334
_PyPegen_make_arguments(p, a, NULL, b, c, d) }
331-
| a=lambda_slash_with_default b=[',' y=lambda_names_with_default { y }] c=[',' z=[lambda_star_etc] { z }] {
335+
| a=lambda_slash_with_default b=lambda_param_with_default* c=[lambda_star_etc] {
332336
_PyPegen_make_arguments(p, NULL, a, NULL, b, c) }
333-
| a=lambda_plain_names b=[',' y=lambda_names_with_default { y }] c=[',' z=[lambda_star_etc] { z }] {
337+
| a=lambda_param_no_default+ b=lambda_param_with_default* c=[lambda_star_etc] {
334338
_PyPegen_make_arguments(p, NULL, NULL, a, b, c) }
335-
| a=lambda_names_with_default b=[',' z=[lambda_star_etc] { z }] { _PyPegen_make_arguments(p, NULL, NULL, NULL, a, b)}
339+
| a=lambda_param_with_default+ b=[lambda_star_etc] { _PyPegen_make_arguments(p, NULL, NULL, NULL, a, b)}
336340
| a=lambda_star_etc { _PyPegen_make_arguments(p, NULL, NULL, NULL, NULL, a) }
337-
lambda_slash_without_default[asdl_seq*]: a=lambda_plain_names ',' '/' { a }
338-
lambda_slash_with_default[SlashWithDefault*]: a=[n=lambda_plain_names ',' { n }] b=lambda_names_with_default ',' '/' {
339-
_PyPegen_slash_with_default(p, a, b) }
341+
342+
lambda_slash_no_default[asdl_seq*]:
343+
| a=lambda_param_no_default+ '/' ',' { a }
344+
| a=lambda_param_no_default+ '/' &':' { a }
345+
lambda_slash_with_default[SlashWithDefault*]:
346+
| a=lambda_param_no_default* b=lambda_param_with_default+ '/' ',' { _PyPegen_slash_with_default(p, a, b) }
347+
| a=lambda_param_no_default* b=lambda_param_with_default+ '/' &':' { _PyPegen_slash_with_default(p, a, b) }
348+
340349
lambda_star_etc[StarEtc*]:
341-
| '*' a=lambda_plain_name b=lambda_name_with_optional_default* c=[',' d=lambda_kwds { d }] [','] {
350+
| '*' a=lambda_param_no_default b=lambda_param_maybe_default* c=[lambda_kwds] {
342351
_PyPegen_star_etc(p, a, b, c) }
343-
| '*' b=lambda_name_with_optional_default+ c=[',' d=lambda_kwds { d }] [','] {
352+
| '*' ',' b=lambda_param_maybe_default+ c=[lambda_kwds] {
344353
_PyPegen_star_etc(p, NULL, b, c) }
345-
| a=lambda_kwds [','] { _PyPegen_star_etc(p, NULL, NULL, a) }
346-
lambda_name_with_optional_default[NameDefaultPair*]:
347-
| ',' a=lambda_plain_name b=['=' e=expression { e }] { _PyPegen_name_default_pair(p, a, b, NULL) }
348-
lambda_names_with_default[asdl_seq*]: a=','.lambda_name_with_default+ { a }
349-
lambda_name_with_default[NameDefaultPair*]:
350-
| n=lambda_plain_name '=' e=expression { _PyPegen_name_default_pair(p, n, e, NULL) }
351-
lambda_plain_names[asdl_seq*]: a=','.(lambda_plain_name !'=')+ { a }
352-
lambda_plain_name[arg_ty]: a=NAME { _Py_arg(a->v.Name.id, NULL, NULL, EXTRA) }
353-
lambda_kwds[arg_ty]: '**' a=lambda_plain_name { a }
354+
| a=lambda_kwds { _PyPegen_star_etc(p, NULL, NULL, a) }
355+
356+
lambda_kwds[arg_ty]: '**' a=lambda_param_no_default { a }
357+
358+
lambda_param_no_default[arg_ty]:
359+
| a=lambda_param ',' { a }
360+
| a=lambda_param &':' { a }
361+
lambda_param_with_default[NameDefaultPair*]:
362+
| a=lambda_param c=default ',' { _PyPegen_name_default_pair(p, a, c, NULL) }
363+
| a=lambda_param c=default &':' { _PyPegen_name_default_pair(p, a, c, NULL) }
364+
lambda_param_maybe_default[NameDefaultPair*]:
365+
| a=lambda_param c=default? ',' { _PyPegen_name_default_pair(p, a, c, NULL) }
366+
| a=lambda_param c=default? &':' { _PyPegen_name_default_pair(p, a, c, NULL) }
367+
lambda_param[arg_ty]: a=NAME { _Py_arg(a->v.Name.id, NULL, NULL, EXTRA) }
354368

355369
disjunction[expr_ty] (memo):
356370
| a=conjunction b=('or' c=conjunction { c })+ { _Py_BoolOp(

0 commit comments

Comments
 (0)