рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгрдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ @duse рдиреЗ рдкрд╣рд▓реЗ рдХреЗ рджреЛ рд▓реЗрдЦреЛрдВ рдХреЗ рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдерд╛, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдЪреВрдВрдХрд┐ рд╡рд┐рд╖рдп рдореБрдЭреЗ рдмрд╣реБрдд рд░реБрдЪрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдирдпрд╛ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдореВрд▓ рд╕реНрд░реЛрдд рдХреА рдУрд░ рд░реБрдЦ рдХрд┐рдпрд╛ред рд╡рд╣ рдЕрдВрдЧреНрд░реЗрдЬреА рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдордЬрдмреВрдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рд░ рдЦреЛрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд╡рд╣ рд░реВрд╕реА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдФрд░ рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХрд╛ рдЬрдиреНрдо рд╣реБрдЖред рдЕрдЧрд░ рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдФрд░ рдиреБрдХрд╕рд╛рди рдЙрдард╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛, рддреЛ рдореИрдВ @ рдбрд╕реЗрд▓ рд╕реЗ рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдн рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЕрдкрдиреЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдХреНрд╕рд░ рдкрд╛рд░реНрд╕рд░ рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд┐рдЦреАред рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдПрдХ рд╕рд╛рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА (рдПрдПрд╕рдЯреА) рдХреЗ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдбреЗрдЯрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреЗ рд╣рдорд╛рд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд▓реЗрдХреНрд╕рд░ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рд▓рд╛рдП рдЧрдП рдЯреЛрдХрди рдХреА рд╕реВрдЪреА рдХрд╛ рдПрдХ рд╕рд╛рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА (рдПрдПрд╕рдЯреА) рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдордиреЗ рдПрдПрд╕рдЯреА рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдЧрд╛ред
рдПрдПрд╕рдЯреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЕрдкрдирд╛ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рд╣рдореЗрдВ рдЙрди рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд░реНрд╕рд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВрдЧреЗред рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рдкреНрд░рддреНрдпреЗрдХ рдЫреЛрдЯрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рддрддреНрд╡ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╡рд░реНрдЧ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдПрдБ рдПрдПрд╕рдЯреА рдореЗрдВ рдиреЛрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреАред
рд╣рдорд╛рд░реЗ IMP рдореЗрдВ рдХреЗрд╡рд▓ рддреАрди рд╕рдВрд░рдЪрдирд╛рдПрдБ рд╣реИрдВ: рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ (рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреБрдХреНрдд), рддрд╛рд░реНрдХрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ (рдпрджрд┐ рдФрд░ рдЬрдм рдХрдердиреЛрдВ рдХреЗ рд▓рд┐рдП рд╢рд░реНрддреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВ), рдФрд░ рдЕрд╡рд╕реНрдерд╛рдПрдБред рдЖрдЗрдП рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╢реЗрд╖ рджреЛ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВред
рдПрдХ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рддреАрди рд░реВрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд▓реЗ рд╕рдХрддреА рд╣реИ:
- рдЕрд▓реНрдлрд╝рд╛рдиреНрдпреВрдореЗрд░рд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЬреИрд╕реЗ
42
- рдЪрд░ рдЬреИрд╕реЗ
x
- рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрд╢рди рдЬреИрд╕реЗ
x + 42
ред рд╡реЗ рдЕрдиреНрдп рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рдмрдирддреЗ рд╣реИрдВред
рд╣рдо рдПрдХ рд╕рд╛рде рдХреЛрд╖реНрдардХ (рдЬреИрд╕реЗ
(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 рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
- рд╕рдВрдмрдВрдз рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рдЬреИрд╕реЗ
x < 10
) And
рднрд╛рд╡ (рдЬреИрд╕реЗ x < 10 and y > 20
)Or
рднрд╛рд╡- рднрд╛рд╡
Not
рд░рд┐рд▓реЗрд╢рдирд╢рд┐рдк рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдмрд╛рдПрдБ рдФрд░ рджрд╛рдПрдБ рдкрдХреНрд╖ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╣реИрдВред рдмрд╛рдПрдБ рдФрд░ рджрд╛рдПрдБ рдкрдХреНрд╖
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 рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд░реНрд╕рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ред рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЕрдЧрд▓реЗ рдФрд░ рдЖрдЦрд┐рд░реА рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдВрдЧреЗ (
рдиреЛрдЯ рдЕрдиреБрд╡рд╛рдж: рд╢рдмреНрдж
рдореВрд▓реНрдпрд╛рдВрдХрдирдХрд░реНрддрд╛ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдкрд╛ рд╕рдХреЗ) рд╣рдорд╛рд░реЗ рд╕рд╛рд░ рд╕рд╛рд░ рд╡рд╛рдХреНрдп рд╡реГрдХреНрд╖ (
рдПрдПрд╕рдЯреА ) рдХреЗ рд▓рд┐рдПред
рдореВрд▓ рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ -
рдЬреЗ рдХреЙрдирд░реЛрдбрдкреАрдПрд╕ рдореИрдВ рд╕рдм рдЯреИрдЧ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВред рдПрдХ рдзрд╛рд░рдгрд╛ рд╣реИ рдХрд┐ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЬрд▓реНрджреА рд╣реИред рдЗрд╕реЗ рдХреИрд╕реЗ рдмрджрд▓реЗрдВ - рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред рдЬрдм рддрдХ рд╕рдорд╛рдзрд╛рди рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛