bpo-36541: Add lib2to3 grammar PEP-570 pos-only arg parsing (GH-23759) · python/cpython@06bfd03

@@ -18,15 +18,55 @@ decorated: decorators (classdef | funcdef | async_funcdef)

1818

async_funcdef: ASYNC funcdef

1919

funcdef: 'def' NAME parameters ['->' test] ':' suite

2020

parameters: '(' [typedargslist] ')'

21-

typedargslist: ((tfpdef ['=' test] ',')*

22-

('*' [tname] (',' tname ['=' test])* [',' ['**' tname [',']]] | '**' tname [','])

23-

| tfpdef ['=' test] (',' tfpdef ['=' test])* [','])

21+22+

# The following definition for typedarglist is equivalent to this set of rules:

23+

#

24+

# arguments = argument (',' argument)*

25+

# argument = tfpdef ['=' test]

26+

# kwargs = '**' tname [',']

27+

# args = '*' [tname]

28+

# kwonly_kwargs = (',' argument)* [',' [kwargs]]

29+

# args_kwonly_kwargs = args kwonly_kwargs | kwargs

30+

# poskeyword_args_kwonly_kwargs = arguments [',' [args_kwonly_kwargs]]

31+

# typedargslist_no_posonly = poskeyword_args_kwonly_kwargs | args_kwonly_kwargs

32+

# typedarglist = arguments ',' '/' [',' [typedargslist_no_posonly]])|(typedargslist_no_posonly)"

33+

#

34+

# It needs to be fully expanded to allow our LL(1) parser to work on it.

35+36+

typedargslist: tfpdef ['=' test] (',' tfpdef ['=' test])* ',' '/' [

37+

',' [((tfpdef ['=' test] ',')* ('*' [tname] (',' tname ['=' test])*

38+

[',' ['**' tname [',']]] | '**' tname [','])

39+

| tfpdef ['=' test] (',' tfpdef ['=' test])* [','])]

40+

] | ((tfpdef ['=' test] ',')* ('*' [tname] (',' tname ['=' test])*

41+

[',' ['**' tname [',']]] | '**' tname [','])

42+

| tfpdef ['=' test] (',' tfpdef ['=' test])* [','])

43+2444

tname: NAME [':' test]

2545

tfpdef: tname | '(' tfplist ')'

2646

tfplist: tfpdef (',' tfpdef)* [',']

27-

varargslist: ((vfpdef ['=' test] ',')*

28-

('*' [vname] (',' vname ['=' test])* [',' ['**' vname [',']]] | '**' vname [','])

29-

| vfpdef ['=' test] (',' vfpdef ['=' test])* [','])

47+48+

# The following definition for varargslist is equivalent to this set of rules:

49+

#

50+

# arguments = argument (',' argument )*

51+

# argument = vfpdef ['=' test]

52+

# kwargs = '**' vname [',']

53+

# args = '*' [vname]

54+

# kwonly_kwargs = (',' argument )* [',' [kwargs]]

55+

# args_kwonly_kwargs = args kwonly_kwargs | kwargs

56+

# poskeyword_args_kwonly_kwargs = arguments [',' [args_kwonly_kwargs]]

57+

# vararglist_no_posonly = poskeyword_args_kwonly_kwargs | args_kwonly_kwargs

58+

# varargslist = arguments ',' '/' [','[(vararglist_no_posonly)]] | (vararglist_no_posonly)

59+

#

60+

# It needs to be fully expanded to allow our LL(1) parser to work on it.

61+62+

varargslist: vfpdef ['=' test ](',' vfpdef ['=' test])* ',' '/' [',' [

63+

((vfpdef ['=' test] ',')* ('*' [vname] (',' vname ['=' test])*

64+

[',' ['**' vname [',']]] | '**' vname [','])

65+

| vfpdef ['=' test] (',' vfpdef ['=' test])* [','])

66+

]] | ((vfpdef ['=' test] ',')*

67+

('*' [vname] (',' vname ['=' test])* [',' ['**' vname [',']]]| '**' vname [','])

68+

| vfpdef ['=' test] (',' vfpdef ['=' test])* [','])

69+3070

vname: NAME

3171

vfpdef: vname | '(' vfplist ')'

3272

vfplist: vfpdef (',' vfpdef)* [',']