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

grammar.md

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

1> **Источник:** https://python-all.ru/3/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/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#   specifies the return type of the C or Python function corresponding to the44#   rule:45# rule_name[return_type]: expression46#   Если тип возврата опущен, то в Си возвращается void *, а в Python – Any.47#   Python.48# e1 e249#   Сопоставить e1, затем сопоставить e2.50# e1 | e251#   Сопоставить e1 или e2.52#   Первая альтернатива также может располагаться на строке после имени правила для форматирования. В этом случае перед первой альтернативой нужно использовать |, например:53#   formatting purposes. In that case, a | must be used before the first54#   alternative, like so: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#   does not include the separator. This is otherwise identical to (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