рдЦреВрдВрдЯреА рдкрд╛рд░реНрд╕рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдХреЗрд╡рд▓ рдЦреВрдВрдЯреА рдХреА рдЖрдВрд╢рд┐рдХ рд╕рдордЭ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдХрд░, рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп PEG рдкрд╛рд░реНрд╕рд░реЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, TatSu Python рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ Python рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ) - рд▓реЗрдХрд┐рди рдпрд╣ PEG рдХреЛ рд╕рдордЭрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдореИрдВ рдЗрд╕реЗ CPython рдореЗрдВ рдкрд╛рд░реНрд╕рд░ рдХреЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред



рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдЦрд┐рд▓реМрдирд╛ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдПрдХ рд╕рд░рд▓ рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдкрд╛рд░реНрд╕рд░ рдХреЗ рдХрд╛рдо рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдВрд╡ рд░рдЦреАред


(рд╡реИрд╕реЗ, рдПрдХ рдкреНрд░рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдЕрдкрдиреЗ рдкрд╛рда рдореЗрдВ рд▓рд┐рдВрдХ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк рдХреБрдЫ рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВред :-)


рдЖрдорддреМрд░ рдкрд░, рдПрдХ рдкреАрдИрдЬреА рдПрдХ рдЕрд╕реАрдорд┐рдд рдмрдлрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдПрдХ рдЦрд┐рд▓реМрдирд╛ рд╡реНрдпрд╛рдХрд░рдг рд╣реИ:


statement: assignment | expr | if_statement expr: expr '+' term | expr '-' term | term term: term '*' atom | term '/' atom | atom atom: NAME | NUMBER | '(' expr ')' assignment: target '=' expr target: NAME if_statement: 'if' expr ':' statement 

рдЗрд╕ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рдХрд╛ рд╕реБрдкрд░-рдЕрдореВрд░реНрдд рдкрд╛рд░реНрд╕рд░ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдо рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕рдордЭрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, statement , рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдЧрд╛:


 def statement(): if assignment(): return True if expr(): return True if if_statement(): return True return False 

рдмреЗрд╢рдХ, рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ: рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ рдХреНрдпрд╛ рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред


рдЪрд▓рд┐рдП рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдХреНрд▓рд╛рд╕рд┐рдХ рдкрд╛рд░реНрд╕рд░ рдПрдХ рдЕрд▓рдЧ рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрдирдкреБрдЯ (рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рд▓рд╛рдЗрди) рдХреЛ рдЯреЛрдХрди рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдХреАрд╡рд░реНрдб, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдирд╛рдо), рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдСрдкрд░реЗрдЯрд░ред рдкреАрдИрдЬреА рдкрд╛рд░реНрд╕рд░ (рдПрдПрдирдЯреАрдПрд▓рдЖрд░ рдЬреИрд╕реЗ рдЕрдиреНрдп рдЖрдзреБрдирд┐рдХ рдкрд╛рд░реНрд╕рд░ рдХреА рддрд░рд╣) рдЕрдХреНрд╕рд░ рдЯреЛрдХрди рдФрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рдорд┐рд▓рд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдЕрд▓рдЧ рдЯреЛрдХрди рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред


рдкрд╛рдпрдерди рдЯреЛрдХрди рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдкреАрдИрдЬреА рдирд┐рдпрдореЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЗрд╕рдореЗрдВ рдЯреЛрдХрди рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕реНрдЯреИрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ); рдкрд╛рдпрдерди рдореЗрдВ рдирдИ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ (рд╡реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рд╕рд┐рд╡рд╛рдп рдЙрди рдХреЛрд╖реНрдардХ рдореЗрдВ рд╕рдВрд▓рдЧреНрди)ред рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд╛рд░ рдХреБрдЫ рдЬрдЯрд┐рд▓рддрд╛ рдХрд╛ рдХрд╛рд░рдг рднреА рдмрдирддреЗ рд╣реИрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореБрдЭреЗ рдореМрдЬреВрджрд╛ рдкрд╛рдпрдерди рдЯреЛрдХрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╡реИрд╕реЗ, рд╕реАрдкреАрдереЙрди рдХреЗ рджреЛ рдЯреЛрдХрди рд╣реИрдВ: рдЖрдВрддрд░рд┐рдХ рдПрдХ, рдЬреЛ рдкрд╛рд░реНрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдХ, рдЬреЛ рд╢реБрджреНрдз рдкрд╛рдпрдерди рдореЗрдВ рд▓рд╛рдЧреВ рдПрдХ рд╕рдЯреАрдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╣реИред рдпрд╣ рдореЗрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд╛рдо рдЖрдПрдЧрд╛ред


рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдЯреЛрдХрди рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдПрдХрд▓ get_token() рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдпреБрдХреНрдд рдПрдХ рд╕рд░рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрддрд╛ рд╣реИред рд╣рд░ рдмрд╛рд░, рдпрд╣ рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЕрдЧрд▓рд╛ рдЯреЛрдХрди рджреЗрддрд╛ рд╣реИ, рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рдореВрд╣ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИред CPython рдХрд╛ tokenize рдореЙрдбреНрдпреВрд▓ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИ: рдЗрд╕рдХрд╛ рдореБрдЦреНрдп API рдПрдХ рдЬрдирд░реЗрдЯрд░ рд╣реИ рдЬреЛ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдЯреЛрдХрди рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдкреНрд░рдХрд╛рд░ TypeInfo рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдлрд╝реАрд▓реНрдбреНрд╕ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЯреЛрдХрди рдХрд╛ рдкреНрд░рдХрд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, NAME , NUMBER , STRING ) рдФрд░ рдЗрд╕рдХрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рдЙрди рд╡рд░реНрдгреЛрдВ рдХрд╛ рд╕рдореВрд╣ рд╣реИ, рдЬрд┐рдирдореЗрдВ рдпрд╣ рд╢рд╛рдорд┐рд▓ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, abc , 42 рдпрд╛ "Hello, world" )ред рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╖реЗрддреНрд░ рднреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЯреЛрдХрди рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП, рдЬреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИред


рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЯреЛрдХрди ENDMARKER , рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЕрдВрдд рдкрд╣реБрдБрдЪ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдЧрд▓рд╛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЬрдирд░реЗрдЯрд░ рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ред


рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд┐рдЪрд▓рд┐рдд рдерд╛ред рд╣рдореЗрдВ рдЕрд╕реАрдорд┐рдд рд░рд┐рдЯрд░реНрди рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ? рдЯреЛрдХрди рд╕реВрдЪреА рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдпрд╛рдж рд░рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрд╕ рдмрд┐рдВрджреБ рд╕реЗ рдкреБрдирд░реНрдорд┐рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЯреЛрдХрди рдЯреЛрдХрди рдПрдкреАрдЖрдИ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЯреЛрдХрди рдХреА рдзрд╛рд░рд╛ рдХреЛ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд╕реЗ рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдо рдХрд░реЗрдВрдЧреЗред рдЖрдк рдЗрд╕реЗ itertools.tee() рд╕рд╛рде рднреА рджреЛрд╣рд░рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╢рд╛рдпрдж рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрдо рдкреНрд░рднрд╛рд╡реА рд╣реИ, рдпрджрд┐ рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реВрдЪреА рдореЗрдВ рд╕рднреА рдЗрдирдкреБрдЯ рдХреЛ рдЯреЛрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдкрд╛рд░реНрд╕рд░ рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдЕрдорд╛рдиреНрдп рдЯреЛрдХрди рдерд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд▓рд╛рдкрддрд╛ рд╕рдорд╛рдкрди рдЙрджреНрдзрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐) рдФрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐ рднреА рдереА, рддреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЯреЛрдХрди рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдмреБрд░рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐ рдПрдХ рдЕрдорд╛рдиреНрдп рд░реЗрдЦрд╛ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрд▓рдЧ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕реЗ рдПрдХ рдЖрд▓рд╕реА рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдХреЛрд░ рдПрдкреАрдЖрдИ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред Tokenizer рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрд╕ рд╕рд░рдгреА рдореЗрдВ рдЯреЛрдХрди рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЛ Tokenizer рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреА рддреАрди рдореБрдЦреНрдп рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ:


  • get_token() рдЕрдЧрд▓рд╛ рдЯреЛрдХрди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдкреЙрдЗрдВрдЯрд░ рдХреЛ get_token() рдпрд╛ рд╕реНрд░реЛрдд рд╕реЗ рдЕрдЧрд▓рд╛ рдЯреЛрдХрди рдкрдврд╝рддрд╛ рд╣реИ, рдЕрдЧрд░ рд╣рдо рдЯреЛрдХрди рдмрдлрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣реИрдВ);
  • mark() рдмрдлрд░ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИ;
  • reset(pos) рдмрдлрд░ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ (рддрд░реНрдХ рдХреЛ mark() рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рд╣рдордиреЗ рдПрдХ рд╣реЗрд▓реНрдкрд░ рдлрдВрдХреНрд╢рди peek_token() рдЬреЛрдбрд╝рд╛, рдЬреЛ рдмрдлрд░ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╢рд┐рдлреНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдЧрд▓рд╛ рдЯреЛрдХрди рд▓реМрдЯрд╛рддрд╛ рд╣реИред


рдпрд╣ Tokenizer рд╡рд░реНрдЧ рдХрд╛ рдЖрдзрд╛рд░ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


 class Tokenizer: def __init__(self, tokengen): """Call with tokenize.generate_tokens(...).""" self.tokengen = tokengen self.tokens = [] self.pos = 0 def mark(self): return self.pos def reset(self, pos): self.pos = pos def get_token(self): token = self.peek_token() self.pos += 1 return token def peek_token(self): if self.pos == len(self.tokens): self.tokens.append(next(self.tokengen)) return self.tokens[self.pos] 

рдпрд╣рд╛рдБ, рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЫреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд░реАрдХреЛрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдЪрд░ рдХреЗ рдирд╛рдо рдПрдХ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП), рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл Tokenizer рдПрдкреАрдЖрдИ рдХрд╛ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реИред


Parser рдХреЛ рднреА рдПрдХ рд╡рд░реНрдЧ рдмрдирдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ statement() , expr() , рдЖрджрд┐ред рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЯреЛрдХрдирдзрд╛рд░рдХ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЪрд░ рдмрди рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдкрд╛рд░реНрд╕рд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╕реАрдзреЗ get_token() рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ - рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо Parser рд╡рд░реНрдЧ рдореЗрдВ wait() рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкрд╛рд░реНрд╕рд░ рд╡рд┐рдзрд┐ рдХреА рддрд░рд╣ рд╣реА рд╕рдлрд▓ рдпрд╛ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред wait() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рддрд░реНрдХ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЯреЛрдХрди рд╣реИ: рдпрд╛ рддреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, + ) рдпрд╛ рдЯреЛрдХрди рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, NAME )ред рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЕрднреА рддрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдкрд╛рд░реНрд╕рд░ рдХреЗ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╛рдкрд╕ рдЖрдКрдВрдЧрд╛ред


рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдпрдо рдХрд╛рд░реНрдпреЛрдВ False рдХреЗрд╡рд▓ True рдпрд╛ False рд▓реМрдЯрд╛рдПрдВред рдпрд╣ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ (рд╡рд╣рд╛рдБ рддреЛрддрд╛ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ "рдХреНрдпрд╛ рдпрд╣ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╡реИрдз рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ?"), рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдирд╣реАрдВред рд╣рдорд╛рд░рд╛ рдХрд╛рдо рдПрдПрд╕рдЯреА рдмрдирд╛рдирд╛ рд╣реИред рддреЛ, рдЪрд▓рд┐рдП рдЗрд╕ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╡рд┐рдзрд┐ рд╕рдлрд▓рддрд╛ рдкрд░ рдПрдХ Node рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рдП рдпрд╛ рд╡рд┐рдлрд▓рддрд╛ рдкрд░ None ред


Node рд╡рд░реНрдЧ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


 class Node: def __init__(self, type, children): self.type = type self.children = children 

рдпрд╣рд╛рдВ, type рдПрдПрд╕рдЯреА рдиреЛрдб рдХрд╛ type рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, add рдпрд╛ if ), рдФрд░ рд╡рдВрд╢ рдиреЛрдбреНрд╕ рдФрд░ рдЯреЛрдХрди ( TokenInfo рдЗрдВрд╕реНрдЯреЗрдВрд╕) рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред рдпрд╣ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдпрд╛ рдЕрдиреНрдп рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд▓рд╛рдЗрдирд┐рдВрдЧ рдпрд╛ рд╕реНрдЯреЗрдЯрд┐рдХ рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧред рд╣рд╛рд▓рд╛рдВрдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдореИрдВ рдПрдПрд╕рдЯреА рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред


рдЗрд╕ рдпреЛрдЬрдирд╛ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, expect() рд╡рд┐рдзрд┐ рдХреЛ рд╕рдлрд▓рддрд╛ рдкрд░ рдПрдХ TokenInfo рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╡рд┐рдлрд▓рддрд╛ рдкрд░ None ред рдкрд┐рдЫрд▓реЗ рдЯреЛрдХрди рдореЗрдВ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ mark() рдФрд░ reset() рдЯреЛрдХрди рдХреЗ рддрд░реАрдХреЛрдВ (рдпрд╣рд╛рдВ рдПрдкреАрдЖрдИ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ) рдХреЛ рдХреЙрд▓ рд▓рдкреЗрдЯрддрд╛ рд╣реВрдВред рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реБрдЖ:


 class Parser: def __init__(self, tokenizer): self.tokenizer = tokenizer def mark(self): return self.tokenizer.mark() def reset(self, pos): self.tokenizer.reset(pos) def expect(self, arg): token = self.tokenizer.peek_token() if token.type == arg or token.string == arg: return self.tokenizer.get_token() return None 

рдПрдХ рдмрд╛рд░ рдлрд┐рд░: рдореИрдВрдиреЗ рдХреБрдЫ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред


рдЕрдм рдореБрдЭреЗ рдкрд╛рд░реНрд╕рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рднреА рдХреЛ рдпрд╛ рддреЛ Node рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдпрдо рдХреЗ рдЕрдВрддрд┐рдо рдЯреЛрдХрди рдХреЗ рдмрд╛рдж рдПрдХ рдЯреЛрдХрди рд░рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдЬрд┐рд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рдорд╛рдиреНрдпрддрд╛ рджреА рдереА; рдпрд╛ рддреЛ None рдФрд░ рдЯреЛрдХрдирдзрд╛рд░рдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рди рдЫреЛрдбрд╝реЗред рдпрджрд┐ рдкрд╛рд░реНрд╕рд░ рд╡рд┐рдзрд┐ рдХрдИ рдЯреЛрдХрди рдкрдврд╝рддреА рд╣реИ рдФрд░ рдлрд┐рд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдЙрд╕реЗ рдЯреЛрдХрдирдзрд╛рд░рдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, mark() рдФрд░ reset() рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ expect() рднреА рдЗрд╕ рдирд┐рдпрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреА рд╣реИред


рддреЛ, рдпрд╣рд╛рдБ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдПрдХ рд╕реНрдХреЗрдЪ рд╣реИред рдпрд╣рд╛рдБ рдореИрдВ рдкрд╛рдпрдереЙрди 3.8 ( := ) рд╕реЗ рд╡рд╛рд▓рд░рд╕ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдБ:


 class ToyParser(Parser): def statement(self): if a := self.assignment(): return a if e := self.expr(): return e if i := self.if_statement(): return i return None def expr(self): if t := self.term(): pos = self.mark() if op := self.expect("+"): if e := self.expr(): return Node("add", [t, e]) self.reset(pos) if op := self.expect("-"): if e := self.expr(): return Node("sub", [t, e]) self.reset(pos) return t return None def term(self): # Very similar... def atom(self): if token := self.expect(NAME): return token if token := self.expect(NUMBER): return token pos = self.mark() if self.expect("("): if e := self.expr(): if self.expect(")"): return e self.reset(pos) return None 

рдореИрдВрдиреЗ рдХреБрдЫ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рддрд╛рдХрд┐ рдкрд╛рдардХ рдХреЛ рд╕реНрд╡рдпрдВ рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓реЗред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрдврд╝рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЕрдВрдд рдореЗрдВ, рд╣рдо рд╡реНрдпрд╛рдХрд░рдг рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗред NAME рдФрд░ NUMBER рдЬреИрд╕реЗ рдХреЙрдиреНрд╕реНрдЯреИрдВрдЯ рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ token рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдЖрдпрд╛рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ рдкрд╛рдпрдерди рдЯреЛрдХрди рдХреЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЦреВрдВрдЯреА рдкрд╛рд░реНрд╕рд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдЦреЛрдЬрдиреЗ рд╣реЛрдВрдЧреЗред


рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ рдереЛрдбрд╝рд╛ рдзреЛрдЦрд╛ рдЦрд╛ рдЧрдпрд╛ред expr рд╡рд┐рдзрд┐ рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд╕рд╣реА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдмрдирд╛ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рдкрд╛рд░реНрд╕рд░ рдмрд╛рдПрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдХреБрдЫ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдЕрдиреБрд╕рдВрдзрд╛рди рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд▓рдЧ рд╕реЗ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдмрд╕ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣рдорд╛рд░реЗ рд╕рд░рд▓реАрдХреГрдд рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдЕрдиреБрд░реВрдк 100% рдирд╣реАрдВ рд╣реИред


рдореБрдЦреНрдп рдмрд╛рддреЗрдВ рдЬреЛ рдореИрдВ рдЖрдкрдХреЛ рдЕрдм рддрдХ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:


  • рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдирд┐рдпрдо рдкрд╛рд░реНрд╕рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ, рдФрд░ рдЬрдм рдПрдХ рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдпрдо рджреВрд╕рд░реЗ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рджреВрд╕рд░реЗ рдирд┐рдпрдо рдХреА рдПрдХ рд╡рд┐рдзрд┐ рдХрд╣реЗрдЧрд╛ред
  • рдЬрдм рдЯреЛрдХрди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдкрд╛рд░реНрд╕рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдЬрдм рдПрдХ рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдпрдо рдПрдХ рдЯреЛрдХрди рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд┐рдзрд┐ expect() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреА expect() ред
  • рдпрджрд┐ рдкрд╛рд░реНрд╕рд░ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдкрдиреЗ рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдпрдо рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рд╕рдВрдмрдВрдзрд┐рдд рдПрдПрд╕рдЯреА рдиреЛрдб рд▓реМрдЯрд╛рддрд╛ рд╣реИ; рдпрджрд┐ рд╡рд╣ рдЕрдкрдиреЗ рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдпрдо рдХреЛ рдирд╣реАрдВ рдкрд╣рдЪрд╛рди рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ None рд▓реМрдЯрд╛рддрд╛ рд╣реИ
  • рдкрд╛рд░реНрд╕рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЯреЛрдХрди рд╕реНрдерд┐рддрд┐ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рд╡реЗ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ (рд╕реАрдзреЗ рдпрд╛ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ, рдПрдХ рдЕрдиреНрдп рд╕рдлрд▓ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реБрдП)ред рдпрд╣ рди рдХреЗрд╡рд▓ рддрдм рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА рдХрд┐ рдЬрдм рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рд╕рднреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рддрд░реАрдХреЗ рдЗрди рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ mark() рдФрд░ reset() рдХреЙрд▓ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкреНрд░реЗрд░рдг рджреНрд╡рд╛рд░рд╛ рд╕рд┐рджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХ рдФрд░ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ mark() рдФрд░ reset() рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдХреЙрд▓ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЖрдХрд░реНрд╖рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛: рдпрджрд┐ рдЖрдк рд╕рдлрд▓ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ reset() рдХреЙрд▓ рди рдХрд░реЗрдВ! рдПрдХ рдФрд░ рддрдп рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдкрддрд╛ рдЪрд▓ рдЬрд╛рдП рдХрд┐ рдХреНрдпрд╛ рдЯреЛрдХрди рдХреЛ рд░реАрд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ TatSu рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░ рд░рд╣рд╛ рд╣реИ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдЗрд╕ рддрд░рд╣:


  def statement(self): with self.alt(): return self.assignment() with self.alt(): return self.expr() with self.alt(): return self.if_statement() raise ParsingFailure 

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, if рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП atom() рдореЗрдВ рдХреЛрд╖реНрдардХ рдореЗрдВ if рдЧрдП рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕реАрдврд╝реА рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


  with self.alt(): self.expect("(") e = self.expr() self.expect(")") return e 

рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рднреА "рдЬрд╛рджреБрдИ" рд▓рдЧрддрд╛ рд╣реИ - рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреА рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ ( wait() рд╕рд╣рд┐рдд) рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рд╕рдХрддреА рд╣реИред рдФрд░ рдпрд╣ рдЕрдкрд╡рд╛рдж рдкрдХрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХ рджреНрд╡рд╛рд░рд╛ рдХрдерди рдХреЗ with рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ True ( __exit__ рд╕реЗ True __exit__ )ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░рд╛ рдЕрдВрддрд┐рдо рд▓рдХреНрд╖реНрдп рд╕реА рдореЗрдВ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реИ, рди рдХрд┐ рдкрд╛рдпрдерди, рдФрд░ рд╕реА рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдпрд╛рди рдХреЗ with рдирд╣реАрдВ рд╣реИред


рд╡реИрд╕реЗ рднреА, рдпрд╣рд╛рдБ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд╛рдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╖рдп рджрд┐рдП рдЧрдП рд╣реИрдВ:


  • рд╡реНрдпрд╛рдХрд░рдг рд╕реЗ рдкрд╛рд░рд╕рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдкреАрдврд╝реА;
  • packrat-parsing (рд╕рдВрд╕реНрдорд░рдг);
  • EBNF рдХреЗ рдлреАрдЪрд░реНрд╕ рдЬреИрд╕реЗ (x | y) , [xy ...] , x* , x+ ;
  • рдЕрдиреБрд░реЗрдЦрдг (рдПрдХ рдкрд╛рд░реНрд╕рд░ рдпрд╛ рд╡реНрдпрд╛рдХрд░рдг рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП);
  • рдкреАрдИрдЬреА рдлреАрдЪрд░реНрд╕ рдЬреИрд╕реЗ рд▓реБрдХрд╣реЗрдб рдФрд░ рдХрдЯ;
  • рдмрд╛рдПрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдирд┐рдпрдореЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ;
  • рд╕реА рдХреЛрдб рдЬрдирд░реЗрд╢рди

рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрд╕реЗрдВрд╕ рдФрд░ рдХреЛрдб рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджрд┐рдпрд╛: CC BY-NC-SA 4.0

Source: https://habr.com/ru/post/hi471862/


All Articles