Документация Python неофициальный перевод

grammar.md

973 строк · 28.2 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.16/reference/grammar.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 10. Полная спецификация грамматики89Это полная грамматика Python, полученная непосредственно из грамматики, используемой для генерации парсера CPython (см. [Grammar/python.gram](https://python-all.ru/src/main/Grammar/python.gram)). Версия здесь опускает детали, связанные с генерацией кода и восстановлением после ошибок.1011Используемая здесь нотация такая же, как в предыдущих документах, и описана в разделе [нотация](https://python-all.ru/3.16/reference/introduction.html#notation), за исключением одного дополнительного усложнения:1213- `~` («отсечение»): фиксировать текущую альтернативу; правило считается невыполненным, если альтернатива не может быть разобрана1415  Python использует отсечения в основном для оптимизации или улучшения сообщений об ошибках. В приведённом ниже списке они часто выглядят бесполезными.1617  В настоящее время отсечения не появляются внутри круглых скобок, квадратных скобок, опережающих проверок и тому подобного. Их поведение в этих контекстах намеренно оставлено неопределённым.1819```peg20# PEG-грамматика для Python2122# ========================= НАЧАЛО ГРАММАТИКИ =========================2324# Общие грамматические элементы и правила:25#26# * Строки в двойных кавычках (") обозначают МЯГКИЕ КЛЮЧЕВЫЕ СЛОВА27# * Строки в одинарных кавычках (') обозначают КЛЮЧЕВЫЕ СЛОВА28# * Имена в верхнем регистре (NAME) обозначают токены в файле Grammar/Tokens29# * Имена правил, начинающиеся с "invalid_", используются для специализированных синтаксических ошибок30#     - Эти правила НЕ используются на первом проходе парсера.31#     - Только если первый проход не смог выполнить разбор, второй проход, включающий invalid-32#       правила, будет выполнен.33#     - Если парсер завершается ошибкой на втором этапе с общей синтаксической ошибкой,34#       будет использовано местоположение общей ошибки первого прохода (это позволяет избежать35#       сообщения неверных местоположений из-за invalid-правил).36#     - Порядок альтернатив, включающих invalid-правила, имеет значение37#       (как и любое правило в PEG).38#39# Синтаксис грамматики (см. PEP 617 для получения дополнительной информации):40#41# rule_name: expression42#   Опционально, сразу после имени правила можно указать тип, который задаёт возвращаемый тип функции на Си или Python, соответствующей правилу:43#   указывает тип возвращаемого значения C- или Python-функции, соответствующей44#   правилу:45# rule_name[return_type]: expression46#   Если тип возврата опущен, то в Си возвращается void *, а в Python – Any.47#   Python.48# e1 e249#   Сопоставить e1, затем сопоставить e2.50# e1 | e251#   Сопоставить e1 или e2.52#   Первая альтернатива также может располагаться на строке после имени правила для форматирования. В этом случае перед первой альтернативой нужно использовать |, например:53#   целей форматирования. В этом случае | должен использоваться перед первым54#   альтернативой, как показано ниже:55#       rule_name[return_type]:56#            | first_alt57#            | second_alt58# ( e )59#   Сопоставить e (также позволяет использовать другие операторы в группе, например '(e)*')60# [ e ] or e?61#   Опционально сопоставить e.62# e*63#   Сопоставить ноль или более вхождений e.64# e+65#   Сопоставить одно или более вхождений e.66# s.e+67#   Сопоставить одно или более вхождений e, разделённых s. В сгенерированном дереве разбора разделитель не включается. В остальном это идентично (e (s e)*).68#   не включает разделитель. В остальном это идентично (e (s e)*).69# &e70#   Успех, если e можно разобрать, не поглощая ни одного символа.71# !e72#   Неудача, если e можно разобрать, не поглощая ни одного символа.73# ~74#   Закрепить текущую альтернативу, даже если она не может быть разобрана.75# &&e76#   Жадный разбор выражения (e). Синтаксический анализатор не будет возвращаться назад и немедленно завершится с синтаксической ошибкой (SyntaxError), если выражение не удаётся разобрать.77#   Завершается с SyntaxError, если e не удаётся разобрать.78#7980# НАЧАЛЬНЫЕ ПРАВИЛА81# ==============8283file: [statements] ENDMARKER 84interactive: statement_newline 85eval: expressions NEWLINE* ENDMARKER 86func_type: '(' [type_expressions] ')' '->' expression NEWLINE* ENDMARKER 8788# ОБЩИЕ ИНСТРУКЦИИ89# ==================9091statements: statement+ 9293statement:94    | compound_stmt 95    | simple_stmts 9697single_compound_stmt:98    | compound_stmt 99100statement_newline:101    | single_compound_stmt NEWLINE 102    | simple_stmts103    | NEWLINE 104    | ENDMARKER 105106simple_stmts:107    | simple_stmt !';' NEWLINE  # Не нужно, присутствует для ускорения108    | ';'.simple_stmt+ [';'] NEWLINE 109110# ПРИМЕЧАНИЕ: присваивание ДОЛЖНО предшествовать выражению, иначе разбор простого присваивания вызовет синтаксическую ошибку (SyntaxError).111# Вызовет SyntaxError.112simple_stmt:113    | assignment114    | type_alias115    | import_stmt116    | star_expressions 117    | return_stmt118    | raise_stmt119    | pass_stmt120    | del_stmt121    | yield_stmt122    | assert_stmt123    | break_stmt124    | continue_stmt125    | global_stmt126    | nonlocal_stmt127128compound_stmt:129    | function_def130    | if_stmt131    | class_def132    | with_stmt133    | for_stmt134    | try_stmt135    | while_stmt136    | match_stmt137138# ПРОСТЫЕ ИНСТРУКЦИИ139# =================140141# ПРИМЕЧАНИЕ: annotated_rhs может начинаться с 'yield'; yield_expr должен начинаться с 'yield'142assignment:143    | NAME ':' expression ['=' annotated_rhs ] 144    | ('(' single_target ')' 145         | single_subscript_attribute_target) ':' expression ['=' annotated_rhs ] 146    | (star_targets '=' )+ annotated_rhs !'=' [TYPE_COMMENT] 147    | single_target augassign ~ annotated_rhs 148149annotated_rhs: yield_expr | star_expressions150151augassign:152    | '+=' 153    | '-=' 154    | '*=' 155    | '@=' 156    | '/=' 157    | '%=' 158    | '&=' 159    | '|=' 160    | '^=' 161    | '<<=' 162    | '>>=' 163    | '**=' 164    | '//=' 165166return_stmt:167    | 'return' [star_expressions] 168169raise_stmt:170    | 'raise' expression 'from' expression 171    | 'raise' expression 172    | 'raise' 173174pass_stmt:175    | 'pass' 176177break_stmt:178    | 'break' 179180continue_stmt:181    | 'continue' 182183global_stmt: 'global' ','.NAME+ 184185nonlocal_stmt: 'nonlocal' ','.NAME+ 186187del_stmt:188    | 'del' del_targets &(';' | NEWLINE) 189190yield_stmt: yield_expr 191192assert_stmt:193    | 'assert' expression [',' expression ] 194195import_stmt:196    | import_name197    | import_from198199# Инструкции импорта200# -----------------201202import_name:203    | "lazy"? 'import' dotted_as_names 204205# примечание ниже: ('.' | '...') необходимо, потому что '...' токенизируется как ELLIPSIS206import_from:207    | "lazy"? 'from' ('.' | '...')* dotted_name 'import' import_from_targets 208    | "lazy"? 'from' ('.' | '...')+ 'import' import_from_targets 209import_from_targets:210    | '(' import_from_as_names [','] ')' 211    | import_from_as_names !','212    | '*' 213import_from_as_names:214    | ','.import_from_as_name+ 215import_from_as_name:216    | NAME ['as' NAME ] 217218dotted_as_names:219    | ','.dotted_as_name+ 220dotted_as_name:221    | dotted_name ['as' NAME ] 222223dotted_name:224    | dotted_name '.' NAME 225    | NAME226227# СОСТАВНЫЕ ИНСТРУКЦИИ228# ===================229230# Общие элементы231# ---------------232233block:234    | NEWLINE INDENT statements DEDENT 235    | simple_stmts236237decorators: ('@' named_expression NEWLINE )+ 238239# Определения классов240# -----------------241242class_def:243    | decorators class_def_raw 244    | class_def_raw245246class_def_raw:247    | 'class' NAME [type_params] ['(' [arguments] ')' ] ':' block 248249# Определения функций250# --------------------251252function_def:253    | decorators function_def_raw 254    | function_def_raw255256function_def_raw:257    | 'def' NAME [type_params] '(' [params] ')' ['->' expression ] ':' [func_type_comment] block 258    | 'async' 'def' NAME [type_params] '(' [params] ')' ['->' expression ] ':' [func_type_comment] block 259260# Параметры функций261# -------------------262263params:264    | parameters265266parameters:267    | slash_no_default param_no_default* param_with_default* [star_etc] 268    | slash_with_default param_with_default* [star_etc] 269    | param_no_default+ param_with_default* [star_etc] 270    | param_with_default+ [star_etc] 271    | star_etc 272273# Некоторое дублирование здесь, потому что мы не можем написать (',' | &')'), так как пустые альтернативы пока не поддерживаются.274# причина в том, что пустые альтернативы пока не поддерживаются.275276slash_no_default:277    | param_no_default+ '/' ',' 278    | param_no_default+ '/' &')' 279slash_with_default:280    | param_no_default* param_with_default+ '/' ',' 281    | param_no_default* param_with_default+ '/' &')' 282283star_etc:284    | '*' param_no_default param_maybe_default* [kwds] 285    | '*' param_no_default_star_annotation param_maybe_default* [kwds] 286    | '*' ',' param_maybe_default+ [kwds] 287    | kwds 288289kwds:290    | '**' param_no_default 291292# Один параметр. Это *включает* последующую запятую и комментарий типа.293#294# Есть три стиля:295# - Без умолчания296# - Со значением по умолчанию297# - Возможно, со значением по умолчанию298#299# Существует две альтернативные формы каждой, для работы с комментариями типа:300# - Заканчивается запятой, за которой следует необязательный комментарий типа301# - Без запятой, необязательный комментарий типа, обязательно должна следовать закрывающая скобка302# Последняя форма предназначена для конечного параметра без завершающей запятой.303#304305param_no_default:306    | param ',' TYPE_COMMENT? 307    | param TYPE_COMMENT? &')' 308param_no_default_star_annotation:309    | param_star_annotation ',' TYPE_COMMENT? 310    | param_star_annotation TYPE_COMMENT? &')' 311param_with_default:312    | param default ',' TYPE_COMMENT? 313    | param default TYPE_COMMENT? &')' 314param_maybe_default:315    | param default? ',' TYPE_COMMENT? 316    | param default? TYPE_COMMENT? &')' 317param: NAME annotation? 318param_star_annotation: NAME star_annotation 319annotation: ':' expression 320star_annotation: ':' star_expression 321default: '=' expression  | invalid_default322323# Инструкция if324# ------------325326if_stmt:327    | 'if' named_expression ':' block elif_stmt 328    | 'if' named_expression ':' block [else_block] 329elif_stmt:330    | 'elif' named_expression ':' block elif_stmt 331    | 'elif' named_expression ':' block [else_block] 332else_block:333    | 'else' ':' block 334335# Инструкция while336# ---------------337338while_stmt:339    | 'while' named_expression ':' block [else_block] 340341# Инструкция for342# -------------343344for_stmt:345    | 'for' star_targets 'in' ~ star_expressions ':' [TYPE_COMMENT] block [else_block] 346    | 'async' 'for' star_targets 'in' ~ star_expressions ':' [TYPE_COMMENT] block [else_block] 347348# Инструкция with349# --------------350351with_stmt:352    | 'with' '(' ','.with_item+ ','? ')' ':' [TYPE_COMMENT] block 353    | 'with' ','.with_item+ ':' [TYPE_COMMENT] block 354    | 'async' 'with' '(' ','.with_item+ ','? ')' ':' block 355    | 'async' 'with' ','.with_item+ ':' [TYPE_COMMENT] block 356357with_item:358    | expression 'as' star_target &(',' | ')' | ':') 359    | expression 360361# Инструкция try362# -------------363364try_stmt:365    | 'try' ':' block finally_block 366    | 'try' ':' block except_block+ [else_block] [finally_block] 367    | 'try' ':' block except_star_block+ [else_block] [finally_block] 368369# Инструкция except370# ----------------371372except_block:373    | 'except' expression ':' block 374    | 'except' expression 'as' NAME ':' block 375    | 'except' expressions ':' block 376    | 'except' ':' block 377except_star_block:378    | 'except' '*' expression ':' block 379    | 'except' '*' expression 'as' NAME ':' block 380    | 'except' '*' expressions ':' block 381finally_block:382    | 'finally' ':' block 383384# Инструкция match385# ---------------386387match_stmt:388    | "match" subject_expr ':' NEWLINE INDENT case_block+ DEDENT 389390subject_expr:391    | star_named_expression ',' star_named_expressions? 392    | named_expression393394case_block:395    | "case" patterns guard? ':' block 396397guard: 'if' named_expression 398399patterns:400    | open_sequence_pattern 401    | pattern402403pattern:404    | as_pattern405    | or_pattern406407as_pattern:408    | or_pattern 'as' pattern_capture_target 409410or_pattern:411    | '|'.closed_pattern+ 412413closed_pattern:414    | literal_pattern415    | capture_pattern416    | wildcard_pattern417    | value_pattern418    | group_pattern419    | sequence_pattern420    | mapping_pattern421    | class_pattern422423# Литеральные шаблоны используются для ограничений равенства и идентичности424literal_pattern:425    | signed_number !('+' | '-') 426    | complex_number 427    | strings 428    | 'None' 429    | 'True' 430    | 'False' 431432# Литеральные выражения используются для ограничения допустимых ключей шаблонов отображения433literal_expr:434    | signed_number !('+' | '-')435    | complex_number436    | strings437    | 'None' 438    | 'True' 439    | 'False' 440441complex_number:442    | signed_real_number '+' imaginary_number 443    | signed_real_number '-' imaginary_number  444445signed_number:446    | NUMBER447    | '+' NUMBER 448    | '-' NUMBER 449450signed_real_number:451    | real_number452    | '+' real_number 453    | '-' real_number 454455real_number:456    | NUMBER 457458imaginary_number:459    | NUMBER 460    | '+' NUMBER 461462capture_pattern:463    | pattern_capture_target 464465pattern_capture_target:466    | !"_" NAME !('.' | '(' | '=') 467468wildcard_pattern:469    | "_" 470471value_pattern:472    | attr !('.' | '(' | '=') 473474attr:475    | name_or_attr '.' NAME 476477name_or_attr:478    | attr479    | NAME480481group_pattern:482    | '(' pattern ')' 483484sequence_pattern:485    | '[' maybe_sequence_pattern? ']' 486    | '(' open_sequence_pattern? ')' 487488open_sequence_pattern:489    | maybe_star_pattern ',' maybe_sequence_pattern? 490491maybe_sequence_pattern:492    | ','.maybe_star_pattern+ ','? 493494maybe_star_pattern:495    | star_pattern496    | pattern497498star_pattern:499    | '*' pattern_capture_target 500    | '*' wildcard_pattern 501502mapping_pattern:503    | '{' '}' 504    | '{' double_star_pattern ','? '}' 505    | '{' items_pattern ',' double_star_pattern ','? '}' 506    | '{' items_pattern ','? '}' 507508items_pattern:509    | ','.key_value_pattern+510511key_value_pattern:512    | (literal_expr | attr) ':' pattern 513514double_star_pattern:515    | '**' pattern_capture_target 516517class_pattern:518    | name_or_attr '(' ')' 519    | name_or_attr '(' positional_patterns ','? ')' 520    | name_or_attr '(' keyword_patterns ','? ')' 521    | name_or_attr '(' positional_patterns ',' keyword_patterns ','? ')' 522523positional_patterns:524    | ','.pattern+ 525526keyword_patterns:527    | ','.keyword_pattern+528529keyword_pattern:530    | NAME '=' pattern 531532# Инструкция type533# ---------------534535type_alias:536    | "type" NAME [type_params] '=' expression 537538# Объявление параметра типа539# --------------------------540541type_params:542    | '[' type_param_seq ']' 543544type_param_seq: ','.type_param+ [','] 545546type_param:547    | NAME [type_param_bound] [type_param_default] 548    | '*' NAME [type_param_starred_default] 549    | '**' NAME [type_param_default] 550551type_param_bound: ':' expression 552type_param_default: '=' expression 553type_param_starred_default: '=' star_expression 554555# ВЫРАЖЕНИЯ556# -----------557558expressions:559    | expression (',' expression )+ [','] 560    | expression ',' 561    | expression562563expression:564    | if_expression565    | disjunction566    | lambdef567568if_expression:569    | disjunction 'if' disjunction 'else' expression 570571yield_expr:572    | 'yield' 'from' expression 573    | 'yield' [star_expressions] 574575star_expressions:576    | star_expression (',' star_expression )+ [','] 577    | star_expression ',' 578    | star_expression579580star_expression:581    | '*' bitwise_or 582    | expression583584star_named_expressions: ','.star_named_expression+ [','] 585586star_named_expressions_sequence: ','.star_named_expression_sequence+ [','] 587588star_named_expression:589    | '*' bitwise_or 590    | named_expression591592star_named_expression_sequence:593    | star_named_expression594595assignment_expression:596    | NAME ':=' ~ expression 597598named_expression:599    | assignment_expression600    | expression !':='601602disjunction:603    | conjunction ('or' conjunction )+ 604    | conjunction605606conjunction:607    | inversion ('and' inversion )+ 608    | inversion609610inversion:611    | 'not' inversion 612    | comparison613614# Операторы сравнения615# --------------------616617comparison:618    | bitwise_or compare_op_bitwise_or_pair+ 619    | bitwise_or620621compare_op_bitwise_or_pair:622    | eq_bitwise_or623    | noteq_bitwise_or624    | lte_bitwise_or625    | lt_bitwise_or626    | gte_bitwise_or627    | gt_bitwise_or628    | notin_bitwise_or629    | in_bitwise_or630    | isnot_bitwise_or631    | is_bitwise_or632633eq_bitwise_or: '==' bitwise_or 634noteq_bitwise_or:635    | ('!=' ) bitwise_or 636lte_bitwise_or: '<=' bitwise_or 637lt_bitwise_or: '<' bitwise_or 638gte_bitwise_or: '>=' bitwise_or 639gt_bitwise_or: '>' bitwise_or 640notin_bitwise_or: 'not' 'in' bitwise_or 641in_bitwise_or: 'in' bitwise_or 642isnot_bitwise_or: 'is' 'not' bitwise_or 643is_bitwise_or: 'is' bitwise_or 644645# Побитовые операторы646# -----------------647648bitwise_or:649    | bitwise_or '|' bitwise_xor 650    | bitwise_xor651652bitwise_xor:653    | bitwise_xor '^' bitwise_and 654    | bitwise_and655656bitwise_and:657    | bitwise_and '&' shift_expr 658    | shift_expr659660shift_expr:661    | shift_expr '<<' sum 662    | shift_expr '>>' sum 663    | sum664665# Арифметические операторы.666# --------------------667668sum:669    | sum '+' term 670    | sum '-' term 671    | term672673term:674    | term '*' factor 675    | term '/' factor 676    | term '//' factor 677    | term '%' factor 678    | term '@' factor 679    | factor680681factor:682    | '+' factor 683    | '-' factor 684    | '~' factor 685    | power686687power:688    | await_primary '**' factor 689    | await_primary690691# Первичные элементы692# ----------------693694# Первичные элементы – это такие конструкции, как "obj.something.something", "obj[something]", "obj(something)", "obj" ...695696await_primary:697    | 'await' primary 698    | primary699700primary:701    | primary '.' NAME 702    | primary genexp 703    | primary '(' [arguments] ')' 704    | primary '[' slices ']' 705    | atom706707slices:708    | slice !',' 709    | ','.(slice | starred_expression)+ [','] 710711slice:712    | [expression] ':' [expression] [':' [expression] ] 713    | named_expression 714715atom:716    | NAME717    | 'True' 718    | 'False' 719    | 'None' 720    | strings721    | NUMBER722    | (genexp | tuple | group)723    | (listcomp | list)724    | (dictcomp | setcomp | dict | set)725    | '...' 726727group:728    | '(' (yield_expr | named_expression) ')' 729730# Лямбда-функции731# ----------------732733lambdef:734    | 'lambda' [lambda_params] ':' expression 735736lambda_params:737    | lambda_parameters738739# lambda_parameters и т.д. дублируют параметры, но без аннотаций740# или комментариев типа, и если после параметра нет запятой, ожидается741# двоеточие, а не закрывающая скобка. (Подробнее см. параметры выше.)742#743lambda_parameters:744    | lambda_slash_no_default lambda_param_no_default* lambda_param_with_default* [lambda_star_etc] 745    | lambda_slash_with_default lambda_param_with_default* [lambda_star_etc] 746    | lambda_param_no_default+ lambda_param_with_default* [lambda_star_etc] 747    | lambda_param_with_default+ [lambda_star_etc] 748    | lambda_star_etc 749750lambda_slash_no_default:751    | lambda_param_no_default+ '/' ',' 752    | lambda_param_no_default+ '/' &':' 753754lambda_slash_with_default:755    | lambda_param_no_default* lambda_param_with_default+ '/' ',' 756    | lambda_param_no_default* lambda_param_with_default+ '/' &':' 757758lambda_star_etc:759    | '*' lambda_param_no_default lambda_param_maybe_default* [lambda_kwds] 760    | '*' ',' lambda_param_maybe_default+ [lambda_kwds] 761    | lambda_kwds 762763lambda_kwds:764    | '**' lambda_param_no_default 765766lambda_param_no_default:767    | lambda_param ',' 768    | lambda_param &':' 769lambda_param_with_default:770    | lambda_param default ',' 771    | lambda_param default &':' 772lambda_param_maybe_default:773    | lambda_param default? ',' 774    | lambda_param default? &':' 775lambda_param: NAME 776777# ЛИТЕРАЛЫ778# ========779780fstring_middle:781    | fstring_replacement_field782    | FSTRING_MIDDLE 783fstring_replacement_field:784    | '{' annotated_rhs '='? [fstring_conversion] [fstring_full_format_spec] '}' 785fstring_conversion:786    | "!" NAME 787fstring_full_format_spec:788    | ':' fstring_format_spec* 789fstring_format_spec:790    | FSTRING_MIDDLE 791    | fstring_replacement_field792fstring:793    | FSTRING_START fstring_middle* FSTRING_END 794795tstring_format_spec_replacement_field:796    | '{' annotated_rhs '='? [fstring_conversion] [tstring_full_format_spec] '}' 797tstring_format_spec:798    | TSTRING_MIDDLE 799    | tstring_format_spec_replacement_field800tstring_full_format_spec:801    | ':' tstring_format_spec* 802tstring_replacement_field:803    | '{' annotated_rhs '='? [fstring_conversion] [tstring_full_format_spec] '}' 804tstring_middle:805    | tstring_replacement_field806    | TSTRING_MIDDLE 807tstring:808    | TSTRING_START tstring_middle* TSTRING_END 809810string: STRING 811strings:812    | (fstring|string)+ 813    | tstring+ 814815list:816    | '[' [star_named_expressions_sequence] ']' 817818tuple:819    | '(' [star_named_expression_sequence ',' [star_named_expressions_sequence]  ] ')' 820821set: '{' star_named_expressions_sequence '}' 822823# Словари824# -----825826dict:827    | '{' [double_starred_kvpairs] '}' 828829double_starred_kvpairs: ','.double_starred_kvpair+ [','] 830831double_starred_kvpair:832    | '**' bitwise_or 833    | kvpair834835kvpair: expression ':' expression 836837# Генераторы списков и генераторы838# ---------------------------839840for_if_clauses:841    | for_if_clause+ 842843for_if_clause:844    | 'async' 'for' star_targets 'in' ~ disjunction ('if' disjunction )* 845    | 'for' star_targets 'in' ~ disjunction ('if' disjunction )* 846847listcomp:848    | '[' star_named_expression for_if_clauses ']' 849850setcomp:851    | '{' star_named_expression for_if_clauses '}' 852853genexp:854    | '(' ( assignment_expression | expression !':=' | starred_expression ) for_if_clauses ')' 855856dictcomp:857    | '{' kvpair for_if_clauses '}' 858    | '{' '**' expression for_if_clauses '}' 859860# АРГУМЕНТЫ ВЫЗОВА ФУНКЦИИ861# =======================862863arguments:864    | args [','] &')' 865866args:867    | ','.(starred_expression | ( assignment_expression | expression !':=') !'=')+ [',' kwargs ] 868    | kwargs 869870kwargs:871    | ','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+ 872    | ','.kwarg_or_starred+873    | ','.kwarg_or_double_starred+874875starred_expression:876    | '*' expression 877878kwarg_or_starred:879    | NAME '=' expression 880    | starred_expression 881882kwarg_or_double_starred:883    | NAME '=' expression 884    | '**' expression 885886# ЦЕЛИ ПРИСВАИВАНИЯ887# ==================888889# Обобщённые цели890# ---------------891892# ПРИМЕЧАНИЕ: star_targets может содержать *bitwise_or, цели – нет.893star_targets:894    | star_target !',' 895    | star_target (',' star_target )* [','] 896897star_targets_list_seq: ','.star_target+ [','] 898899star_targets_tuple_seq:900    | star_target (',' star_target )+ [','] 901    | star_target ',' 902903star_target:904    | '*' (!'*' star_target) 905    | target_with_star_atom906907target_with_star_atom:908    | t_primary '.' NAME !t_lookahead 909    | t_primary '[' slices ']' !t_lookahead 910    | star_atom911912star_atom:913    | NAME 914    | '(' target_with_star_atom ')' 915    | '(' [star_targets_tuple_seq] ')' 916    | '[' [star_targets_list_seq] ']' 917918single_target:919    | single_subscript_attribute_target920    | NAME 921    | '(' single_target ')' 922923single_subscript_attribute_target:924    | t_primary '.' NAME !t_lookahead 925    | t_primary '[' slices ']' !t_lookahead 926927t_primary:928    | t_primary '.' NAME &t_lookahead 929    | t_primary '[' slices ']' &t_lookahead 930    | t_primary genexp &t_lookahead 931    | t_primary '(' [arguments] ')' &t_lookahead 932    | atom &t_lookahead 933934t_lookahead: '(' | '[' | '.'935936# Цели для инструкций del937# --------------------------938939del_targets: ','.del_target+ [','] 940941del_target:942    | t_primary '.' NAME !t_lookahead 943    | t_primary '[' slices ']' !t_lookahead 944    | del_t_atom945946del_t_atom:947    | NAME 948    | '(' del_target ')' 949    | '(' [del_targets] ')' 950    | '[' [del_targets] ']' 951952# ЭЛЕМЕНТЫ ТИПИЗАЦИИ953# ---------------954955# type_expressions допускают */**, но игнорируют их956type_expressions:957    | ','.expression+ ',' '*' expression ',' '**' expression 958    | ','.expression+ ',' '*' expression 959    | ','.expression+ ',' '**' expression 960    | '*' expression ',' '**' expression 961    | '*' expression 962    | '**' expression 963    | ','.expression+ 964965func_type_comment:966    | NEWLINE TYPE_COMMENT &(NEWLINE INDENT)   # Должен следовать блок с отступом967    | TYPE_COMMENT968969# ========================= КОНЕЦ ГРАММАТИКИ ===========================970971# ========================= НАЧАЛО НЕДОПУСТИМЫХ ПРАВИЛ =======================972```973