рдкрд╛рдпрдерди рдореЗрдВ рдЦрд░реЛрдВрдЪ рд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рджреБрднрд╛рд╖рд┐рдпрд╛ (рднрд╛рдЧ 3)

рдЫрд╡рд┐


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


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


рдПрдПрд╕рдЯреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЕрдкрдирд╛ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рд╣рдореЗрдВ рдЙрди рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд░реНрд╕рд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВрдЧреЗред рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рдкреНрд░рддреНрдпреЗрдХ рдЫреЛрдЯрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рддрддреНрд╡ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╡рд░реНрдЧ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдПрдБ рдПрдПрд╕рдЯреА рдореЗрдВ рдиреЛрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреАред

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


рд╣рдо рдПрдХ рд╕рд╛рде рдХреЛрд╖реНрдардХ (рдЬреИрд╕реЗ (x+2)*3 ) рдореЗрдВ рднрд╛рд╡реЛрдВ рдХреЛ рднреА рд╕рдореВрд╣рдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХрд╛ рд╣реИред
рд╣рдо рдЗрди рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рддреАрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдЖрдзрд╛рд░ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд╛рд░ рд╡рд░реНрдЧред рдЕрдм рддрдХ, рдХрдХреНрд╖рд╛рдПрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВред __repr__ рд╡рд┐рдзрд┐ __repr__ рдХреЛ рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд╕рднреА AST рд╡рд░реНрдЧ Equality рдХрд╛ рд╡рд╛рд░рд┐рд╕ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рджреЛ AST рд╡рд╕реНрддреБрдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рднреА рдЙрдкрдпреЛрдЧреА рд╣реИред

 from equality import * class Aexp(Equality): pass class IntAexp(Aexp): def __init__(self, i): self.i = i def __repr__(self): return 'IntAexp(%d)' % self.i class VarAexp(Aexp): def __init__(self, name): self.name = name def __repr__(self): return 'VarAexp(%s)' % self.name class BinopAexp(Aexp): def __init__(self, op, left, right): self.op = op self.left = left self.right = right def __repr__(self): return 'BinopAexp(%s, %s, %s)' % (self.op, self.left, self.right) 

рддрд╛рд░реНрдХрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИрдВред рддрд╛рд░реНрдХрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ 4 рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:


рд░рд┐рд▓реЗрд╢рдирд╢рд┐рдк рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдмрд╛рдПрдБ рдФрд░ рджрд╛рдПрдБ рдкрдХреНрд╖ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╣реИрдВред рдмрд╛рдПрдБ рдФрд░ рджрд╛рдПрдБ рдкрдХреНрд╖ and , рдпрд╛ not рднрд╛рд╡ рддрд╛рд░реНрдХрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рднреЗрдж рд╣рдореЗрдВ рд╡реНрдпрд░реНрде рднрд╛рд╡реЛрдВ рдЬреИрд╕реЗ x < 10 and 30 рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

 class Bexp(Equality): pass class RelopBexp(Bexp): def __init__(self, op, left, right): ... class AndBexp(Bexp): def __init__(self, left, right): ... class OrBexp(Bexp): def __init__(self, left, right): ... class NotBexp(Bexp): def __init__(self, exp): ... 

рдХрдерди (рдХрдерди) рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЕрдВрдХрдЧрдгрд┐рдд рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рднрд╛рд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред 4 рдкреНрд░рдХрд╛рд░ рдХреЗ рднрд╛рд╡ рд╣реИрдВ: рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ, рдЬреЙрдЗрди, рдХрдВрдбреАрд╢рди рдФрд░ рд▓реВрдкред

 class Statement(Equality): pass class AssignStatement(Statement): def __init__(self, name, aexp): ... class CompoundStatement(Statement): def __init__(self, first, second): ... class IfStatement(Statement): def __init__(self, condition, true_stmt, false_stmt): ... class WhileStatement(Statement): def __init__(self, condition, body): ... 

рдкреБрд░рд╛рддрди


рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░реА AST рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╕реЗрдЯ рд╣реИ - рдпрд╣ рд╣рдорд╛рд░реЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЬрдм рдПрдХ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рднрд╛рд╖рд╛ рдХреА рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ, рдзреАрд░реЗ-рдзреАрд░реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЪреАрдЬреЛрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИред

keyword рдкрд╛рд░реНрд╕рд░ рдХреЛ рджреЗрдЦрдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рдкрд╛рд░реНрд╕рд░ рд╣реИред рдпрд╣ RESERVED рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ RESERVED рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЬреЛ рд╕рднреА рдХреАрд╡рд░реНрдб рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ, Reserved рдПрдХрд▓ рдЯреЛрдХрди рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдп рдФрд░ рдЯреИрдЧ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЧрдП рд╕рдорд╛рди рд╣реИрдВред

 def keyword(kw): return Reserved(kw, RESERVED) 

keyword рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдЕрдиреНрдп рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

id рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЪрд░ рдирд╛рдореЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ Tag рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЯреЛрдХрди рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

 id = Tag(ID) 

num рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд▓рдЧрднрдЧ id рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рдЯреЛрдХрди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП Process рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ, ^ рдСрдкрд░реЗрдЯрд░ рдЬрд┐рд╕реЗ Process рдХрд╣рддреЗ рд╣реИрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

 num = Tag(INT) ^ (lambda i: int(i)) 

рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЕрдВрдХрдЧрдгрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ


рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рддрд╛рд░реНрдХрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдпрд╛ рдмрдпрд╛рдиреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкрд╣рд▓реЗ рд╣рдо aexp_value рдкрд╛рд░реНрд╕рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ num рдФрд░ id рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛ред

 def aexp_value(): return (num ^ (lambda i: IntAexp(i))) | \ (id ^ (lambda v: VarAexp(v))) 

рд╣рдордиреЗ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ | рдЬреЛ Alternate рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкреВрд░реНрдгрд╛рдВрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдпрджрд┐ рд╡реЗ рд╡рд┐рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЪрд░ рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдордиреЗ aexp_value рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдорд╛рди рдХреЗ рдмрдЬрд╛рдп рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ id рдФрд░ num рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ред рд╣рдо рд╢реЗрд╖ рд╕рднреА рдкрд╛рд░реНрд╕рд░реЛрдВ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗред рдФрд░ рд╣рдордиреЗ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдХреЛрдб рддреБрд░рдВрдд рдЧрдгрдирд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрджрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд░реНрд╕рд░ рдЕрдиреНрдп рдкрд╛рд░реНрд╕рд░реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕реА рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрдЧреЗ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрднреА рддрдХ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдереЗред рдЗрд╕рд╕реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкрд╛рд░реНрд╕рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдХрдо рдкрдардиреАрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЕрдкрдиреЗ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рде рд╕рдореВрд╣рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╕рдореВрд╣реАрдХрд░рдг рдХреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ AST рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдлрд┐рд░ рднреА рдЙрдиреНрд╣реЗрдВ рдПрдХ рдФрд░ рдкрд╛рд░реНрд╕рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред

 def process_group(parsed): ((_, p), _) = parsed return p def aexp_group(): return keyword('(') + Lazy(aexp) + keyword(')') ^ process_group 

process_group рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ Process рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ ( ^ рдСрдкрд░реЗрдЯрд░) рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдмрд╕ рдХреЛрд╖реНрдардХ рдХреЗ рдЯреЛрдХрди рдХреЛ рддреНрдпрд╛рдЧрддрд╛ рд╣реИ рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЕрдВрджрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, aexp_group рднреА рдПрдХ рдкрд╛рд░реНрд╕рд░ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ, Concat рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЗ рд▓рд┐рдП + рдСрдкрд░реЗрдЯрд░ рдПрдХ рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╣реИред рддреЛ рдпрд╣ '(', рдЕрдВрдХрдЧрдгрд┐рдд рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реБрдП ( aexp рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ aexp , рдЬрд┐рд╕реЗ рд╣рдо рдЬрд▓реНрдж рд╣реА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ), 'рдХреЗ рдЖрдЧреЗ')ред aexp aexp рдХреЙрд▓ aexp рдмрдЪреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ aexp рдХреЙрд▓ aexp_group , рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдирдВрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реЛрдЧреАред рд╣рдо Lazy рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХреЙрд▓ рдХреЛ рдПрдлрд╝рдПрдХреНрд╕ рдкрд░ рддрдм рддрдХ рд░реЛрдХрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдкрд╛рд░реНрд╕рд░ рдХрд┐рд╕реА рдЗрдирдкреБрдЯ рдкрд░ рд▓рд╛рдЧреВ рди рд╣реЛ рдЬрд╛рдПред

рдЕрдЧрд▓рд╛, рд╣рдо aexp_value рдФрд░ aexp_group рдХреЛ aexp_term рд╕рд╛рде aexp_term ред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ aexp_term рдХрд┐рд╕реА рднреА рд╕рд░рд▓ рд╕реНрд╡рддрдВрддреНрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рдЕрдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдкреВрд░реНрд╡рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

 def aexp_term(): return aexp_value() | aexp_group() 

рдЕрдм рд╣рдо рдореБрд╢реНрдХрд┐рд▓ рднрд╛рдЧ рдореЗрдВ рдЖ рд░рд╣реЗ рд╣реИрдВ: рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рд╡рд░рд┐рд╖реНрдарддрд╛ред рдПрдХ рдФрд░ рдкрд╛рд░реНрд╕рд░ рдХреЛ aexp рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ aexp_term рд╕рд╛рде рдлреЗрдВрдХ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛:
 1 + 2 * 3 

рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЧрд▓рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП:
 (1 + 2) * 3 

рдкрд╛рд░реНрд╕рд░ рдХреЛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдкреВрд░реНрд╡рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрд╣ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдПрдХ рдЙрдЪреНрдЪрддрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде рд╕рдореВрд╣ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред

рд╣рдо рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред

 def process_binop(op): return lambda l, r: BinopAexp(op, l, r) 

process_binop рдлрд╝рдВрдХреНрд╢рди рд╡рд╣ рд╣реИ рдЬреЛ BinopAexp рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрдЯрд░ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЬреЛрдбрд╝реЗ рдХреЗ рднрд╛рд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ ...

process_binop рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ Exp combinator ( * рдСрдкрд░реЗрдЯрд░) рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред Exp рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбрд╝реА рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмреАрдЪ рдПрдХ рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдмрд╛рдпрд╛рдБ рдСрдкрд░реЗрдЯрд░ Exp рдПрдХ рдкрд╛рд░реНрд╕рд░ рд╣реИ рдЬреЛ рд╕реВрдЪреА рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рддрддреНрд╡реЛрдВ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ) рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рд╕рд╣реА рдСрдкрд░реЗрдЯрд░ рдПрдХ рдкрд╛рд░реНрд╕рд░ рд╣реИ рдЬреЛ рд╡рд┐рднрд╛рдЬрдХреЛрдВ (рдСрдкрд░реЗрдЯрд░реЛрдВ) рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЬреЛ рднреА рд╡рд┐рднрд╛рдЬрдХ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, рд╕рд╣реА рдкрд╛рд░реНрд╕рд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓реМрдЯрд╛рдПрдЧрд╛, рдЬреЛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдПрдХ рдпреВрдирд┐рдпрди рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИред рдпреВрдирд┐рдпрди рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рднрд╛рдЬрдХ рдХреЗ рдмрд╛рдИрдВ рдФрд░ рджрд╛рдИрдВ рдУрд░ рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдПрдХрд▓, рд╕рдВрдпреБрдХреНрдд рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рджреЗрддрд╛ рд╣реИред рдЕрднреА рддрдХ рдЙрд▓рдЭрди рдореЗрдВ рдирд╣реАрдВ? рд╣рдо рд╢реАрдШреНрд░ рд╣реА Exp рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ Exp ред process_binop рдлрд╝рдВрдХреНрд╢рди рд╡рд╣ рд╣реИ рдЬреЛ рд╕рд╣реА рдкрд╛рд░реНрд╕рд░ рд▓реМрдЯрд╛рдПрдЧрд╛ред
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреЗ рд╡рд░рд┐рд╖реНрдарддрд╛ рд╕реНрддрд░ рдФрд░ рдПрдХ рд╕рдВрдпреЛрдЬрдирдХрд░реНрддрд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╣рдо рдЙрдирд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХреЗрдВред
 def any_operator_in_list(ops): op_parsers = [keyword(op) for op in ops] parser = reduce(lambda l, r: l | r, op_parsers) return parser aexp_precedence_levels = [ ['*', '/'], ['+', '-'], ] 

any_operator_in_list рдлрд╝рдВрдХреНрд╢рди рдХреАрд╡рд░реНрдб рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдкрд╛рд░реНрд╕рд░ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред aexp_precedence_levels рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ (рдПрдХ рдЙрдЪреНрдЪрддрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ) рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдпреБрдХреНрдд aexp_precedence_levels рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред

 def precedence(value_parser, precedence_levels, combine): def op_parser(precedence_level): return any_operator_in_list(precedence_level) ^ combine parser = value_parser * op_parser(precedence_levels[0]) for precedence_level in precedence_levels[1:]: parser = parser * op_parser(precedence_level) return parser 

precedence рдСрдкрд░реЗрд╢рди рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд╛рдордЧреНрд░реА рд╣реИред рдЗрд╕рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ, value_parser , рдПрдХ рдкрд╛рд░реНрд╕рд░ рд╣реИ рдЬреЛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд░рд▓ рднрд╛рдЧреЛрдВ рдХреЛ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ: рд╕рдВрдЦреНрдпрд╛рдПрдВ, рдЪрд░ рдФрд░ рд╕рдореВрд╣ред рдпрд╣ aexp_term рд╣реЛрдЧрд╛ред precedence_levels рд╕реВрдЪреА рдореЗрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА, рдкреНрд░рддрд┐ рд╕реНрддрд░ рдПрдХ рд╕реВрдЪреА рд╣реЛрддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, aexp_precedence_levels рдЙрдкрдпреЛрдЧ aexp_precedence_levels ред combine рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓реЗрдЧрд╛, рдЬреЛ рдСрдкрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рджреЛ рдЫреЛрдЯреЗ рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрдбрд╝реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ред рдпрд╣ process_binop рд╣реЛрдЧрд╛

precedence рдЕрдВрджрд░, рд╣рдо рдкрд╣рд▓реЗ op_parser рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд op_parser , рдЬреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╡рд░рд┐рд╖реНрдарддрд╛ рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд╕рдорд╛рди рд╕реНрддрд░ рдХреЗ рд╕рд╛рде рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ рдЬреЛ рджреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред op_parser рд▓рд┐рдП рд╕рд╣реА рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ op_parser рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреА рдкреВрд░реНрд╡рддрд╛ рдХреЗ рд▓рд┐рдП op_parser рдХреЗ рд╕рд╛рде op_parser рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕рдореВрд╣реАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд▓рд╛, рд╣рдо рдкрд░рд┐рдгрд╛рдореА рдкрд╛рд░реНрд╕рд░ рдХреЛ рдЕрдЧрд▓реЗ рд╕реНрддрд░ рдкрд░ рдкрд╛рд░реНрд╕рд░ (рдмрд╛рдПрдВ рддрд░реНрдХ Exp ) рдХреЗ рдПрдХ рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓реВрдк рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкрд╛рд░реНрд╕рд░ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред

рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдЖрдЗрдП рдПрдХ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред
 E<sub>0</sub> = value_parser E<sub>1</sub> = E<sub>0</sub> * op_parser(precedence_levels[0]) E<sub>2</sub> = E<sub>1</sub> * op_parser(precedence_levels[1]) 

E 0 , value_parser рдХреЗ рд╕рдорд╛рди рд╣реИред рдпрд╣ рд╕рдВрдЦреНрдпрд╛, рдЪрд░ рдФрд░ рд╕рдореВрд╣реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдирд╣реАрдВред E 1 рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдореНтАНрдорд┐рд▓рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ E 0 рд╕рд╛рде рд╕рдВрдпреЛрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╡рд░рд┐рд╖реНрдарддрд╛ рдХреЗ рдкрд╣рд▓реЗ рд╕реНтАНрддрд░ рд╕реЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП E 1 a * b / c рдореЗрд▓ рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдпрд╣ + рдСрдкрд░реЗрдЯрд░ рд╕реЗ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред E 2 рдкреВрд░реНрд╡ рд╕реНрддрд░ рдХреЗ рдЕрдЧрд▓реЗ рд╕реНрддрд░ рдХреЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛ рд╕рдХрддрд╛ рд╣реИред рдЪреВрдБрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд░рд┐рд╖реНрдарддрд╛ рдХреЗ рдХреЗрд╡рд▓ 2 рд╕реНрддрд░ рд╣реИрдВ, E 2 рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдХрд┐рд╕реА рднреА рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдПрдХ рдЬрдЯрд┐рд▓ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓реЗрдВ, рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЛ рдмрджрд▓реЗрдВред

 4 * a + b / 2 - (6 + c) E<sub>0(4)</sub> * E<sub>0</sub>(a) + E<sub>0</sub>(b) / E<sub>0</sub>(2) - E<sub>0</sub>(6+c) E<sub>1</sub>(4*a) + E<sub>1</sub>(b/2) - E<sub>1</sub>(6+c) E<sub>2</sub>((4*a)+(b/2)-(6+c)) 

рд╣рдо aexp рдЙрдкрдпреЛрдЧ рд╕реАрдзреЗ aexp рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП aexp :

 def aexp(): return precedence(aexp_term(), aexp_precedence_levels, process_binop) 

рд╣рдо рд╢рд╛рдпрдж рдкреВрд░реНрд╡рд╡рд░реНрддреАрддрд╛ рдХреЛ рдХрдо рдЕрдореВрд░реНрдд рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдХреА рдкреВрд░реНрд╡рд╡рд░реНрддреАрддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рддрд╛рд░реНрдХрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рддрд╛рд░реНрдХрд┐рдХ рднрд╛рд╡реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛


рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рднрд╛рд╡реЛрдВ рд╕реЗ рддрд╛рд░реНрдХрд┐рдХ рдХреА рдУрд░ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рддрд╛рд░реНрдХрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдЖрдорддреМрд░ рдкрд░ рдЕрдВрдХрдЧрдгрд┐рдд рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд░рд▓ рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдЯреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЖрдЗрдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрд╛рд░реНрдХрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ:
 def process_relop(parsed): ((left, op), right) = parsed return RelopBexp(op, left, right) def bexp_relop(): relops = ['<', '<=', '>', '>=', '=', '!='] return aexp() + any_operator_in_list(relops) + aexp() ^ process_relop 

рд╣рдо Process рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде process_relop рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рддреАрди рдЬреБрдбрд╝реЗ рд╣реБрдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрдирд╕реЗ RelopBexp рдмрдирд╛рддрд╛ рд╣реИред bexp_relop рд╣рдо рджреЛ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ ( aexp ) рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд░рд┐рд▓реЗрд╢рди рдСрдкрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рд╣рдо рдЕрдкрдиреЗ рдкреБрд░рд╛рдиреЗ рдЖрджрдореА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - any_operator_in_list рдлрд╝рдВрдХреНрд╢рди, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, Exp рдпрд╛ precedence рдЬреИрд╕реЗ рдХреЙрдореНрдмреАрдиреЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ precedence , рдХреНрдпреЛрдВрдХрд┐ рд░рд┐рд▓реЗрд╢рдирд╢рд┐рдк рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВред

рдЕрдЧрд▓рд╛, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд not ред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдкрд░рд┐рдкрдХреНрд╡ рдСрдкрд░реЗрдЯрд░ not рд╣реИред рдЗрд╕рд╕реЗ рдФрд░ or рднрд╛рд╡реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
 def bexp_not(): return keyword('not') + Lazy(bexp_term) ^ (lambda parsed: NotBexp(parsed[1])) 

рдпрд╣рд╛рдВ рд╣рдордиреЗ рддрд╛рд░реНрдХрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдХреАрд╡рд░реНрдб not рдЬреЛрдбрд╝рд╛ (рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ)ред рдЪреВрдВрдХрд┐ bexp_not рдХреЛ bexp_term рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдирдВрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП Lazy рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 def bexp_group(): return keyword('(') + Lazy(bexp) + keyword(')') ^ process_group def bexp_term(): return bexp_not() | \ bexp_relop() | \ bexp_group() 

рд╣рдо bexp_group рдФрд░ bexp_term рдХреЛ рдЙрд╕реА рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд bexp_group рдЬреИрд╕реЗ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдордХрдХреНрд╖реЛрдВ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдХреЛрдИ рдирдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдЙрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рдФрд░ or рдСрдкрд░реЗрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпреЗ рдСрдкрд░реЗрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ; рджреЛрдиреЛрдВ рдХреЛ рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, and рдЗрд╕рдореЗрдВ рд╡рд░рд┐рд╖реНрдарддрд╛ рдХрд╛ рдЙрдЪреНрдЪрддрдо рд╕реНрддрд░ рд╣реЛрддрд╛ рд╣реИред
 bexp_precedence_levels = [ ['and'], ['or'], ] def process_logic(op): if op == 'and': return lambda l, r: AndBexp(l, r) elif op == 'or': return lambda l, r: OrBexp(l, r) else: raise RuntimeError('unknown logic operator: ' + op) def bexp(): return precedence(bexp_term(), bexp_precedence_levels, process_logic) 

process_binop рддрд░рд╣, process_logic Exp combinator рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИред рдпрд╣ рдПрдХ рдСрдкрд░реЗрдЯрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рджреЛ рд╕рдмрдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИред рд╣рдо рдЗрд╕реЗ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдкреВрд░реНрд╡рдЧрд╛рдореА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ aexp ред рдпрд╣рд╛рдБ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЬрдЯрд┐рд▓ рдХреЛрдб рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИред

рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЖрд░реЛрдк


aexp рдФрд░ bexp , рд╣рдо рдЖрдИрдПрдордкреА рдмрдпрд╛рдиреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдорд╛рдореВрд▓реА рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ:
 def assign_stmt(): def process(parsed): ((name, _), exp) = parsed return AssignStatement(name, exp) return id + keyword(':=') + aexp() ^ process 


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдо stmt_list рдХреЛ stmt_list ред рдпрд╣ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдХрдердиреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдЧрд╛ред
 def stmt_list(): separator = keyword(';') ^ (lambda x: lambda l, r: CompoundStatement(l, r)) return Exp(stmt(), separator) 


рдпрд╛рдж рд░рдЦреЗрдВ, рд╣рдореЗрдВ рдмрд╛рдПрдБ рд╣рд╛рде рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП stmt() + keyword(';') + stmt() рдЬреИрд╕реЗ рдХреБрдЫ рд╕рд░рд▓ рдХреЗ рдмрдЬрд╛рдп рдпрд╣рд╛рдБ EXP рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ if :
 def if_stmt(): def process(parsed): (((((_, condition), _), true_stmt), false_parsed), _) = parsed if false_parsed: (_, false_stmt) = false_parsed else: false_stmt = None return IfStatement(condition, true_stmt, false_stmt) return keyword('if') + bexp() + \ keyword('then') + Lazy(stmt_list) + \ Opt(keyword('else') + Lazy(stmt_list)) + \ keyword('end') ^ process 

рдпрд╣рд╛рдВ рдПрдХрдорд╛рддреНрд░ рдХрдард┐рдирд╛рдИ рдпрд╣ рд╣реИ рдХрд┐ else рдЦрдВрдб рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ while :
 def while_stmt(): def process(parsed): ((((_, condition), _), body), _) = parsed return WhileStatement(condition, body) return keyword('while') + bexp() + \ keyword('do') + Lazy(stmt_list) + \ keyword('end') ^ process 

рд╣рдо рдЗрд╕реЗ stmt рд╕рд╛рде stmt :
 def stmt(): return assign_stmt() | \ if_stmt() | \ while_stmt() 

рдЖрдк рдпрд╣ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ if рджреЛрдиреЛрдВ рдФрд░ if рдореЗрдВ, рд╢рд░реАрд░ рдореЗрдВ stmt_list рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ stmt_list рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред stmt_list рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реА рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИред рд╣рдо рд╕реАрдзреЗ stmt рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рд▓реЗрдлреНрдЯ-рд╕рд╛рдЗрдб рдкрд╛рд░реНрд╕рд░ stmt_list рд╣реЛрдЧрд╛, рдФрд░ рдЪреВрдВрдХрд┐ рд╣рдо if рдФрд░ while рдирд┐рдХрд╛рдпреЛрдВ рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕реАрдзреЗ stmt_list рдЙрдкрдпреЛрдЧ stmt_list ред

рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛


рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднрд╛рд╖рд╛ рдХреЗ рд╣рд░ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд░реНрд╕рд░ рд╣реИред рд╣рдореЗрдВ рдмрд╕ рдХреБрдЫ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 def parser(): return Phrase(stmt_list()) 

parser рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдЧрд╛ред рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рд┐рд░реНрдл рдмрдпрд╛рдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рд▓реЗрдХрд┐рди Phrase рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдВрдд рдореЗрдВ рдЬрдВрдХ (рдЕрдорд╛рдиреНрдп) рдЯреЛрдХрди рдХреЗ рдХрд╛рд░рдг рд╕рдорд╛рдкреНрддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

 def imp_parse(tokens): ast = parser()(tokens, 0) return ast 

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

рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдкрд╛рд░реНрд╕рд░реЛрдВ (рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛) рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ:
 import sys from imp_parser import * if __name__ == '__main__': if len(sys.argv) != 3: sys.stderr.write('usage: %s filename parsername' % sys.argv[0]) sys.exit(1) filename = sys.argv[1] file = open(filename) characters = file.read() file.close() tokens = imp_lex(characters) parser = globals()[sys.argv[2]]() result = parser(tokens, 0) print result 

рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлрд╝рд╛рдЗрд▓ (рдкрд╣рд▓рд╛ рддрд░реНрдХ) рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ imp_parse.py (рджреВрд╕рд░рд╛ рддрд░реНрдХ) рдХреЗ рдХреБрдЫ рдкрд╛рд░реНрд╕рд░ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 $ echo '1 + 2 * 3' >foo.imp $ python imp_parser_driver.py foo.imp aexp Result(BinopAexp(+, IntAexp(1), BinopAexp(*, IntAexp(2), IntAexp(3))), 5) 

рдпрд╣ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдПрдХ рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд┐рдЦреА рдФрд░ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдЙрдиреНрд╣реЛрдВрдиреЗ IMP рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ред рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЕрдЧрд▓реЗ рдФрд░ рдЖрдЦрд┐рд░реА рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВрдЧреЗ ( рдиреЛрдЯ рдЕрдиреБрд╡рд╛рдж: рд╢рдмреНрдж рдореВрд▓реНрдпрд╛рдВрдХрдирдХрд░реНрддрд╛ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдкрд╛ рд╕рдХреЗ) рд╣рдорд╛рд░реЗ рд╕рд╛рд░ рд╕рд╛рд░ рд╡рд╛рдХреНрдп рд╡реГрдХреНрд╖ ( рдПрдПрд╕рдЯреА ) рдХреЗ рд▓рд┐рдПред

рдореВрд▓ рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ - рдЬреЗ рдХреЙрдирд░реЛрдб

рдкреАрдПрд╕ рдореИрдВ рд╕рдм рдЯреИрдЧ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВред рдПрдХ рдзрд╛рд░рдгрд╛ рд╣реИ рдХрд┐ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЬрд▓реНрджреА рд╣реИред рдЗрд╕реЗ рдХреИрд╕реЗ рдмрджрд▓реЗрдВ - рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред рдЬрдм рддрдХ рд╕рдорд╛рдзрд╛рди рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛

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


All Articles