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

grammar.md

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

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