grammar.md
1> **Источник:** https://python-all.ru/3.15/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/3.15/Grammar/python.gram)). Версия здесь опускает детали, связанные с генерацией кода и восстановлением после ошибок.1011Используемая здесь нотация такая же, как в предыдущих документах, и описана в разделе [нотация](https://python-all.ru/3.15/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