
рдкрд┐рдЫрд▓реЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рд╕реНрд╡рдпрдВ IMP рднрд╛рд╖рд╛ рдФрд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреА рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдордиреЗ рд▓реАрдХрд░ рдХреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЬрд╛рдВрдЪ рдХреАред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЕрдкрдиреА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦреЗрдВрдЧреЗред рдпрд╣ рдПрдХ рдПрдПрд╕рдЯреА (рд╕рд╛рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА) рдХреЛ рд▓реЗрдХреНрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдЯреЛрдХрди рдХреА рд╕реВрдЪреА рд╕реЗ рдирд┐рдХрд╛рд▓реЗрдЧрд╛ред рдХреЙрдореНрдмреАрдиреЗрдЯрд░рд┐рдпрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрдЧреА, рдЕрд░реНрдерд╛рдд, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд╛рд░реНрд╕рд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреНрдпрд╛ рд╣реИрдВ?
рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрд░реАрдХреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдФрд░ рддреЗрдЬрд╝ рддрд░реАрдХрд╛
рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде
рд╣реИ ред
рдЖрдк рдкрд╛рд░реНрд╕рд░ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЯреЛрдХрди рдХреА рдПрдХ рдзрд╛рд░рд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкрд╛рд░реНрд╕рд░ рдзрд╛рд░рд╛ рд╕реЗ рдХреБрдЫ рдЯреЛрдХрди
"рдЦрд╛рдПрдЧрд╛" ред рдлрд╝рдВрдХреНрд╢рди рд╢реЗрд╖ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдЕрдВрддрд┐рдо рдПрдПрд╕рдЯреА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдПрдХ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ (рдкрд╛рд░реНрд╕рд░) рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕рд▓рд┐рдП рдирд╛рдо - "рдХреЙрдореНрдмреАрдиреЗрдЯрд░"ред рдЖрдк рднрд╛рд╖рд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдХрдИ рдЫреЛрдЯреЗ рдкрд╛рд░реНрд╕рд░ рдмрдирд╛рдХрд░, рдХрд┐рд╕реА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдкрд╛рд░реНрд╕рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реЗ рдЫреЛрдЯреЗ рд╕реЗ рдХрдВрдмрд╛рдЗрдиреЗрдЯрд░
рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп,
рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ , рдФрд░ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреЗ рдПрдХ рдЕрдЬреНрдЮреЗрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд▓рд┐рдЦрдиреЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рд▓реЗрдХреНрд╕рд░ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ
рдкрд░рд┐рдгрд╛рдо рд╡рд░реНрдЧ рдмрдирд╛рдПрдВред рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд░реНрд╕рд░ рдкрд░рд┐рдгрд╛рдо рдХреА рд╢реНрд░реЗрдгреА (рдпрджрд┐ рд╕рдлрд▓), рдпрд╛ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдИ рднреА рдирд╣реАрдВ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдорд╛рди (рдорд╛рди, рдПрдПрд╕рдЯреА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛) рдФрд░ рд╕реНрдерд┐рддрд┐ (рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЕрдЧрд▓реЗ рдЯреЛрдХрди рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
class Result: def __init__(self, value, pos): self.value = value self.pos = pos def __repr__(self): return 'Result(%s, %d)' % (self.value, self.pos)
рдЖрдЧреЗ рд╣рдо рдореБрдЦреНрдп
рдкрд╛рд░реНрд╕рд░ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВрдЧреЗред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдкрд╛рд░реНрд╕рд░реНрд╕ рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдЯреЛрдХрди рдХреА рдПрдХ рдзрд╛рд░рд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдкрд╛рд░реНрд╕рд░реНрд╕ рдХреЛ
__call__ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ
ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рд░реНрд╕рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдо рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдмрдирд╛рдХрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рднреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
class Parser: def __call__(self, tokens, pos): return None
рд╡рд╣ рд╡рд┐рдзрд┐ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рддреА рд╣реИ
__call__ред рдЗрдирдкреБрдЯ рдЯреЛрдХрди рдХреА рдкреВрд░реА рд╕реВрдЪреА (рд▓реЗрдХреНрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ) рдФрд░ рдПрдХ рд╕реВрдЪреА рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ, рдЬреЛ рдЕрдЧрд▓реЗ рдЯреЛрдХрди рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣рдореЗрд╢рд╛
рдХреЛрдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХреА рдЕрдкрдиреА __call__ рд╡рд┐рдзрд┐ рд╣реЛрдЧреАред
__Add__, __mul__, __or__ рдФрд░
__xor__ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ
, *, * | рдФрд░
^ рдСрдкрд░реЗрдЯрд░реЛрдВ, рдХреНрд░рдорд╢рдГред рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрдЯрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реЙрд░реНрдЯрдХрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗред
рдЕрдм рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ
рдЖрд░рдХреНрд╖рд┐рдд рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
ред рдЖрд░рдХреНрд╖рд┐рдд рд╢рдмреНрджреЛрдВ рдФрд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛; рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдп рдФрд░ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЯреЛрдХрди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЯреЛрдХрди рдПрдХ рдореВрд▓реНрдп-рдЯреИрдЧ рдЬреЛрдбрд╝реА рд╣реИред рдЯреЛрдХрди [0] - рдорд╛рди, рдЯреЛрдХрди [1] - рдЯреИрдЧред
class Reserved(Parser): def __init__(self, value, tag): self.value = value self.tag = tag def __call__(self, tokens, pos): if pos < len(tokens) and \ tokens[pos][0] == self.value and \ tokens[pos][1] is self.tag: return Result(tokens[pos][0], pos + 1) else: return None
рдЕрдм рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ:
"рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкрд╛рд░реНрд╕рд░реНрд╕ рд▓реМрдЯрддреЗ рд╣реИрдВред" рдЙрдкрд╡рд░реНрдЧ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдПрдХ рдЙрдкрд╡рд░реНрдЧ
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА
рддрд░рд╣ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ
рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ )ред рдЙрдк-рдХреНрд▓рд╛рд╕рд┐рдВрдЧ рдирдП рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ __call__ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЕрднреА рднреА рдмрд╛рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрдкрд░реЗрдЯрд░ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ) рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВред
рд╣рдо рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
рдЯреИрдЧ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдЖрд░рдХреНрд╖рд┐рдд рдХреЗ рд╕рдорд╛рди рд╣реИред рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреИрдЧ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реБрдП рдЯреЛрдХрди рдвреВрдВрдврддрд╛ рд╣реИред рдореВрд▓реНрдп рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
class Tag(Parser): def __init__(self, tag): self.tag = tag def __call__(self, tokens, pos): if pos < len(tokens) and tokens[pos][1] is self.tag: return Result(tokens[pos][0], pos + 1) else: return None
рдЯреИрдЧ рдФрд░ рдЖрд░рдХреНрд╖рд┐рдд рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рд╣рдорд╛рд░реЗ рдЖрджрд┐рдо рд╣реИрдВред рдЕрдиреНрдп рд╕рднреА рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреЛ рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рд╕реНрддрд░ рдкрд░ рдЙрдирд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдХреЙрдиреИрдЯ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджреЛ рдкрд╛рд░реНрд╕рд░ рд▓реЗрддрд╛ рд╣реИ (рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ)ред рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдкрд░, рдХреЙрдирд╕реИрдЯ рдкрд╛рд░реНрд╕рд░ рдмрд╛рдПрдВ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдФрд░ рдлрд┐рд░ рджрд╛рдПрдВ [рдкрд╛рд░реНрд╕рд░]ред рдпрджрд┐ рджреЛрдиреЛрдВ рд╕рдлрд▓ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдореА рдорд╛рди рдореЗрдВ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдкрд░рд┐рдгрд╛рдо рдХреА рдПрдХ рдЬреЛрдбрд╝реА рд╣реЛрдЧреАред рдпрджрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреЛрдИ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрдПрдЧрд╛ред
class Concat(Parser): def __init__(self, left, right): self.left = left self.right = right def __call__(self, tokens, pos): left_result = self.left(tokens, pos) if left_result: right_result = self.right(tokens, left_result.pos) if right_result: combined_value = (left_result.value, right_result.value) return Result(combined_value, right_result.pos) return None
рдХреЙрдирдХрдЯ рдЯреЛрдХрди рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
1 + 2 рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ
parser = Concat(Concat(Tag(INT), Reserved('+', RESERVED)), Tag(INT))
рдпрд╛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╢реЙрд░реНрдЯрд╣реИрдВрдб рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
parser = Tag(INT) + Reserved('+', RESERVED) + Tag(INT)
рдЕрд▓реНрдЯрд░рдиреЗрдЯрд┐рд╡ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рднреА рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рд╕реЗ рдХрд╛рдлреА рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рд╣реИред рдпрд╣ рдмрд╛рдПрдВ- рдФрд░ рджрд╛рдПрдВ-рдмрд╛рдПрдВ рдХреЛ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ - рдпрд╣ рдПрдХ рд╕рд╣реА-рдкрд╛рд░реНрд╕рд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЕрдкрдирд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред
class Alternate(Parser): def __init__(self, left, right): self.left = left self.right = right def __call__(self, tokens, pos): left_result = self.left(tokens, pos) if left_result: return left_result else: right_result = self.right(tokens, pos) return right_result
рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдВрднрд╡ рд╣реИ рдЬрдм рд╕рдВрднрд╡ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЪрдпрдиред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдореЗрдВ рдПрдХ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
parser = Reserved('+', RESERVED) | Reserved('-', RESERVED) | Reserved('*', RESERVED) | Reserved('/', RESERVED)
рдСрдкреНрдЯ рдХреНрд▓рд╛рд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд╛рда рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЕрдиреНрдпред рдЗрд╕рдореЗрдВ рдПрдХ рдкрд╛рд░реНрд╕рд░ рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдкрд╛рд░реНрд╕рд░ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд▓реМрдЯрддрд╛ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдПрдХ рд╕рдлрд▓ рдкрд░рд┐рдгрд╛рдо рд╡реИрд╕реЗ рднреА рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рдХреЛрдИ рдирд╣реАрдВ рд╣реИред рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЯреЛрдХрди рдХрд╛ рд╕реЗрд╡рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдкрд░рд┐рдгрд╛рдо рдХреА рд╕реНрдерд┐рддрд┐ рдЗрдирдкреБрдЯ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рдорд╛рди рд╣реИред
class Opt(Parser): def __init__(self, parser): self.parser = parser def __call__(self, tokens, pos): result = self.parser(tokens, pos) if result: return result else: return Result(None, pos)
рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкрд╛рд░реНрд╕рд░ рдХреЛ рддрдм рддрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдХреНрд░реИрд╢ (рд╡рд┐рдлрд▓) рди рд╣реЛ рдЬрд╛рдПред рдпрд╣ рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд░реЗрдк рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдЧрд╛ рдФрд░ рдпрджрд┐ рдкрд╛рд░реНрд╕рд░ рдкрд╣рд▓реА рдмрд╛рд░ рд╡рд┐рдлрд▓ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдЯреЛрдХрди рдХреЛ рдЕрд╡рд╢реЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
class Rep(Parser): def __init__(self, parser): self.parser = parser def __call__(self, tokens, pos): results = [] result = self.parser(tokens, pos) while result: results.append(result.value) pos = result.pos result = self.parser(tokens, pos) return Result(results, pos)
рдкрд░рд┐рдгрд╛рдо рдХреЗ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдкреНрд░реЛрд╕реЗрд╕ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рдЗрд╕рдХрд╛ рдЗрдирдкреБрдЯ рдкрд╛рд░реНрд╕рд░ рдФрд░ рдлрдВрдХреНрд╢рди рд╣реИред рдЬрдм рдкрд╛рд░реНрд╕рд░ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдореА рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореВрд▓ рдорд╛рди рдХреЗ рдмрдЬрд╛рдп, рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдорд╛рди рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЬреЛрдбрд╝реЗ рдФрд░ рд╕реВрдЪрд┐рдпреЛрдВ рд╕реЗ рдПрдПрд╕рдЯреА рдиреЛрдбреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ (рдХреЙрдиреИрдЯ рдФрд░ рд░реЗрдк рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛)ред
class Process(Parser): def __init__(self, parser, function): self.parser = parser self.function = function def __call__(self, tokens, pos): result = self.parser(tokens, pos) if result: result.value = self.function(result.value) return result
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрд╕ рдкрд╛рд░реНрд╕рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдХреЙрдиреИрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдерд╛ред рдЬрдм рдпрд╣
1 + 1 рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо
(('1', '+'), '2') рд╣реЛрдЧрд╛ , рдЬреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде, рд╣рдо рдкрд░рд┐рдгрд╛рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рдореНрди рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрди рджреЛрдиреЛрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдпреЛрдЧ рд▓реМрдЯрд╛рдПрдЧрд╛ред
def process_func(parsed): ((l, _), r) = parsed return int(l) + int(r) better_parser = parser ^ process_func
рдЖрд▓рд╕реА рдПрдХ рдХрдо рд╕реНрдкрд╖реНрдЯ рд╕рдВрдпреЛрдЬрдХ рд╣реИред рдПрдХ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдПрдХ рдЕрд╢рдХреНрдд рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓реЗрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЖрд▓рд╕реА рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд░реНрд╕рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдмреБрд▓рд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд▓рд╛рдЧреВ рди рд╣реЛред рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкрд╛рд░реНрд╕рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЪреВрдВрдХрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ (рдкрд╛рд░реНрд╕рд░) рдЦреБрдж рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рд▓рд┐рдВрдХ рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдЬрдмрдХрд┐ рдкрд╛рд░реНрд╕рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рд╣рд╕реНрдХреЗрд▓ рдпрд╛ рд╕реНрдХрд╛рд▓рд╛ рдЬреИрд╕реА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЖрд▓рд╕реА рднрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд╛рдпрдерди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред
class Lazy(Parser): def __init__(self, parser_func): self.parser = None self.parser_func = parser_func def __call__(self, tokens, pos): if not self.parser: self.parser = self.parser_func() return self.parser(tokens, pos)
рдЕрдЧрд▓рд╛
рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдПрдХрд▓ рдЗрдирдкреБрдЯ рдкрд╛рд░реНрд╕рд░ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдПрдХрдорд╛рддреНрд░ рдкрдХрдбрд╝ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣
рд╕рднреА рдЯреЛрдХрди рдХреЛ рдЕрд╡рд╢реЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд╣реЛрдЧрд╛ред рдпрд╣ рд╣рдореЗрдВ рдЙрди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рдЕрдВрдд рдореЗрдВ рдХрдЪрд░рд╛ рд╣реЛрддрд╛ рд╣реИред
class Phrase(Parser): def __init__(self, parser): self.parser = parser def __call__(self, tokens, pos): result = self.parser(tokens, pos) if result and result.pos == len(tokens): return result else: return None
рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдЕрдВрддрд┐рдо рджрд╣рдирдХрд╛рд░ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣реИред
рдНрдХреНрд╕реНрдк рдХрд╛ рдЕрд░реНрде рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ; рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рд╣реЛрддреА рд╣реИред рдпрд╣рд╛рдВ рдпреМрдЧрд┐рдХ рдХрдердиреЛрдВ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
a := 10; b := 20; c := 30
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрди рдмрдпрд╛рдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬреЛ рдПрдХ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдПрдХреНрд╕рдк рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдиреНрдп рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рднрд╛рд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
def compound_stmt(): return stmt() + Reserved(';', RESERVED) + stmt()
Stmt рдмрдирд╛рдирд╛:
def stmt(): return Lazy(compound_stmt) | assign_stmt()
рддреЛ stmt рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕_stmt рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ stmt рдХрд╣рддрд╛ рд╣реИред рдЬрдм рддрдХ рд╣рдореЗрдВ рдПрдХ рдмрдлрд░ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛, рд╡реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдпреМрдЧрд┐рдХ рдХрдердиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдмрд╛рдИрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХреНрд╕рдк рдмрд╕ рд╕реВрдЪреА рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдХреЗ (рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд░реЗрдк рдХреЗ рд╕рдорд╛рди) рдХреЛ рдЫреЛрдбрд╝ рдХрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдНрдХреНрд╕реНрдк рджреЛ рдЗрдирдкреБрдЯ рдкрд╛рд░реНрд╕рд░ рд▓реЗрддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдкрд╛рд░реНрд╕рд░ рд╕реВрдЪреА рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрддреНрд╡реЛрдВ рдФрд░ рджреВрд╕рд░рд╛ рд╡рд┐рднрд╛рдЬрдХреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рджреВрд╕рд░реЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдПрдХ рдореВрд▓реНрдп рдореЗрдВ рдмрд╛рдИрдВ рдФрд░ рджрд╛рдИрдВ рдУрд░ рдкрд╛рд░реНрд╕ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рдорд╛рди рдкреВрд░реА рд╕реВрдЪреА рдореЗрдВ, рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ рд░рд┐рдЯрд░реНрди рд╕реЗ рдЬрдорд╛ рд╣реЛрддрд╛ рд╣реИред
рдЖрдЗрдП рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ:
class Exp(Parser): def __init__(self, parser, separator): self.parser = parser self.separator = separator def __call__(self, tokens, pos): result = self.parser(tokens, pos) def process_next(parsed): (sepfunc, right) = parsed return sepfunc(result.value, right) next_parser = self.separator + self.parser ^ process_next next_result = result while next_result: next_result = next_parser(tokens, result.pos) if next_result: result = next_result return result
рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реЛрдЧрд╛ рдЬреЛ рдкреВрд░реЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
Process_next рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ
рдкреНрд░реЛрд╕реЗрд╕ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдЧрд▓реА рд╕реВрдЪреА рдЖрдЗрдЯрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
next_parser рдПрдХ
рд╡рд┐рднрд╛рдЬрдХ рдФрд░ рдлрд┐рд░
рдкрд╛рд░реНрд╕рд░ рд▓реЗрддрд╛ рд╣реИред
process_next рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдгрд╛рдо рдкрд░ рдФрд░ рд╣реМрд╕рд▓реЗ рд╕реЗ рдмрдиреЗ рддрддреНрд╡ рдкрд░ рдПрдХ рд╡рд┐рднрд╛рдЬрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рдкрд░рд┐рдгрд╛рдо рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛ред
next_parser рдХреЛ рдПрдХ рд▓реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдпрд╣ рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ Exp рдХреИрд╕реЗ рдХрдВрдкрд╛рдЙрдВрдб_рд╕реНрдЯреЗрдо рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
def assign_stmt(): ... def compound_sep(): def process_sep(parsed): return lambda l, r: CompoundStmt(l, r) return Reserved(';', RESERVED) ^ process_sep def compound_stmt(): return Exp(assign_stmt(), compound_sep())
рд╣рдо рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
def compound_stmt(): return assign_stmt() * compound_sep()
рдЬрдм рд╣рдо рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рднрд╛рд╡реЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рддреЛ рд╣рдо рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗред
рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:
imp-interpreter.tar.gz