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

grammar.md

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

1> **Источник:** https://python-all.ru/2.7/reference/grammar.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 9. Полная спецификация грамматики89Это полная грамматика Python в том виде, в котором она читается генератором парсера и используется для разбора исходных файлов Python:1011```python12# Грамматика Python1314# Примечание: изменение грамматики, указанной в этом файле, скорее всего,15#        потребует соответствующих изменений в модуле парсера16#        (../Modules/parsermodule.c).  Если вы не можете внести изменения в17#        этот модуль самостоятельно, скоординируйте необходимые изменения18#        с кем-то, кто может это сделать; спросите в python-dev о помощи.  Fred19#        Drake <fdrake@acm.org>, вероятно, будет там на связи.2021# ВАЖНО: Также необходимо выполнить все шаги, перечисленные в PEP 306,22# "Как изменить грамматику Python"2324# Начальные символы грамматики:25#       single_input – это одиночный интерактивный оператор;26#       file_input – это модуль или последовательность команд, прочитанная из входного файла;27#       eval_input – это входные данные для функций eval() и input().28# NB: после compound_stmt в single_input следует дополнительный NEWLINE!29single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE30file_input: (NEWLINE | stmt)* ENDMARKER31eval_input: testlist NEWLINE* ENDMARKER3233decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE34decorators: decorator+35decorated: decorators (classdef | funcdef)36funcdef: 'def' NAME parameters ':' suite37parameters: '(' [varargslist] ')'38varargslist: ((fpdef ['=' test] ',')*39              ('*' NAME [',' '**' NAME] | '**' NAME) |40              fpdef ['=' test] (',' fpdef ['=' test])* [','])41fpdef: NAME | '(' fplist ')'42fplist: fpdef (',' fpdef)* [',']4344stmt: simple_stmt | compound_stmt45simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE46small_stmt: (expr_stmt | print_stmt  | del_stmt | pass_stmt | flow_stmt |47             import_stmt | global_stmt | exec_stmt | assert_stmt)48expr_stmt: testlist (augassign (yield_expr|testlist) |49                     ('=' (yield_expr|testlist))*)50augassign: ('+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' |51            '<<=' | '>>=' | '**=' | '//=')52# Для обычных присваиваний дополнительные ограничения, накладываемые интерпретатором53print_stmt: 'print' ( [ test (',' test)* [','] ] |54                      '>>' test [ (',' test)+ [','] ] )55del_stmt: 'del' exprlist56pass_stmt: 'pass'57flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt58break_stmt: 'break'59continue_stmt: 'continue'60return_stmt: 'return' [testlist]61yield_stmt: yield_expr62raise_stmt: 'raise' [test [',' test [',' test]]]63import_stmt: import_name | import_from64import_name: 'import' dotted_as_names65import_from: ('from' ('.'* dotted_name | '.'+)66              'import' ('*' | '(' import_as_names ')' | import_as_names))67import_as_name: NAME ['as' NAME]68dotted_as_name: dotted_name ['as' NAME]69import_as_names: import_as_name (',' import_as_name)* [',']70dotted_as_names: dotted_as_name (',' dotted_as_name)*71dotted_name: NAME ('.' NAME)*72global_stmt: 'global' NAME (',' NAME)*73exec_stmt: 'exec' expr ['in' test [',' test]]74assert_stmt: 'assert' test [',' test]7576compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated77if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]78while_stmt: 'while' test ':' suite ['else' ':' suite]79for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite]80try_stmt: ('try' ':' suite81           ((except_clause ':' suite)+82            ['else' ':' suite]83            ['finally' ':' suite] |84           'finally' ':' suite))85with_stmt: 'with' with_item (',' with_item)*  ':' suite86with_item: test ['as' expr]87# NB: compile.c проверяет, что предложение except по умолчанию является последним.88except_clause: 'except' [test [('as' | ',') test]]89suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT9091# Костыли обратной совместимости для поддержки:92# [ x for x in lambda: True, lambda: False if x() ]93# даже при этом также позволяя:94# lambda x: 5 if x else 295# (Но не их смесь)96testlist_safe: old_test [(',' old_test)+ [',']]97old_test: or_test | old_lambdef98old_lambdef: 'lambda' [varargslist] ':' old_test99100test: or_test ['if' or_test 'else' test] | lambdef101or_test: and_test ('or' and_test)*102and_test: not_test ('and' not_test)*103not_test: 'not' not_test | comparison104comparison: expr (comp_op expr)*105comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'106expr: xor_expr ('|' xor_expr)*107xor_expr: and_expr ('^' and_expr)*108and_expr: shift_expr ('&' shift_expr)*109shift_expr: arith_expr (('<<'|'>>') arith_expr)*110arith_expr: term (('+'|'-') term)*111term: factor (('*'|'/'|'%'|'//') factor)*112factor: ('+'|'-'|'~') factor | power113power: atom trailer* ['**' factor]114atom: ('(' [yield_expr|testlist_comp] ')' |115       '[' [listmaker] ']' |116       '{' [dictorsetmaker] '}' |117       '`' testlist1 '`' |118       NAME | NUMBER | STRING+)119listmaker: test ( list_for | (',' test)* [','] )120testlist_comp: test ( comp_for | (',' test)* [','] )121lambdef: 'lambda' [varargslist] ':' test122trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME123subscriptlist: subscript (',' subscript)* [',']124subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]125sliceop: ':' [test]126exprlist: expr (',' expr)* [',']127testlist: test (',' test)* [',']128dictorsetmaker: ( (test ':' test (comp_for | (',' test ':' test)* [','])) |129                  (test (comp_for | (',' test)* [','])) )130131classdef: 'class' NAME ['(' [testlist] ')'] ':' suite132133arglist: (argument ',')* (argument [',']134                         |'*' test (',' argument)* [',' '**' test] 135                         |'**' test)136# Причина, по которой ключевые слова являются узлами test, а не NAME, заключается в том, что использование NAME137# приводит к неоднозначности. ast.c проверяет, что это NAME.138argument: test [comp_for] | test '=' test139140list_iter: list_for | list_if141list_for: 'for' exprlist 'in' testlist_safe [list_iter]142list_if: 'if' old_test [list_iter]143144comp_iter: comp_for | comp_if145comp_for: 'for' exprlist 'in' or_test [comp_iter]146comp_if: 'if' old_test [comp_iter]147148testlist1: test (',' test)*149150# не используется в грамматике, но может появиться в "node", передаваемом от Parser к Compiler151encoding_decl: NAME152153yield_expr: 'yield' [testlist]154```155