рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рд╡рд╕рдВрдд рдЖ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐
рдкрд╛рдпрдерди рдбреЗрд╡рд▓рдкрд░ рдХреЛрд░реНрд╕ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдорд╣реАрдиреЗ рд╕реЗ рднреА рдХрдо рд╕рдордп рд░рд╣рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдЖрдЬ рдХрд╛ рдкреНрд░рдХрд╛рд╢рди рд╕рдорд░реНрдкрд┐рдд рд╣реЛрдЧрд╛ред

рдЙрджреНрджреЗрд╢реНрдпреЛрдВ:- рдкрд╛рдпрдерди рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗрдВ;
- рдПрдХ рд╕рд╛рд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреЗрдбрд╝ (рдПрдПрд╕рдЯреА) рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдордЭрдирд╛;
- рд╕рдордп рдФрд░ рдореЗрдореЛрд░реА рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдХреЛрдб рд▓рд┐рдЦреЗрдВред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ:- рджреБрднрд╛рд╖рд┐рдпрд╛ (рдПрдПрд╕рдЯреА, рдЯреЛрдХрди, рдЖрджрд┐) рдХреА рдмреБрдирд┐рдпрд╛рджреА рд╕рдордЭред
- рдЕрдЬрдЧрд░ рдХрд╛ рдЬреНрдЮрд╛рдиред
- рд╕реА рдХрд╛ рдмреБрдирд┐рдпрд╛рджреА рдЬреНрдЮрд╛рдиред
batuhan@arch-pc юВ░ ~/blogs/cpython/exec_model юВ░ python --version Python 3.7.0
CPython рдирд┐рд╖реНрдкрд╛рджрди рдореЙрдбрд▓рдЕрдЬрдЧрд░ рдПрдХ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЧрдИ рднрд╛рд╖рд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрд╛рдпрдерди рд╕рдВрдХрд▓рдХ рдмрд╛рдпреЛрдЯреЗрдХреНрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред рд▓реЗрдЦ рдХреЗ рджреМрд░рд╛рди рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореБрджреНрджреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ:
- рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рдЯреЛрдХреЗрдирд╛рдЗрдЬреЗрд╢рди:
- рдПрдПрд╕рдЯреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди;
- рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЧреНрд░рд╛рдл (рд╕реАрдПрдлрдЬреА);
- рдмрд╛рдИрдЯрдХреЛрдб;
- рд╕реАрдкреАрдереЙрди рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИред
рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рдЯреЛрдХрдиред
рд╡реНрдпрд╛рдХрд░рдгредрд╡реНрдпрд╛рдХрд░рдг рдкрд╛рдпрдерди рднрд╛рд╖рд╛ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрд╕ рддрд░реАрдХреЗ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рднрд╛рд╖рд╛ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдкрд╛рдпрдерди рд╡реНрдпрд╛рдХрд░рдг рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдмреИрдХрд╕-рдиреМрд░ рд░реВрдк рдХреЗ рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕реНрд░реЛрдд рднрд╛рд╖рд╛ рд╕реЗ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рд╡реНрдпрд╛рдХрд░рдг рд╣реИред рдЖрдк рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ "рд╡реНрдпрд╛рдХрд░рдг / рд╡реНрдпрд╛рдХрд░рдг / рд╡реНрдпрд╛рдХрд░рдг" рдореЗрдВ рд╡реНрдпрд╛рдХрд░рдг рдлрд╝рд╛рдЗрд▓ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ,
batuhan@arch-pc юВ░ ~/cpython/Grammar юВ░ юВа master юВ░ grep "simple_stmt" Grammar | head -n3 | tail -n1 simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
рд╕рд░рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдЫреЛрдЯреЗ рднрд╛рд╡ рдФрд░ рдХреЛрд╖реНрдардХ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдХрдорд╛рдВрдб рдПрдХ рдирдИ рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИред рдЫреЛрдЯреЗ-рдЫреЛрдЯреЗ рднрд╛рд╡ рдЖрдпрд╛рдд рдХреА рд╕реВрдЪреА рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ ...
рдХреБрдЫ рдЕрдиреНрдп рднрд╛рд╡ :)
small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt | import_stmt | global_stmt | nonlocal_stmt | assert_stmt) ... del_stmt: 'del' exprlist pass_stmt: 'pass' flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt break_stmt: 'break' continue_stmt: 'continue'
рдЯреЛрдХрдирд╛рдЗрдЬреЗрд╢рди (рд▓реЗрдХреНрд╕рд┐рдВрдЧ)рдЯреЛрдХрдиреЗрд╢рди рдПрдХ рдкрд╛рда рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдорд╣рддреНрд╡рдкреВрд░реНрдг (рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП) рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд╣рд╛рдВ рдЯреЛрдХрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдЯреЛрдХрди рдХрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореВрд▓реНрдп рдХреНрдпрд╛ рд╣реИ)ред
рдЯреЛрдХрдирдПрдХ рдЯреЛрдХрди рдПрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЯреЛрдХрди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рд╣реИрдВред рдкрд╛рдЗрдерди рдореЗрдВ 59 рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЛрдХрди рд╣реИрдВ (рд╢рд╛рдорд┐рд▓ / рдЯреЛрдХрди .h)ред
рдиреАрдЪреЗ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ,
рдпрджрд┐ рдЖрдк рдХреБрдЫ рдкрд╛рдпрдерди рдХреЛрдб рдХреЛ рдЯреЛрдХрди рдореЗрдВ рддреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред
рд╕реАрдПрд▓рдЖрдИ рдХреЗ рд╕рд╛рде рдЯреЛрдХрдирдпрд╣рд╛рдБ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдлрд╝рд╛рдЗрд▓ рд╣реИ
def greetings(name: str): print(f"Hello {name}") greetings("Batuhan")
рдлрд┐рд░ рд╣рдо рдЗрд╕реЗ python -m tokenize рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЛрдХрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдЙрдЯрдкреБрдЯ рд╣реИ:
batuhan@arch-pc юВ░ ~/blogs/cpython/exec_model юВ░ python -m tokenize tests.py 0,0-0,0: ENCODING 'utf-8' ... 2,0-2,4: INDENT ' ' 2,4-2,9: NAME 'print' ... 4,0-4,0: DEDENT '' ... 5,0-5,0: ENDMARKER ''
рдпрд╣рд╛рдВ рд╕рдВрдЦреНрдпрд╛рдПрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1.4-1.13) рдмрддрд╛рддреА рд╣реИрдВ рдХрд┐ рдЯреЛрдХрди рдХрд╣рд╛рдВ рд╢реБрд░реВ рд╣реБрдЖ рдФрд░ рдХрд╣рд╛рдВ рд╕рдорд╛рдкреНрдд рд╣реБрдЖред рдПрдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдЯреЛрдХрди рд╣рдореЗрд╢рд╛ рд╣рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рдкрд╣рд▓рд╛ рдЯреЛрдХрди рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рддреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИред
рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдЯреЛрдХрдирдпрджрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЯреЛрдХрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк
stdlib рд╕реЗ
рдЯреЛрдХрди рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
>>> with open('tests.py', 'rb') as f: ... for token in tokenize.tokenize(f.readline): ... print(token) ... TokenInfo(type=57 (ENCODING), string='utf-8', start=(0, 0), end=(0, 0), line='') ... TokenInfo(type=1 (NAME), string='greetings', start=(1, 4), end=(1, 13), line='def greetings(name: str):\n') ... TokenInfo(type=53 (OP), string=':', start=(1, 24), end=(1, 25), line='def greetings(name: str):\n') ...
рдЯреЛрдХрди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЯреЛрдХрди рдЖрдИрдбреА рдореЗрдВ рдЗрд╕рдХреА рдЖрдИрдбреА рд╣реИ
ред рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓
ред рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЯреЛрдХрди рдХрд╛ рдореВрд▓реНрдп рд╣реИред рдкреНрд░рд╛рд░рдВрдн рдФрд░ рдЕрдВрдд рджрд┐рдЦрд╛рдПрдБ рдЬрд╣рд╛рдВ рдХреНрд░рдорд╢рдГ рдЯреЛрдХрди рд╢реБрд░реВ рдФрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдмреНрд▓реЙрдХ рдХреЛ рдХреЛрд╖реНрдардХ рдпрд╛ рдЖрд░рдВрдн / рдЕрдВрдд рд╡рд┐рд╡рд░рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╛рдпрдерди рдЗрдВрдбреЗрдВрдЯ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрдВрдбреЗрдВрдЯ рдФрд░ рдбреЗрдбреЗрдВрдЯ рдЯреЛрдХрди рдФрд░ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред рдЗрди рдЯреЛрдХрдиреЛрдВ рдХреЛ рд╕рдВрдмрдВрдзрдкрд░рдХ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкреЗрдбрд╝реЛрдВ рдФрд░ / рдпрд╛ рд╕рд╛рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреЗрдбрд╝реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдкрд░рд╕рд░ рдкреАрдврд╝реАрдкрд╛рд░реНрд╕рд░ рдкреАрдврд╝реА - рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдкрд╛рд░реНрд╕рд░ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИред рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдкреАрдЬреАрдПрди рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред Cpython рдореЗрдВ рджреЛ рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рд╣реИрдВред рдПрдХ рдореВрд▓ (
Parser/pgen
) рд╣реИ рдФрд░ рдПрдХ рдЕрдЬрдЧрд░ (
/Lib/lib2to3/pgen2
) рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
"рдореВрд▓ рдЬрдирд░реЗрдЯрд░ рдкрд╣рд▓рд╛ рдХреЛрдб рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдерд╛"
-GuidoрдЙрдкрд░реЛрдХреНрдд рдЙрджреНрдзрд░рдг рд╕реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ
рдкреИрдЬрди рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬ рд╣реИред рдЬрдм рдЖрдк pgen (
Parser / pgen рдореЗрдВ ) рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдФрд░ C-рдлрд╝рд╛рдЗрд▓ (рд╕реНрд╡рдпрдВ рдкрд╛рд░реНрд╕рд░) рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЙрддреНрдкрдиреНрди рд╕реА рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡реНрдпрд░реНрде рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рд╕рд╛рд░реНрдердХ рд╕реНрд╡рд░реВрдк рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрдЯреИрдЯрд┐рдХ рдбреЗрдЯрд╛ рдФрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рд╣рдо рдЗрд╕рдХреЗ рдореБрдЦреНрдп рдШрдЯрдХреЛрдВ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред
рдбреАрдПрдлрдП (рдкрд░рд┐рднрд╛рд╖рд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрди)рдкрд╛рд░реНрд╕рд░ рдкреНрд░рддреНрдпреЗрдХ рдиреЙрдирдЯрд░реНрдорд┐рдирд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреАрдПрдлрдП рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдбреАрдПрдлрдП рдХреЛ рд░рд╛рдЬреНрдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
static dfa dfas[87] = { {256, "single_input", 0, 3, states_0, "\004\050\340\000\002\000\000\000\012\076\011\007\262\004\020\002\000\300\220\050\037\202\000"}, ... {342, "yield_arg", 0, 3, states_86, "\000\040\200\000\002\000\000\000\000\040\010\000\000\000\020\002\000\300\220\050\037\000\000"}, };
рдкреНрд░рддреНрдпреЗрдХ рдбреАрдПрдлрдП рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯ рд╣реЛрддреА рд╣реИ рдЬреЛ рджрд┐рдЦрд╛рддреА рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЧреИрд░-рдЯрд░реНрдорд┐рдирд▓ рдЯреЛрдХрди рдХрд┐рд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд░рд╛рдЬреНрдпрдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рд╕рдВрдХреНрд░рдордг / рдХрд┐рдирд╛рд░реЛрдВ (рдЖрд░реНрдХреНрд╕) рдХреА рдПрдХ рд╕рд░рдгреА рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
static state states_86[3] = { {2, arcs_86_0}, {1, arcs_86_1}, {1, arcs_86_2}, };
рд╕рдВрдХреНрд░рдордг (рдЖрд░реНрдХреНрд╕)рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдХреНрд░рдордг рд╕рд░рдгреА рдореЗрдВ рджреЛ рдирдВрдмрд░ рд╣реЛрддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдирдВрдмрд░ рд╕рдВрдХреНрд░рдордг (рдЖрд░реНрдХ рд▓реЗрдмрд▓) рдХрд╛ рдирд╛рдо рд╣реИ, рдпрд╣ рдкреНрд░рддреАрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рдирдВрдмрд░ рдЧрдВрддрд╡реНрдп рд╣реИред
static arc arcs_86_0[2] = { {77, 1}, {47, 2}, }; static arc arcs_86_1[1] = { {26, 2}, }; static arc arcs_86_2[1] = { {0, 2}, };
рдирд╛рдо (рд▓реЗрдмрд▓)рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ рдЬреЛ рдЪрд░рд┐рддреНрд░ рдХреЗ рдЖрдИрдбреА рдХреЛ рд╕рдВрдХреНрд░рдордг рдХреЗ рдирд╛рдо рдкрд░ рдореИрдк рдХрд░рддреА рд╣реИред
static label labels[177] = { {0, "EMPTY"}, {256, 0}, {4, 0}, ... {1, "async"}, {1, "def"}, ... {1, "yield"}, {342, 0}, };
рдирдВрдмрд░ 1 рд╕рднреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдХреНрд░рдордг рдирд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рд╡реЗ рд╕рднреА рдПрдХ рд╣реА рдЪрд░рд┐рддреНрд░ рдЖрдИрдбреА рд╣реЛрдВред
рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг:рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХреЛрдб рд╣реИ рдЬреЛ "рд╣рд╛рдп" рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ 1 - рд╕рддреНрдп:
if 1: print('Hi')
рдкрд╛рд░реНрд╕рд░ рдЗрд╕ рдХреЛрдб рдХреЛ single_input рдорд╛рдирддрд╛ рд╣реИред
single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE
рддрдм рд╣рдорд╛рд░рд╛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреНрд░реА рдПрдХ рдмрд╛рд░ рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдЯ рдиреЛрдб рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

рдФрд░ рд╣рдорд╛рд░реЗ DFA (single_input) рдХрд╛ рдорд╛рди 0 рд╣реИред
static dfa dfas[87] = { {256, "single_input", 0, 3, states_0, "\004\050\340\000\002\000\000\000\012\076\011\007\262\004\020\002\000\300\220\050\037\202\000"} ... }
рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
static arc arcs_0_0[3] = { {2, 1}, {3, 1}, {4, 2}, }; static arc arcs_0_1[1] = { {0, 1}, }; static arc arcs_0_2[1] = { {2, 1}, }; static state states_0[3] = { {3, arcs_0_0}, {1, arcs_0_1}, {1,
arcs_0_2},
};
рдпрд╣рд╛рдБ
arc_0_0
рдореЗрдВ рддреАрди рддрддреНрд╡ рд╣реИрдВред рдкрд╣рд▓рд╛ рд╣реИ
NEWLINE
, рджреВрд╕рд░рд╛ рд╣реИ
simple_stmt
, рдФрд░ рдЕрдВрддрд┐рдо рд╣реИ
compound_stmt
ред
Simple_stmt рдХреЗ рд╢реБрд░реБрдЖрддреА рд╕реЗрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП
simple_stmt
рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐
simple_stmt
рд╕рд╛рде рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рднрд▓реЗ рд╣реА рдХреЛрдИ рдирдИ рд▓рд╛рдЗрди рди рд╣реЛ, рдлрд┐рд░ рднреА рдХрдВрдкрд╛рдЙрдВрдб_рд╕реНрдЯреЗрдо
if
рд╢реБрд░реВ рд╣реЛ
if
ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЕрдВрддрд┐рдо
arc ({4;2})
рдФрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреНрд░реА рдореЗрдВ рдХрдВрдкрд╛рдЙрдВрдб_рд╕реНрдЯреЗрдо рдиреЛрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдирдВрдмрд░ 2 рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдирдП рдбреАрдПрдлрдП рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдПрдХ рдЕрджреНрдпрддрди рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкреЗрдбрд╝ рдорд┐рд▓рддрд╛ рд╣реИ:

рдирдпрд╛ DFA рдпреМрдЧрд┐рдХ рдХрдердиреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИред
compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated | async_stmt
рдФрд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
static arc arcs_39_0[9] = { {91, 1}, {92, 1}, {93, 1}, {94, 1}, {95, 1}, {19, 1}, {18, 1}, {17, 1}, {96, 1}, }; static arc arcs_39_1[1] = { {0, 1}, }; static state states_39[2] = { {9, arcs_39_0}, {1, arcs_39_1}, };
рдХреЗрд╡рд▓ рдкрд╣рд▓реА рдЫрд▓рд╛рдВрдЧ рд╢реБрд░реВ рд╣реЛ рд╕рдХрддреА рд╣реИ
if
ред рд╣рдореЗрдВ рдПрдХ рдЕрджреНрдпрддрди рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкреЗрдбрд╝ рдорд┐рд▓рддрд╛ рд╣реИред

рдлрд┐рд░ рд╣рдо рдлрд┐рд░ рд╕реЗ DFA рдФрд░ рдЕрдЧрд▓реЗ DFA ifs рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред
if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
рдирддреАрдЬрддрди, рд╣рдо рдкрджрдирд╛рдо 97 рдХреЗ рд╕рд╛рде рдПрдХрдорд╛рддреНрд░ рд╕рдВрдХреНрд░рдордг рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
static arc arcs_41_0[1] = { {97, 1}, }; static arc arcs_41_1[1] = { {26, 2}, }; static arc arcs_41_2[1] = { {27, 3}, }; static arc arcs_41_3[1] = { {28, 4}, }; static arc arcs_41_4[3] = { {98, 1}, {99, 5}, {0, 4}, }; static arc arcs_41_5[1] = { {27, 6}, }; static arc arcs_41_6[1] = { {28, 7}, }; ...
рдЬрдм рд╣рдо рдЕрдЧрд▓реЗ рд░рд╛рдЬреНрдп рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрд╕реА DFA рдореЗрдВ рд╢реЗрд╖ рд░рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЕрдЧрд▓реЗ arcs_41_1 рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдХреНрд░рдордг рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИред рдпрд╣ рдПрдХ рд╕рдВрдЦреНрдпрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1) рд╕реЗ рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

Arc_41_2 рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдХреНрд░рдордг рд╣реИ рдЬреЛ рдХреЛрд▓рди рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ (:)ред

рддреЛ рд╣рдореЗрдВ рдПрдХ рд╕реЗрдЯ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рд┐рдВрдЯ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, arcs_41_4 рдкрд░ рдЬрд╛рдПрдВред рд╕реЗрдЯ рдореЗрдВ рдкрд╣рд▓рд╛ рд╕рдВрдХреНрд░рдордг рдПрдХ рдПрд▓реАрдл рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рджреВрд╕рд░рд╛ рдПрдХ рдФрд░ рд╣реИ, рдФрд░ рддреАрд╕рд░рд╛ рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╣реИред рдФрд░ рд╣рдореЗрдВ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреНрд░реА рдХрд╛ рдЕрдВрддрд┐рдо рджреГрд╢реНрдп рдорд┐рд▓рддрд╛ рд╣реИред
рдкрд╛рд░реНрд╕рд░ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред
рдкрд╛рдпрдерди рдЖрдкрдХреЛ рдкрд╛рд░реНрд╕рд░ рдирд╛рдордХ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкреЗрдбрд╝ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
>>> import parser >>> code = "if 1: print('Hi')"
рдЖрдк parser.suite рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА (рдХрдВрдХреНрд░реАрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА, рд╕реАрдПрд╕рдЯреА) рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
>>> parser.suite(code).tolist() [257, [269, [295, [297, [1, 'if'], [305, [309, [310, [311, [312, [315, [316, [317, [318, [319, [320, [321, [322, [323, [324, [2, '1']]]]]]]]]]]]]]]], [11, ':'], [304, [270, [271, [272, [274, [305, [309, [310, [311, [312, [315, [316, [317, [318, [319, [320, [321, [322, [323, [324, [1, 'print']], [326, [7, '('], [334, [335, [305, [309, [310, [311, [312, [315, [316, [317, [318, [319, [320, [321, [322, [323, [324, [3, "'Hi'"]]]]]]]]]]]]]]]]]], [8, ')']]]]]]]]]]]]]]]]]]], [4, '']]]]]], [4, ''], [0, '']]
рдЖрдЙрдЯрдкреБрдЯ рдорд╛рди рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рд╕реВрдЪреА рд╣реЛрдЧреАред рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪреА рдореЗрдВ 2 рддрддреНрд╡ рд╣реИрдВред рдкрд╣рд▓рд╛ рдЪрд░рд┐рддреНрд░ рдХреА рдЖрдИрдбреА рд╣реИ (0-256 - рдЯрд░реНрдорд┐рдирд▓, 256+ - рдЧреИрд░-рдЯрд░реНрдорд┐рдирд▓) рдФрд░ рджреВрд╕рд░рд╛ рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рдХрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИред
рд╕рд╛рд░ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдЯреНрд░реАрд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рд╕рд╛рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА (рдПрдПрд╕рдЯреА) рдПрдХ рдкреЗрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдПрдХ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рднрд╛рд╖рд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ (рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐, рдЪрд░, рдСрдкрд░реЗрдЯрд░, рдЖрджрд┐) рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
рдПрдХ рдкреЗрдбрд╝ рдХреНрдпрд╛ рд╣реИ?рдПрдХ рдкреЗрдбрд╝ рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрдбрд╝ рд╢реАрд░реНрд╖ рд╣реИред рд░реВрдЯ рд╡рд░реНрдЯреЗрдХреНрд╕ рдЕрдиреНрдп рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рдиреАрдЪреЗ рд╢рд╛рдЦрд╛рдУрдВ (рд╕рдВрдХреНрд░рдордг) рджреНрд╡рд╛рд░рд╛ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдбрд╝ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдкрд░, рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдореВрд▓ рд╢реАрд░реНрд╖ рд╣реИред
рдЕрдореВрд░реНрдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдФрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреНрд░реА рдХреЗ рдмреАрдЪ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдВрддрд░ рд╣реИред

рджрд╛рдИрдВ рдУрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 2 * 7 + 3 рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд╕рд┐рдВрдЧ рдЯреНрд░реА рд╣реИред рдпрд╣ рд╡рд╕реНрддреБрддрдГ рдПрдХ рдкреЗрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдПрдХ-рд╕реЗ-рдПрдХ рдЫрд╡рд┐ рд╣реИред рдЗрд╕ рдкрд░ рд╕рднреА рднрд╛рд╡, рд╢рдмреНрдж рдФрд░ рдореВрд▓реНрдп рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрд░рд╣ рдХреА рдЫрд╡рд┐ рдХреЛрдб рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рдЙрди рд╕рднреА рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдерд╛ред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рдкреЗрдбрд╝ рдХреЛ рдЕрдореВрд░реНрдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА (рдПрдПрд╕рдЯреА) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪрд┐рддреНрд░ рдореЗрдВ рдмрд╛рдИрдВ рдУрд░ рдпрд╣ рдЙрд╕реА рдХреЛрдб рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛ рдЧрдИ рд╣реИред
рдЙрджрд╛рд╣рд░рдг
рдкрд╛рдпрдерди, рдПрдПрд╕рдЯреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдПрдПрд╕рдЯреА рдореЙрдбреНрдпреВрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдПрдПрд╕рдЯреА рдкреЗрдбрд╝реЛрдВ рд╕реЗ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
рдПрд╕реНрдЯреЛрд░ ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдЬреИрд╕рд╛ рд╣реА рдХреЛрдб рджреЗрдЦреЗрдВред
>>> import ast >>> code = "if 1: print('Hi')"
рдПрдПрд╕рдЯреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо ast.parse рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
>>> tree = ast.parse(code) >>> tree <_ast.Module object at 0x7f37651d76d8>
рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╕рд╛рд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЯреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
ast.dump
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
>>> ast.dump(tree) "Module(body=[If(test=Num(n=1), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[Str(s='Hi')], keywords=[]))], orelse=[])])"
рдПрдПрд╕рдЯреА рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреНрд░реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рджреГрд╢реНрдп рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЧреНрд░рд╛рдл (рд╕реАрдПрдлрдЬреА)рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд░реЗрдЦрд╛рдВрдХрди рджрд┐рд╢рд╛рддреНрдордХ рд░реЗрдЦрд╛рдВрдХрди рд╣реИрдВ рдЬреЛ рдЖрдзрд╛рд░ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдореЙрдбрд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реЛрддрд╛ рд╣реИред
рдЖрдорддреМрд░ рдкрд░, рдЖрдЙрдЯрдкреБрдЯ рдХреЛрдб рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ CFG рдкрд┐рдЫрд▓рд╛ рдЪрд░рдг рд╣реЛрддрд╛ рд╣реИред рдХреЛрдб рд╕реАрдзреЗ рдЖрдзрд╛рд░ рдмреНрд▓реЙрдХ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╕рдмрд╕реЗ рдКрдкрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░ CFG рдореЗрдВ рдмреИрдХрд╡рд░реНрдб рдбреЗрдкреНрде рд╕рд░реНрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдмрд╛рдИрдЯрдХреЛрдбрдкрд╛рдпрдерди рдмрд╛рдпрдЯреЗрдХреЛрдб рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рд╕реЗрдЯ рд╣реИ рдЬреЛ рдкрд╛рдпрдерди рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЬрдм рдЖрдк рд╕реНрд░реЛрдд рдХреЛрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдкрд╛рдпрдерди __pycache__ рдирд╛рдордХ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрдХрд▓рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдордп рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
Func.py рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд╛рдпрдерди рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
def say_hello(name: str): print("Hello", name) print(f"How are you {name}?")
>>> from func import say_hello >>> say_hello("Batuhan") Hello Batuhan How are you Batuhan?
say_hello
рдСрдмреНрдЬреЗрдХреНрдЯ
say_hello
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИред
>>> type(say_hello) <class 'function'>
рдЗрд╕рдореЗрдВ
__code__
рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред
>>> say_hello.__code__ <code object say_hello at 0x7f13777d9150, file "/home/batuhan/blogs/cpython/exec_model/func.py", line 1>
рдХреЛрдб рдСрдмреНрдЬреЗрдХреНрдЯрдХреЛрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрджреЗрд╢ рдпрд╛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рдпреЗ рдкрд╛рдпрдерди рдХреЛрдб рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИрдВред рдЖрдк
рд╕рдВрдХрд▓рди рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреЗрдбрд╝реЛрдВ рдХреЛ
рд╕рдВрдХрд▓рд┐рдд рдХрд░рдХреЗ рдХреЛрдб рдСрдмреНрдЬреЗрдХреНрдЯ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
>>> import ast >>> code = """ ... def say_hello(name: str): ... print("Hello", name) ... print(f"How are you {name}?") ... say_hello("Batuhan") ... """ >>> tree = ast.parse(code, mode='exec') >>> code = compile(tree, '<string>', mode='exec') >>> type(code) <class 'code'>
рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдРрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ (co_ рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ)ред рдпрд╣рд╛рдБ рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдХреБрдЫ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВред
co_nameрдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП - рдПрдХ рдирд╛рдоред рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХреНрд░рдорд╢рдГ рдПрдХ рдирд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рд╣реЛрдЧрд╛, рдХрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ред рдПрдПрд╕рдЯреА рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреНрдпрд╛ рдирд╛рдо рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рд╕рд┐рд░реНрдл рдПрдХ
module
рд╣реЛрдиреЗ рджреЗрдВред
>>> code.co_name '<module>' >>> say_hello.__code__.co_name 'say_hello'
co_varnamesрдпрд╣ рдПрдХ рдЯрдкрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рддрд░реНрдХреЛрдВ рд╕рд╣рд┐рдд рд╕рднреА рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
>>> say_hello.__code__.co_varnames ('name',)
co_contsрдПрдХ рдЯрдкрд▓ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд╢рд╛рдмреНрджрд┐рдХ рдФрд░ рд╕реНрдерд┐рд░ рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдпрд╣ рдХрд┐рд╕реА рдХреЗ рдореВрд▓реНрдп рдХреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рд╣рдордиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдХреЛрдИ рднреА рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд╛рдпрдерди рдиреЗ рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдмрд┐рдирд╛ рдХреЛрдИ рд░рд┐рдЯрд░реНрди рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреЛрдИ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрдПрдЧрд╛ред
>>> say_hello.__code__.co_consts (None, 'Hello', 'How are you ', '?')
рдмрд╛рдЗрдЯрдХреЛрдб (co_code)рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХрд╛ рдмрд╛рдпрдЯреЗрдХреЛрдб рд╣реИред
>>> bytecode = say_hello.__code__.co_code >>> bytecode b't\x00d\x01|\x00\x83\x02\x01\x00t\x00d\x02|\x00\x9b\x00d\x03\x9d\x03\x83\x01\x01\x00d\x00S\x00'
рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдмрд╛рдЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЕрд░реНрдерд╛рддреН рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИред
>>> type(bytecode) <class 'bytes'>
рдореБрджреНрд░рд┐рдд рдкрд╣рд▓рд╛ рд╡рд░реНрдг "t" рд╣реИред рдпрджрд┐ рд╣рдо рдЗрд╕рдХрд╛ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдореВрд▓реНрдп рдкреВрдЫрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддреЗ рд╣реИрдВред
>>> ord('t') 116
116 рдмрд╛рдЗрдЯрдХреЛрдб [0] рдХреЗ рд╕рдорд╛рди рд╣реИред
>>> assert bytecode[0] == ord('t')
рд╣рдорд╛рд░реЗ рд▓рд┐рдП, 116 рдХрд╛ рдорд╛рди рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдкрд╛рдпрдерди рдПрдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдбрд┐рд╕ (рд╡рд┐рдЪрд▓рди рд╕реЗ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ opname рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧреА рд╣реИред рдпрд╣ рд╕рднреА рдмрд╛рдпреЛрдЯреЗрдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдирд╛рдо рд╣реИред
>>> dis.opname[ord('t')] 'LOAD_GLOBAL'
рдЖрдЗрдП рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВред
>>> def multiple_it(a: int): ... if a % 2 == 0: ... return 0 ... return a * 2 ... >>> multiple_it(6) 0 >>> multiple_it(7) 14 >>> bytecode = multiple_it.__code__.co_code
рдФрд░ рд╣рдо рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рдкрд╣рд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред
>>> dis.opname[bytecode[0]] 'LOAD_FAST
LOAD_FAST рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рджреЛ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВред
>>> dis.opname[bytecode[0]] + ' ' + dis.opname[bytecode[1]] 'LOAD_FAST <0>'
рд▓реЛрдбрдлреБрдЯ 0 рдирд┐рд░реНрджреЗрд╢ рдПрдХ рдЯреБрдкрд▓ рдореЗрдВ рдЪрд░ рдирд╛рдореЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕реНрдЯреИрдХ рдореЗрдВ рд╢реВрдиреНрдп рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рддрддреНрд╡ рдХреЛ рдПрдХ рдЯреНрдпреВрдкрд▓ рдореЗрдВ рдзрдХреЗрд▓рддрд╛ рд╣реИред
>>> multiple_it.__code__.co_varnames[bytecode[1]] 'a'
рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ dis.dis рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдмрд╛рдпреЛрдЯрдХреЛрдб рдХреЛ рдПрдХ рдкрд░рд┐рдЪрд┐рдд рджреГрд╢реНрдп рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдирдВрдмрд░ (2,3,4) рд▓рд╛рдЗрди рдирдВрдмрд░ рд╣реИрдВред рдкрд╛рдпрдерди рдореЗрдВ рдХреЛрдб рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
>>> dis.dis(multiple_it) 2 0 LOAD_FAST 0 (a) 2 LOAD_CONST 1 (2) 4 BINARY_MODULO 6 LOAD_CONST 2 (0) 8 COMPARE_OP 2 (==) 10 POP_JUMP_IF_FALSE 16 3 12 LOAD_CONST 2 (0) 14 RETURN_VALUE 4 >> 16 LOAD_FAST 0 (a) 18 LOAD_CONST 1 (2) 20 BINARY_MULTIPLY 22 RETURN_VALUE
рд▓реАрдб рд╕рдордпрд╕реАрдкреАрдереЙрди рдПрдХ рд╕реНрдЯреИрдХ-рдУрд░рд┐рдПрдВрдЯреЗрдб рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╣реИ, рди рдХрд┐ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдХреЛрдб рдПрдХ рд╕реНрдЯреИрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рд╣реИред
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рдкрд╛рдпрдерди рдПрдХ рд╕рд╛рде рджреЛ рдвреЗрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕реНрдЯреИрдХ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдмреНрд▓реЙрдХ рд╕реНрдЯреИрдХ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЙрд▓ рдирд┐рд╖реНрдкрд╛рджрди рд╕реНрдЯреИрдХ рдкрд░ рд╣реЛрддреЗ рд╣реИрдВ; рдмреНрд▓реЙрдХ рд╕реНрдЯреИрдХ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирдЬрд╝рд░ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд┐рддрдиреЗ рдмреНрд▓реЙрдХ рд╕рдХреНрд░рд┐рдп рд╣реИрдВ, рд╕рд╛рде рд╣реА рдмреНрд▓реЙрдХ рдФрд░ рд╕реНрдХреЛрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рднреА рд╣реИрдВред
рд╣рдо рд╕рд╛рдордЧреНрд░реА рдкрд░ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░
рдПрдХ рдЦреБрд▓реЗ рд╡реЗрдмрд┐рдирд╛рд░ рдореЗрдВ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: "рдЗрд╕реЗ рдЬрд╛рд░реА рдХрд░реЗрдВ: рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╣рд▓реВ", рдЬреЛ рд╣рдорд╛рд░реЗ рд╢рд┐рдХреНрд╖рдХ - рдореЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред