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



рдкрд┐рдЫрд▓реЗ рддреАрди рднрд╛рдЧреЛрдВ рдореЗрдВ, рд╣рдордиреЗ рдЕрдкрдиреА рдЦрд┐рд▓реМрдирд╛ рднрд╛рд╖рд╛ рдЫреЛрдЯрд╛ рд╕рд╛ рднреВрдд рдХреЗ рд▓рд┐рдП рд▓реЗрд╕рд░, рдкрд╛рд░реНрд╕рд░ рдФрд░ рдПрдПрд╕рдЯреА рдмрдирд╛рдпрд╛ред рд╣рдордиреЗ рдкрд╛рд░реНрд╕рд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреА рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА рд▓рд┐рдЦреАред рдЗрд╕ рдЕрдВрддрд┐рдо рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рдЕрдВрддрд┐рдо рдШрдЯрдХ - рдХрд▓рд╛рдХрд╛рд░ рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗред


рдЖрдЗрдП рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рднреА рд╕рдордп, рдХреБрдЫ "рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБ" рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд┐рд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЧрд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдЬрдм рдЕрдЧрд▓реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ "рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБ" рдореЗрдВ рд╕реБрдзрд╛рд░ рдФрд░ рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рдХрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдПрдХ IMP рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рддреАрди рдЪреАрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
  1. рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдмрд┐рдВрджреБ - рд╣рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред
  2. рдкрд░реНрдпрд╛рд╡рд░рдг - рд╣рдореЗрдВ рдПрдХ "рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрджрд▓рд╛рд╡" рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  3. рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛рд░реНрдп - рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рддрд┐ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБ рдХреЛ рдХреИрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

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

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

рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ

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

class IntAexp(Aexp): ... def eval(self, env): return self.i class VarAexp(Aexp): ... def eval(self, env): if self.name in env: return env[self.name] else: return 0 class BinopAexp(Aexp): ... def eval(self, env): left_value = self.left.eval(env) right_value = self.right.eval(env) if self.op == '+': value = left_value + right_value elif self.op == '-': value = left_value - right_value elif self.op == '*': value = left_value * right_value elif self.op == '/': value = left_value / right_value else: raise RuntimeError('unknown operator: ' + self.op) return value 

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

рдмрд┐рдиреЛрдкрдПрдПрдХреНрд╕рдПрдкреА рдореЗрдВ, рд╣рдо "рдЕрдЬреНрдЮрд╛рдд рдСрдкрд░реЗрдЯрд░" рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд░рдирдЯрд╛рдЗрдордЗрдорд░ рдХреЛ рдлреЗрдВрдХрдХрд░ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ ред Parser рдЕрдЬреНрдЮрд╛рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рд╕реЗ рдПрдХ AST рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдПрдПрд╕рдЯреА рдмрдирд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдпрд╣рд╛рдБ рдмреВрд▓рд┐рдпрди рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдХрд╛рд░реНрдп рд╣реИрдВ:

 class RelopBexp(Bexp): ... def eval(self, env): left_value = self.left.eval(env) right_value = self.right.eval(env) if self.op == '<': value = left_value < right_value elif self.op == '<=': value = left_value <= right_value elif self.op == '>': value = left_value > right_value elif self.op == '>=': value = left_value >= right_value elif self.op == '=': value = left_value == right_value elif self.op == '!=': value = left_value != right_value else: raise RuntimeError('unknown operator: ' + self.op) return value class AndBexp(Bexp): ... def eval(self, env): left_value = self.left.eval(env) right_value = self.right.eval(env) return left_value and right_value class OrBexp(Bexp): ... def eval(self, env): left_value = self.left.eval(env) right_value = self.right.eval(env) return left_value or right_value class NotBexp(Bexp): ... def eval(self, env): value = self.exp.eval(env) return not value 

рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рд╣рдо рдкрд┐рдЯреЛрдиреА рд░рд┐рд▓реЗрд╢рдирд▓ рдФрд░ рд▓реЙрдЬрд┐рдХрд▓ рдСрдкрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдФрд░ рдпрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛рд░реНрдп рд╣реИрдВ:

 class AssignStatement(Statement): ... def eval(self, env): value = self.aexp.eval(env) env[self.name] = value class CompoundStatement(Statement): ... def eval(self, env): self.first.eval(env) self.second.eval(env) class IfStatement(Statement): ... def eval(self, env): condition_value = self.condition.eval(env) if condition_value: self.true_stmt.eval(env) else: if self.false_stmt: self.false_stmt.eval(env) class WhileStatement(Statement): ... def eval(self, env): condition_value = self.condition.eval(env) while condition_value: self.body.eval(env) condition_value = self.condition.eval(env) 

AssignStatement: рд╣рдо рд╕рд┐рд░реНрдл рджрд╛рдИрдВ рдУрд░ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдореА рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЙрди рдЪрд░реЛрдВ рдХреЛ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╣реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред

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

IfStatement: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдмреВрд▓рд┐рдпрди рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╕рддреНрдп рд╣реИ, рддреЛ рд╣рдо рдПрдХ рд╕рдЪреНрдЪреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЧрд▓рдд рдФрд░ рдЧрд▓рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЭреВрдареА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдЬрдмрдХрд┐Statement: рд╣рдо рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд░реНрдд рдкреВрд░реА рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд▓реВрдк рдХреЗ рд╢рд░реАрд░ рдХреЛ рдПрдХ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред рд╣рд╛рд▓рдд рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рд▓рдд рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдЦреИрд░, рд╣рдордиреЗ рдЕрдкрдиреЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рдореБрдЦреНрдп рдШрдЯрдХ рдмрдирд╛рдП рд╣реИрдВ рдФрд░ рдЕрдм рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдПрдХреАрдХреГрдд рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ:

 #!/usr/bin/env python import sys from imp_parser import * from imp_lexer import * def usage(): sys.stderr.write('Usage: imp filename\n') sys.exit(1) if __name__ == '__main__': if len(sys.argv) != 2: usage() filename = sys.argv[1] text = open(filename).read() tokens = imp_lex(text) parse_result = imp_parse(tokens) if not parse_result: sys.stderr.write('Parse error!\n') sys.exit(1) ast = parse_result.value env = {} ast.eval(env) sys.stdout.write('Final variable values:\n') for name in env: sys.stdout.write('%s: %s\n' % (name, env[name])) 

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

рднрд╛рдЬреНрдп рдХреА рдЧрдгрдирд╛ рдХрд╛ рдПрдХ рд╡рд┐рд╣рд┐рдд рдЙрджрд╛рд╣рд░рдг:

 n := 5; p := 1; while n > 0 do p := p * n; n := n - 1 end 

рдирд┐рд╖реНрдкрд╛рджрди рд╣реА:

 $ ./imp.py hello.imp Final variable values: p: 120 n: 0 

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

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

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

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


All Articles