grammar.md
1> **Источник:** https://python-all.ru/3.9/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.9/Grammar/python.gram)). Версия здесь опускает детали, связанные с генерацией кода и восстановлением после ошибок.1011Нотация представляет собой смесь [EBNF](https://python-all.ru/3.9/reference/grammar.html) и [PEG](https://python-all.ru/3.9/reference/grammar.html). В частности, `&`, следующий за символом, токеном или группой в скобках, обозначает положительный просмотр вперёд (т.е. требуется совпадение, но не потребляется), а `!` обозначает отрицательный просмотр вперёд (т.е. требуется \_не\_ совпадение). Мы используем разделитель `|` для обозначения «упорядоченного выбора» PEG (записывается как `/` в традиционных PEG-грамматиках).1213```peg14# PEG-грамматика для Python1516file: [statements] ENDMARKER 17interactive: statement_newline 18eval: expressions NEWLINE* ENDMARKER 19func_type: '(' [type_expressions] ')' '->' expression NEWLINE* ENDMARKER 20fstring: star_expressions2122# type_expressions допускают */**, но игнорируют их23type_expressions:24 | ','.expression+ ',' '*' expression ',' '**' expression 25 | ','.expression+ ',' '*' expression 26 | ','.expression+ ',' '**' expression 27 | '*' expression ',' '**' expression 28 | '*' expression 29 | '**' expression 30 | ','.expression+3132statements: statement+ 33statement: compound_stmt | simple_stmt34statement_newline:35 | compound_stmt NEWLINE 36 | simple_stmt37 | NEWLINE 38 | ENDMARKER 39simple_stmt:40 | small_stmt !';' NEWLINE # Не нужно, присутствует для ускорения41 | ';'.small_stmt+ [';'] NEWLINE 42# ПРИМЕЧАНИЕ: присваивание ДОЛЖНО предшествовать выражению, иначе разбор простого присваивания вызовет синтаксическую ошибку (SyntaxError).43# Вызовет SyntaxError.44small_stmt:45 | assignment46 | star_expressions 47 | return_stmt48 | import_stmt49 | raise_stmt50 | 'pass' 51 | del_stmt52 | yield_stmt53 | assert_stmt54 | 'break' 55 | 'continue' 56 | global_stmt57 | nonlocal_stmt58compound_stmt:59 | function_def60 | if_stmt61 | class_def62 | with_stmt63 | for_stmt64 | try_stmt65 | while_stmt6667# ПРИМЕЧАНИЕ: annotated_rhs может начинаться с 'yield'; yield_expr должен начинаться с 'yield'68assignment:69 | NAME ':' expression ['=' annotated_rhs ] 70 | ('(' single_target ')' 71 | single_subscript_attribute_target) ':' expression ['=' annotated_rhs ] 72 | (star_targets '=' )+ (yield_expr | star_expressions) !'=' [TYPE_COMMENT] 73 | single_target augassign ~ (yield_expr | star_expressions) 7475augassign:76 | '+=' 77 | '-=' 78 | '*=' 79 | '@=' 80 | '/=' 81 | '%=' 82 | '&=' 83 | '|=' 84 | '^=' 85 | '<<=' 86 | '>>=' 87 | '**=' 88 | '//=' 8990global_stmt: 'global' ','.NAME+ 91nonlocal_stmt: 'nonlocal' ','.NAME+ 9293yield_stmt: yield_expr 9495assert_stmt: 'assert' expression [',' expression ] 9697del_stmt:98 | 'del' del_targets &(';' | NEWLINE) 99100import_stmt: import_name | import_from101import_name: 'import' dotted_as_names 102# примечание ниже: ('.' | '...') необходимо, потому что '...' токенизируется как ELLIPSIS103import_from:104 | 'from' ('.' | '...')* dotted_name 'import' import_from_targets 105 | 'from' ('.' | '...')+ 'import' import_from_targets 106import_from_targets:107 | '(' import_from_as_names [','] ')' 108 | import_from_as_names !','109 | '*' 110import_from_as_names:111 | ','.import_from_as_name+ 112import_from_as_name:113 | NAME ['as' NAME ] 114dotted_as_names:115 | ','.dotted_as_name+ 116dotted_as_name:117 | dotted_name ['as' NAME ] 118dotted_name:119 | dotted_name '.' NAME 120 | NAME121122if_stmt:123 | 'if' named_expression ':' block elif_stmt 124 | 'if' named_expression ':' block [else_block] 125elif_stmt:126 | 'elif' named_expression ':' block elif_stmt 127 | 'elif' named_expression ':' block [else_block] 128else_block: 'else' ':' block 129130while_stmt:131 | 'while' named_expression ':' block [else_block] 132133for_stmt:134 | 'for' star_targets 'in' ~ star_expressions ':' [TYPE_COMMENT] block [else_block] 135 | ASYNC 'for' star_targets 'in' ~ star_expressions ':' [TYPE_COMMENT] block [else_block] 136137with_stmt:138 | 'with' '(' ','.with_item+ ','? ')' ':' block 139 | 'with' ','.with_item+ ':' [TYPE_COMMENT] block 140 | ASYNC 'with' '(' ','.with_item+ ','? ')' ':' block 141 | ASYNC 'with' ','.with_item+ ':' [TYPE_COMMENT] block 142with_item:143 | expression 'as' star_target &(',' | ')' | ':') 144 | expression 145146try_stmt:147 | 'try' ':' block finally_block 148 | 'try' ':' block except_block+ [else_block] [finally_block] 149except_block:150 | 'except' expression ['as' NAME ] ':' block 151 | 'except' ':' block 152finally_block: 'finally' ':' block 153154return_stmt:155 | 'return' [star_expressions] 156157raise_stmt:158 | 'raise' expression ['from' expression ] 159 | 'raise' 160161function_def:162 | decorators function_def_raw 163 | function_def_raw164165function_def_raw:166 | 'def' NAME '(' [params] ')' ['->' expression ] ':' [func_type_comment] block 167 | ASYNC 'def' NAME '(' [params] ')' ['->' expression ] ':' [func_type_comment] block 168func_type_comment:169 | NEWLINE TYPE_COMMENT &(NEWLINE INDENT) # Должен следовать блок с отступом170 | TYPE_COMMENT171172params:173 | parameters174175parameters:176 | slash_no_default param_no_default* param_with_default* [star_etc] 177 | slash_with_default param_with_default* [star_etc] 178 | param_no_default+ param_with_default* [star_etc] 179 | param_with_default+ [star_etc] 180 | star_etc 181182# Некоторое дублирование здесь, потому что мы не можем написать (',' | &')'), так как пустые альтернативы пока не поддерживаются.183# причина в том, что пустые альтернативы пока не поддерживаются.184#185slash_no_default:186 | param_no_default+ '/' ',' 187 | param_no_default+ '/' &')' 188slash_with_default:189 | param_no_default* param_with_default+ '/' ',' 190 | param_no_default* param_with_default+ '/' &')' 191192star_etc:193 | '*' param_no_default param_maybe_default* [kwds] 194 | '*' ',' param_maybe_default+ [kwds] 195 | kwds 196197kwds: '**' param_no_default 198199# Один параметр. Это *включает* последующую запятую и комментарий типа.200#201# Есть три стиля:202# - Без умолчания203# - Со значением по умолчанию204# - Возможно, со значением по умолчанию205#206# Существует две альтернативные формы каждой, для работы с комментариями типа:207# - Заканчивается запятой, за которой следует необязательный комментарий типа208# - Без запятой, необязательный комментарий типа, обязательно должна следовать закрывающая скобка209# Последняя форма предназначена для конечного параметра без завершающей запятой.210#211param_no_default:212 | param ',' TYPE_COMMENT? 213 | param TYPE_COMMENT? &')' 214param_with_default:215 | param default ',' TYPE_COMMENT? 216 | param default TYPE_COMMENT? &')' 217param_maybe_default:218 | param default? ',' TYPE_COMMENT? 219 | param default? TYPE_COMMENT? &')' 220param: NAME annotation? 221222annotation: ':' expression 223default: '=' expression 224225decorators: ('@' named_expression NEWLINE )+ 226227class_def:228 | decorators class_def_raw 229 | class_def_raw230class_def_raw:231 | 'class' NAME ['(' [arguments] ')' ] ':' block 232233block:234 | NEWLINE INDENT statements DEDENT 235 | simple_stmt236237star_expressions:238 | star_expression (',' star_expression )+ [','] 239 | star_expression ',' 240 | star_expression241star_expression:242 | '*' bitwise_or 243 | expression244245star_named_expressions: ','.star_named_expression+ [','] 246star_named_expression:247 | '*' bitwise_or 248 | named_expression249named_expression:250 | NAME ':=' ~ expression 251 | expression !':='252253annotated_rhs: yield_expr | star_expressions254255expressions:256 | expression (',' expression )+ [','] 257 | expression ',' 258 | expression259expression:260 | disjunction 'if' disjunction 'else' expression 261 | disjunction262 | lambdef263264lambdef:265 | 'lambda' [lambda_params] ':' expression 266267lambda_params:268 | lambda_parameters269270# lambda_parameters и т.д. дублируют параметры, но без аннотаций271# или комментариев типа, и если после параметра нет запятой, ожидается272# двоеточие, а не закрывающая скобка. (Подробнее см. параметры выше.)273#274lambda_parameters:275 | lambda_slash_no_default lambda_param_no_default* lambda_param_with_default* [lambda_star_etc] 276 | lambda_slash_with_default lambda_param_with_default* [lambda_star_etc] 277 | lambda_param_no_default+ lambda_param_with_default* [lambda_star_etc] 278 | lambda_param_with_default+ [lambda_star_etc] 279 | lambda_star_etc 280281lambda_slash_no_default:282 | lambda_param_no_default+ '/' ',' 283 | lambda_param_no_default+ '/' &':' 284lambda_slash_with_default:285 | lambda_param_no_default* lambda_param_with_default+ '/' ',' 286 | lambda_param_no_default* lambda_param_with_default+ '/' &':' 287288lambda_star_etc:289 | '*' lambda_param_no_default lambda_param_maybe_default* [lambda_kwds] 290 | '*' ',' lambda_param_maybe_default+ [lambda_kwds] 291 | lambda_kwds 292293lambda_kwds: '**' lambda_param_no_default 294295lambda_param_no_default:296 | lambda_param ',' 297 | lambda_param &':' 298lambda_param_with_default:299 | lambda_param default ',' 300 | lambda_param default &':' 301lambda_param_maybe_default:302 | lambda_param default? ',' 303 | lambda_param default? &':' 304lambda_param: NAME 305306disjunction:307 | conjunction ('or' conjunction )+ 308 | conjunction309conjunction:310 | inversion ('and' inversion )+ 311 | inversion312inversion:313 | 'not' inversion 314 | comparison315comparison:316 | bitwise_or compare_op_bitwise_or_pair+ 317 | bitwise_or318compare_op_bitwise_or_pair:319 | eq_bitwise_or320 | noteq_bitwise_or321 | lte_bitwise_or322 | lt_bitwise_or323 | gte_bitwise_or324 | gt_bitwise_or325 | notin_bitwise_or326 | in_bitwise_or327 | isnot_bitwise_or328 | is_bitwise_or329eq_bitwise_or: '==' bitwise_or 330noteq_bitwise_or:331 | ('!=' ) bitwise_or 332lte_bitwise_or: '<=' bitwise_or 333lt_bitwise_or: '<' bitwise_or 334gte_bitwise_or: '>=' bitwise_or 335gt_bitwise_or: '>' bitwise_or 336notin_bitwise_or: 'not' 'in' bitwise_or 337in_bitwise_or: 'in' bitwise_or 338isnot_bitwise_or: 'is' 'not' bitwise_or 339is_bitwise_or: 'is' bitwise_or 340341bitwise_or:342 | bitwise_or '|' bitwise_xor 343 | bitwise_xor344bitwise_xor:345 | bitwise_xor '^' bitwise_and 346 | bitwise_and347bitwise_and:348 | bitwise_and '&' shift_expr 349 | shift_expr350shift_expr:351 | shift_expr '<<' sum 352 | shift_expr '>>' sum 353 | sum354355sum:356 | sum '+' term 357 | sum '-' term 358 | term359term:360 | term '*' factor 361 | term '/' factor 362 | term '//' factor 363 | term '%' factor 364 | term '@' factor 365 | factor366factor:367 | '+' factor 368 | '-' factor 369 | '~' factor 370 | power371power:372 | await_primary '**' factor 373 | await_primary374await_primary:375 | AWAIT primary 376 | primary377primary:378 | primary '.' NAME 379 | primary genexp 380 | primary '(' [arguments] ')' 381 | primary '[' slices ']' 382 | atom383384slices:385 | slice !',' 386 | ','.slice+ [','] 387slice:388 | [expression] ':' [expression] [':' [expression] ] 389 | expression 390atom:391 | NAME392 | 'True' 393 | 'False' 394 | 'None' 395 | '__peg_parser__' 396 | strings397 | NUMBER398 | (tuple | group | genexp)399 | (list | listcomp)400 | (dict | set | dictcomp | setcomp)401 | '...' 402403strings: STRING+ 404list:405 | '[' [star_named_expressions] ']' 406listcomp:407 | '[' named_expression ~ for_if_clauses ']' 408tuple:409 | '(' [star_named_expression ',' [star_named_expressions] ] ')' 410group:411 | '(' (yield_expr | named_expression) ')' 412genexp:413 | '(' named_expression ~ for_if_clauses ')' 414set: '{' star_named_expressions '}' 415setcomp:416 | '{' named_expression ~ for_if_clauses '}' 417dict:418 | '{' [double_starred_kvpairs] '}' 419dictcomp:420 | '{' kvpair for_if_clauses '}' 421double_starred_kvpairs: ','.double_starred_kvpair+ [','] 422double_starred_kvpair:423 | '**' bitwise_or 424 | kvpair425kvpair: expression ':' expression 426for_if_clauses:427 | for_if_clause+428for_if_clause:429 | ASYNC 'for' star_targets 'in' ~ disjunction ('if' disjunction )* 430 | 'for' star_targets 'in' ~ disjunction ('if' disjunction )* 431432yield_expr:433 | 'yield' 'from' expression 434 | 'yield' [star_expressions] 435436arguments:437 | args [','] &')' 438args:439 | ','.(starred_expression | named_expression !'=')+ [',' kwargs ] 440 | kwargs 441kwargs:442 | ','.kwarg_or_starred+ ',' ','.kwarg_or_double_starred+ 443 | ','.kwarg_or_starred+444 | ','.kwarg_or_double_starred+445starred_expression:446 | '*' expression 447kwarg_or_starred:448 | NAME '=' expression 449 | starred_expression 450kwarg_or_double_starred:451 | NAME '=' expression 452 | '**' expression 453454# ПРИМЕЧАНИЕ: star_targets может содержать *bitwise_or, цели – нет.455star_targets:456 | star_target !',' 457 | star_target (',' star_target )* [','] 458star_targets_list_seq: ','.star_target+ [','] 459star_targets_tuple_seq:460 | star_target (',' star_target )+ [','] 461 | star_target ',' 462star_target:463 | '*' (!'*' star_target) 464 | target_with_star_atom465target_with_star_atom:466 | t_primary '.' NAME !t_lookahead 467 | t_primary '[' slices ']' !t_lookahead 468 | star_atom469star_atom:470 | NAME 471 | '(' target_with_star_atom ')' 472 | '(' [star_targets_tuple_seq] ')' 473 | '[' [star_targets_list_seq] ']' 474475single_target:476 | single_subscript_attribute_target477 | NAME 478 | '(' single_target ')' 479single_subscript_attribute_target:480 | t_primary '.' NAME !t_lookahead 481 | t_primary '[' slices ']' !t_lookahead 482483del_targets: ','.del_target+ [','] 484del_target:485 | t_primary '.' NAME !t_lookahead 486 | t_primary '[' slices ']' !t_lookahead 487 | del_t_atom488del_t_atom:489 | NAME 490 | '(' del_target ')' 491 | '(' [del_targets] ')' 492 | '[' [del_targets] ']' 493494t_primary:495 | t_primary '.' NAME &t_lookahead 496 | t_primary '[' slices ']' &t_lookahead 497 | t_primary genexp &t_lookahead 498 | t_primary '(' [arguments] ')' &t_lookahead 499 | atom &t_lookahead 500t_lookahead: '(' | '[' | '.'501```502