grammar.md
1> **Источник:** https://python-all.ru/3.14/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.14/Grammar/python.gram)). Версия здесь опускает детали, связанные с генерацией кода и восстановлением после ошибок.1011Используемая здесь нотация такая же, как в предыдущих документах, и описана в разделе [нотация](https://python-all.ru/3.14/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 | star_expressions 116 | return_stmt117 | import_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' 172173pass_stmt:174 | 'pass' 175176break_stmt:177 | 'break' 178179continue_stmt:180 | 'continue' 181182global_stmt: 'global' ','.NAME+ 183184nonlocal_stmt: 'nonlocal' ','.NAME+ 185186del_stmt:187 | 'del' del_targets &(';' | NEWLINE) 188189yield_stmt: yield_expr 190191assert_stmt: 'assert' expression [',' expression ] 192193import_stmt:194 | import_name195 | import_from196197# Инструкции импорта198# -----------------199200import_name: 'import' dotted_as_names 201# примечание ниже: ('.' | '...') необходимо, потому что '...' токенизируется как ELLIPSIS202import_from:203 | 'from' ('.' | '...')* dotted_name 'import' import_from_targets 204 | 'from' ('.' | '...')+ 'import' import_from_targets 205import_from_targets:206 | '(' import_from_as_names [','] ')' 207 | import_from_as_names !','208 | '*' 209import_from_as_names:210 | ','.import_from_as_name+ 211import_from_as_name:212 | NAME ['as' NAME ] 213214dotted_as_names:215 | ','.dotted_as_name+ 216dotted_as_name:217 | dotted_name ['as' NAME ] 218219dotted_name:220 | dotted_name '.' NAME 221 | NAME222223# СОСТАВНЫЕ ИНСТРУКЦИИ224# ===================225226# Общие элементы227# ---------------228229block:230 | NEWLINE INDENT statements DEDENT 231 | simple_stmts232233decorators: ('@' named_expression NEWLINE )+ 234235# Определения классов236# -----------------237238class_def:239 | decorators class_def_raw 240 | class_def_raw241242class_def_raw:243 | 'class' NAME [type_params] ['(' [arguments] ')' ] ':' block 244245# Определения функций246# --------------------247248function_def:249 | decorators function_def_raw 250 | function_def_raw251252function_def_raw:253 | 'def' NAME [type_params] '(' [params] ')' ['->' expression ] ':' [func_type_comment] block 254 | 'async' 'def' NAME [type_params] '(' [params] ')' ['->' expression ] ':' [func_type_comment] block 255256# Параметры функций257# -------------------258259params:260 | parameters261262parameters:263 | slash_no_default param_no_default* param_with_default* [star_etc] 264 | slash_with_default param_with_default* [star_etc] 265 | param_no_default+ param_with_default* [star_etc] 266 | param_with_default+ [star_etc] 267 | star_etc 268269# Некоторое дублирование здесь, потому что мы не можем написать (',' | &')'), так как пустые альтернативы пока не поддерживаются.270# причина в том, что пустые альтернативы пока не поддерживаются.271272slash_no_default:273 | param_no_default+ '/' ',' 274 | param_no_default+ '/' &')' 275slash_with_default:276 | param_no_default* param_with_default+ '/' ',' 277 | param_no_default* param_with_default+ '/' &')' 278279star_etc:280 | '*' param_no_default param_maybe_default* [kwds] 281 | '*' param_no_default_star_annotation param_maybe_default* [kwds] 282 | '*' ',' param_maybe_default+ [kwds] 283 | kwds 284285kwds:286 | '**' param_no_default 287288# Один параметр. Это *включает* последующую запятую и комментарий типа.289#290# Есть три стиля:291# - Без умолчания292# - Со значением по умолчанию293# - Возможно, со значением по умолчанию294#295# Существует две альтернативные формы каждой, для работы с комментариями типа:296# - Заканчивается запятой, за которой следует необязательный комментарий типа297# - Без запятой, необязательный комментарий типа, обязательно должна следовать закрывающая скобка298# Последняя форма предназначена для конечного параметра без завершающей запятой.299#300301param_no_default:302 | param ',' TYPE_COMMENT? 303 | param TYPE_COMMENT? &')' 304param_no_default_star_annotation:305 | param_star_annotation ',' TYPE_COMMENT? 306 | param_star_annotation TYPE_COMMENT? &')' 307param_with_default:308 | param default ',' TYPE_COMMENT? 309 | param default TYPE_COMMENT? &')' 310param_maybe_default:311 | param default? ',' TYPE_COMMENT? 312 | param default? TYPE_COMMENT? &')' 313param: NAME annotation? 314param_star_annotation: NAME star_annotation 315annotation: ':' expression 316star_annotation: ':' star_expression 317default: '=' expression | invalid_default318319# Инструкция if320# ------------321322if_stmt:323 | 'if' named_expression ':' block elif_stmt 324 | 'if' named_expression ':' block [else_block] 325elif_stmt:326 | 'elif' named_expression ':' block elif_stmt 327 | 'elif' named_expression ':' block [else_block] 328else_block:329 | 'else' ':' block 330331# Инструкция while332# ---------------333334while_stmt:335 | 'while' named_expression ':' block [else_block] 336337# Инструкция for338# -------------339340for_stmt:341 | 'for' star_targets 'in' ~ star_expressions ':' [TYPE_COMMENT] block [else_block] 342 | 'async' 'for' star_targets 'in' ~ star_expressions ':' [TYPE_COMMENT] block [else_block] 343344# Инструкция with345# --------------346347with_stmt:348 | 'with' '(' ','.with_item+ ','? ')' ':' [TYPE_COMMENT] block 349 | 'with' ','.with_item+ ':' [TYPE_COMMENT] block 350 | 'async' 'with' '(' ','.with_item+ ','? ')' ':' block 351 | 'async' 'with' ','.with_item+ ':' [TYPE_COMMENT] block 352353with_item:354 | expression 'as' star_target &(',' | ')' | ':') 355 | expression 356357# Инструкция try358# -------------359360try_stmt:361 | 'try' ':' block finally_block 362 | 'try' ':' block except_block+ [else_block] [finally_block] 363 | 'try' ':' block except_star_block+ [else_block] [finally_block] 364365# Инструкция except366# ----------------367368except_block:369 | 'except' expression ':' block 370 | 'except' expression 'as' NAME ':' block 371 | 'except' expressions ':' block 372 | 'except' ':' block 373except_star_block:374 | 'except' '*' expression ':' block 375 | 'except' '*' expression 'as' NAME ':' block 376 | 'except' '*' expressions ':' block 377finally_block:378 | 'finally' ':' block 379380# Инструкция match381# ---------------382383match_stmt:384 | "match" subject_expr ':' NEWLINE INDENT case_block+ DEDENT 385386subject_expr:387 | star_named_expression ',' star_named_expressions? 388 | named_expression389390case_block:391 | "case" patterns guard? ':' block 392393guard: 'if' named_expression 394395patterns:396 | open_sequence_pattern 397 | pattern398399pattern:400 | as_pattern401 | or_pattern402403as_pattern:404 | or_pattern 'as' pattern_capture_target 405406or_pattern:407 | '|'.closed_pattern+ 408409closed_pattern:410 | literal_pattern411 | capture_pattern412 | wildcard_pattern413 | value_pattern414 | group_pattern415 | sequence_pattern416 | mapping_pattern417 | class_pattern418419# Литеральные шаблоны используются для ограничений равенства и идентичности420literal_pattern:421 | signed_number !('+' | '-') 422 | complex_number 423 | strings 424 | 'None' 425 | 'True' 426 | 'False' 427428# Литеральные выражения используются для ограничения допустимых ключей шаблонов отображения429literal_expr:430 | signed_number !('+' | '-')431 | complex_number432 | strings433 | 'None' 434 | 'True' 435 | 'False' 436437complex_number:438 | signed_real_number '+' imaginary_number 439 | signed_real_number '-' imaginary_number 440441signed_number:442 | NUMBER443 | '-' NUMBER 444445signed_real_number:446 | real_number447 | '-' real_number 448449real_number:450 | NUMBER 451452imaginary_number:453 | NUMBER 454455capture_pattern:456 | pattern_capture_target 457458pattern_capture_target:459 | !"_" NAME !('.' | '(' | '=') 460461wildcard_pattern:462 | "_" 463464value_pattern:465 | attr !('.' | '(' | '=') 466467attr:468 | name_or_attr '.' NAME 469470name_or_attr:471 | attr472 | NAME473474group_pattern:475 | '(' pattern ')' 476477sequence_pattern:478 | '[' maybe_sequence_pattern? ']' 479 | '(' open_sequence_pattern? ')' 480481open_sequence_pattern:482 | maybe_star_pattern ',' maybe_sequence_pattern? 483484maybe_sequence_pattern:485 | ','.maybe_star_pattern+ ','? 486487maybe_star_pattern:488 | star_pattern489 | pattern490491star_pattern:492 | '*' pattern_capture_target 493 | '*' wildcard_pattern 494495mapping_pattern:496 | '{' '}' 497 | '{' double_star_pattern ','? '}' 498 | '{' items_pattern ',' double_star_pattern ','? '}' 499 | '{' items_pattern ','? '}' 500501items_pattern:502 | ','.key_value_pattern+503504key_value_pattern:505 | (literal_expr | attr) ':' pattern 506507double_star_pattern:508 | '**' pattern_capture_target 509510class_pattern:511 | name_or_attr '(' ')' 512 | name_or_attr '(' positional_patterns ','? ')' 513 | name_or_attr '(' keyword_patterns ','? ')' 514 | name_or_attr '(' positional_patterns ',' keyword_patterns ','? ')' 515516positional_patterns:517 | ','.pattern+ 518519keyword_patterns:520 | ','.keyword_pattern+521522keyword_pattern:523 | NAME '=' pattern 524525# Инструкция type526# ---------------527528type_alias:529 | "type" NAME [type_params] '=' expression 530531# Объявление параметра типа532# --------------------------533534type_params:535 | '[' type_param_seq ']' 536537type_param_seq: ','.type_param+ [','] 538539type_param:540 | NAME [type_param_bound] [type_param_default] 541 | '*' NAME [type_param_starred_default] 542 | '**' NAME [type_param_default] 543544type_param_bound: ':' expression 545type_param_default: '=' expression 546type_param_starred_default: '=' star_expression 547548# ВЫРАЖЕНИЯ549# -----------550551expressions:552 | expression (',' expression )+ [','] 553 | expression ',' 554 | expression555556expression:557 | disjunction 'if' disjunction 'else' expression 558 | disjunction559 | lambdef560561yield_expr:562 | 'yield' 'from' expression 563 | 'yield' [star_expressions] 564565star_expressions:566 | star_expression (',' star_expression )+ [','] 567 | star_expression ',' 568 | star_expression569570star_expression:571 | '*' bitwise_or 572 | expression573574star_named_expressions: ','.star_named_expression+ [','] 575576star_named_expression:577 | '*' bitwise_or 578 | named_expression579580assignment_expression:581 | NAME ':=' ~ expression 582583named_expression:584 | assignment_expression585 | expression !':='586587disjunction:588 | conjunction ('or' conjunction )+ 589 | conjunction590591conjunction:592 | inversion ('and' inversion )+ 593 | inversion594595inversion:596 | 'not' inversion 597 | comparison598599# Операторы сравнения600# --------------------601602comparison:603 | bitwise_or compare_op_bitwise_or_pair+ 604 | bitwise_or605606compare_op_bitwise_or_pair:607 | eq_bitwise_or608 | noteq_bitwise_or609 | lte_bitwise_or610 | lt_bitwise_or611 | gte_bitwise_or612 | gt_bitwise_or613 | notin_bitwise_or614 | in_bitwise_or615 | isnot_bitwise_or616 | is_bitwise_or617618eq_bitwise_or: '==' bitwise_or 619noteq_bitwise_or:620 | ('!=' ) bitwise_or 621lte_bitwise_or: '<=' bitwise_or 622lt_bitwise_or: '<' bitwise_or 623gte_bitwise_or: '>=' bitwise_or 624gt_bitwise_or: '>' bitwise_or 625notin_bitwise_or: 'not' 'in' bitwise_or 626in_bitwise_or: 'in' bitwise_or 627isnot_bitwise_or: 'is' 'not' bitwise_or 628is_bitwise_or: 'is' bitwise_or 629630# Побитовые операторы631# -----------------632633bitwise_or:634 | bitwise_or '|' bitwise_xor 635 | bitwise_xor636637bitwise_xor:638 | bitwise_xor '^' bitwise_and 639 | bitwise_and640641bitwise_and:642 | bitwise_and '&' shift_expr 643 | shift_expr644645shift_expr:646 | shift_expr '<<' sum 647 | shift_expr '>>' sum 648 | sum649650# Арифметические операторы.651# --------------------652653sum:654 | sum '+' term 655 | sum '-' term 656 | term657658term:659 | term '*' factor 660 | term '/' factor 661 | term '//' factor 662 | term '%' factor 663 | term '@' factor 664 | factor665666factor:667 | '+' factor 668 | '-' factor 669 | '~' factor 670 | power671672power:673 | await_primary '**' factor 674 | await_primary675676# Первичные элементы677# ----------------678679# Первичные элементы – это такие конструкции, как "obj.something.something", "obj[something]", "obj(something)", "obj" ...680681await_primary:682 | 'await' primary 683 | primary684685primary:686 | primary '.' NAME 687 | primary genexp 688 | primary '(' [arguments] ')' 689 | primary '[' slices ']' 690 | atom691692slices:693 | slice !',' 694 | ','.(slice | starred_expression)+ [','] 695696slice:697 | [expression] ':' [expression] [':' [expression] ] 698 | named_expression 699700atom:701 | NAME702 | 'True' 703 | 'False' 704 | 'None' 705 | strings706 | NUMBER707 | (tuple | group | genexp)708 | (list | listcomp)709 | (dict | set | dictcomp | setcomp)710 | '...' 711712group:713 | '(' (yield_expr | named_expression) ')' 714715# Лямбда-функции716# ----------------717718lambdef:719 | 'lambda' [lambda_params] ':' expression 720721lambda_params:722 | lambda_parameters723724# lambda_parameters и т.д. дублируют параметры, но без аннотаций725# или комментариев типа, и если после параметра нет запятой, ожидается726# двоеточие, а не закрывающая скобка. (Подробнее см. параметры выше.)727#728lambda_parameters:729 | lambda_slash_no_default lambda_param_no_default* lambda_param_with_default* [lambda_star_etc] 730 | lambda_slash_with_default lambda_param_with_default* [lambda_star_etc] 731 | lambda_param_no_default+ lambda_param_with_default* [lambda_star_etc] 732 | lambda_param_with_default+ [lambda_star_etc] 733 | lambda_star_etc 734735lambda_slash_no_default:736 | lambda_param_no_default+ '/' ',' 737 | lambda_param_no_default+ '/' &':' 738739lambda_slash_with_default:740 | lambda_param_no_default* lambda_param_with_default+ '/' ',' 741 | lambda_param_no_default* lambda_param_with_default+ '/' &':' 742743lambda_star_etc:744 | '*' lambda_param_no_default lambda_param_maybe_default* [lambda_kwds] 745 | '*' ',' lambda_param_maybe_default+ [lambda_kwds] 746 | lambda_kwds 747748lambda_kwds:749 | '**' lambda_param_no_default 750751lambda_param_no_default:752 | lambda_param ',' 753 | lambda_param &':' 754lambda_param_with_default:755 | lambda_param default ',' 756 | lambda_param default &':' 757lambda_param_maybe_default:758 | lambda_param default? ',' 759 | lambda_param default? &':' 760lambda_param: NAME 761762# ЛИТЕРАЛЫ763# ========764765fstring_middle:766 | fstring_replacement_field767 | FSTRING_MIDDLE 768fstring_replacement_field:769 | '{' annotated_rhs '='? [fstring_conversion] [fstring_full_format_spec] '}' 770fstring_conversion:771 | "!" NAME 772fstring_full_format_spec:773 | ':' fstring_format_spec* 774fstring_format_spec:775 | FSTRING_MIDDLE 776 | fstring_replacement_field777fstring:778 | FSTRING_START fstring_middle* FSTRING_END 779780tstring_format_spec_replacement_field:781 | '{' annotated_rhs '='? [fstring_conversion] [tstring_full_format_spec] '}' 782tstring_format_spec:783 | TSTRING_MIDDLE 784 | tstring_format_spec_replacement_field785tstring_full_format_spec:786 | ':' tstring_format_spec* 787tstring_replacement_field:788 | '{' annotated_rhs '='? [fstring_conversion] [tstring_full_format_spec] '}' 789tstring_middle:790 | tstring_replacement_field791 | TSTRING_MIDDLE 792tstring:793 | TSTRING_START tstring_middle* TSTRING_END 794795string: STRING 796strings:797 | (fstring|string)+ 798 | tstring+ 799800list:801 | '[' [star_named_expressions] ']' 802803tuple:804 | '(' [star_named_expression ',' [star_named_expressions] ] ')' 805806set: '{' star_named_expressions '}' 807808# Словари809# -----810811dict:812 | '{' [double_starred_kvpairs] '}' 813814double_starred_kvpairs: ','.double_starred_kvpair+ [','] 815816double_starred_kvpair:817 | '**' bitwise_or 818 | kvpair819820kvpair: expression ':' expression 821822# Генераторы списков и генераторы823# ---------------------------824825for_if_clauses:826 | for_if_clause+ 827828for_if_clause:829 | 'async' 'for' star_targets 'in' ~ disjunction ('if' disjunction )* 830 | 'for' star_targets 'in' ~ disjunction ('if' disjunction )* 831832listcomp:833 | '[' named_expression for_if_clauses ']' 834835setcomp:836 | '{' named_expression for_if_clauses '}' 837838genexp:839 | '(' ( assignment_expression | expression !':=') for_if_clauses ')' 840841dictcomp:842 | '{' kvpair for_if_clauses '}' 843844# АРГУМЕНТЫ ВЫЗОВА ФУНКЦИИ845# =======================846847arguments:848 | args [','] &')' 849850args:851 | ','.(starred_expression | ( assignment_expression | expression !':=') !'=')+ [',' kwargs ] 852 | kwargs 853854kwargs:855 | ','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+ 856 | ','.kwarg_or_starred+857 | ','.kwarg_or_double_starred+858859starred_expression:860 | '*' expression 861862kwarg_or_starred:863 | NAME '=' expression 864 | starred_expression 865866kwarg_or_double_starred:867 | NAME '=' expression 868 | '**' expression 869870# ЦЕЛИ ПРИСВАИВАНИЯ871# ==================872873# Обобщённые цели874# ---------------875876# ПРИМЕЧАНИЕ: star_targets может содержать *bitwise_or, цели – нет.877star_targets:878 | star_target !',' 879 | star_target (',' star_target )* [','] 880881star_targets_list_seq: ','.star_target+ [','] 882883star_targets_tuple_seq:884 | star_target (',' star_target )+ [','] 885 | star_target ',' 886887star_target:888 | '*' (!'*' star_target) 889 | target_with_star_atom890891target_with_star_atom:892 | t_primary '.' NAME !t_lookahead 893 | t_primary '[' slices ']' !t_lookahead 894 | star_atom895896star_atom:897 | NAME 898 | '(' target_with_star_atom ')' 899 | '(' [star_targets_tuple_seq] ')' 900 | '[' [star_targets_list_seq] ']' 901902single_target:903 | single_subscript_attribute_target904 | NAME 905 | '(' single_target ')' 906907single_subscript_attribute_target:908 | t_primary '.' NAME !t_lookahead 909 | t_primary '[' slices ']' !t_lookahead 910911t_primary:912 | t_primary '.' NAME &t_lookahead 913 | t_primary '[' slices ']' &t_lookahead 914 | t_primary genexp &t_lookahead 915 | t_primary '(' [arguments] ')' &t_lookahead 916 | atom &t_lookahead 917918t_lookahead: '(' | '[' | '.'919920# Цели для инструкций del921# --------------------------922923del_targets: ','.del_target+ [','] 924925del_target:926 | t_primary '.' NAME !t_lookahead 927 | t_primary '[' slices ']' !t_lookahead 928 | del_t_atom929930del_t_atom:931 | NAME 932 | '(' del_target ')' 933 | '(' [del_targets] ')' 934 | '[' [del_targets] ']' 935936# ЭЛЕМЕНТЫ ТИПИЗАЦИИ937# ---------------938939# type_expressions допускают */**, но игнорируют их940type_expressions:941 | ','.expression+ ',' '*' expression ',' '**' expression 942 | ','.expression+ ',' '*' expression 943 | ','.expression+ ',' '**' expression 944 | '*' expression ',' '**' expression 945 | '*' expression 946 | '**' expression 947 | ','.expression+ 948949func_type_comment:950 | NEWLINE TYPE_COMMENT &(NEWLINE INDENT) # Должен следовать блок с отступом951 | TYPE_COMMENT952953# ========================= КОНЕЦ ГРАММАТИКИ ===========================954955# ========================= НАЧАЛО НЕДОПУСТИМЫХ ПРАВИЛ =======================956```957