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)
1818async_funcdef: ASYNC funcdef
1919funcdef: 'def' NAME parameters ['->' test] ':' suite
2020parameters: '(' [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+2444tname: NAME [':' test]
2545tfpdef: tname | '(' tfplist ')'
2646tfplist: 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+3070vname: NAME
3171vfpdef: vname | '(' vfplist ')'
3272vfplist: vfpdef (',' vfpdef)* [',']