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



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


рд▓реЗрдЦреЛрдВ рдХреА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ, рдореИрдВ рд╕рд╛рдзрд╛рд░рдг рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛ IMP (IMperative Language) рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦрдХрд░ рдЗрд╕ рд╕рд░рд▓рддрд╛ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдХреЛ рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд░рд▓ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЬреНрдЮрд╛рдд рднрд╛рд╖рд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЬрдЧрд░ рдХреЛрдб рд╕реНрдпреВрдбреЛрдХреЛрдб рдХреЗ рд╕рдорд╛рди рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ [рдЕрдЬрдЧрд░] рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рдЦрд░реЛрдВрдЪ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рдХреЗ рдПрдХ рд╕рд░рд▓ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдореИрдВ рдЖрдкрдХреЛ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЕрдзрд┐рдХ рдмрддрд╛рдКрдВрдЧрд╛)ред Sys (I / O рдХреЗ рд▓рд┐рдП), re (lexer рдореЗрдВ рдирд┐рдпрдорд┐рдд рднрд╛рд╡) рдФрд░ unittest (рд╣рдорд╛рд░реЗ рд╢рд┐рд▓реНрдк рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЫреЛрдЯрд╛ рд╕рд╛ рд╕рд╛рд░

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреНрдпреЛрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред рдЫреЛрдЯрд╛ рд╕рд╛ рднреВрдд рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рднрд╛рд╖рд╛ рд╣реИ:

рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ (рд╕рднреА рдЪрд░ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ):

x := 1 


рдирд┐рдпрдо рдФрд░ рд╢рд░реНрддреЗрдВ:

 if x = 1 then y := 2 else y := 3 end 


рдЬрдмрдХрд┐ рд▓реВрдк:

 while x < 10 do x := x + 1 end 


рдпреМрдЧрд┐рдХ рд╕рдВрдЪрд╛рд▓рдХ (рдЕрд▓рдЧ рд╣реЛ рдЧрдП):

 x := 1; y := 2 


рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЦрд┐рд▓реМрдирд╛ рднрд╛рд╖рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдкрд╛рдЗрдерди рдпрд╛ рд▓реБрдЖ рдЬреИрд╕реЗ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реНрддрд░ рддрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдмрд╕ рдЗрд╕реЗ рдЙрддрдирд╛ рд╣реА рд╕рд░рд▓ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬрд┐рддрдирд╛ рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред

рдФрд░ рдпрд╣рд╛рдБ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рднрд╛рдЬреНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ:

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


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

рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕рдВрд░рдЪрдирд╛

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

рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рдХреЗрд╡рд▓ рддреАрди рдЪрд░рдг:


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

рдПрдПрд╕рдЯреА рдЯреЛрдХрди рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╛рд░реНрд╕рд░ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдПрдХ рдРрд╕реЗ рд░реВрдк рдореЗрдВ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдпрд╣ рд▓реЗрдЦ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓реЗрдХреНрд╕рд░ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рдЖрдо lex рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдлрд┐рд░ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рднреВрдд рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗрдВрдЧреЗред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд╛рдЧ рдкрд╛рд░реНрд╕рд░ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрдХ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдВрдЧреЗред

lexer

рд╕рдЪ рдореЗрдВ, рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдСрдкрд░реЗрд╢рди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИрдВ рдФрд░ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЙрдирд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдк рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

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

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

рдпрд╣рд╛рдБ lexer рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдХреЛрдб рд╣реИ:

 import sys import re def lex(characters, token_exprs): pos = 0 tokens = [] while pos < len(characters): match = None for token_expr in token_exprs: pattern, tag = token_expr regex = re.compile(pattern) match = regex.match(characters, pos) if match: text = match.group(0) if tag: token = (text, tag) tokens.append(token) break if not match: sys.stderr.write('Illegal character: %s\n' % characters[pos]) sys.exit(1) else: pos = match.end(0) return tokens 


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

рд▓реЗрдХреНрд╕рд░ рдЫреЛрдЯрд╛ рд╕рд╛ рднреВрдд

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

 import lexer RESERVED = 'RESERVED' INT = 'INT' ID = 'ID' 


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

 token_exprs = [ (r'[ \n\t]+', None), (r'#[^\n]*', None), 


рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдорд╛рд░реЗ рд╕рднреА рдСрдкрд░реЗрдЯрд░ рдФрд░ рдЖрд░рдХреНрд╖рд┐рдд рд╢рдмреНрдж рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реИрдВред

  (r'\:=', RESERVED), (r'\(', RESERVED), (r'\)', RESERVED), (r';', RESERVED), (r'\+', RESERVED), (r'-', RESERVED), (r'\*', RESERVED), (r'/', RESERVED), (r'<=', RESERVED), (r'<', RESERVED), (r'>=', RESERVED), (r'>', RESERVED), (r'=', RESERVED), (r'!=', RESERVED), (r'and', RESERVED), (r'or', RESERVED), (r'not', RESERVED), (r'if', RESERVED), (r'then', RESERVED), (r'else', RESERVED), (r'while', RESERVED), (r'do', RESERVED), (r'end', RESERVED), 


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

  (r'[0-9]+', INT), (r'[A-Za-z][A-Za-z0-9_]*', ID), ] 


рдЬрдм рд╣рдорд╛рд░реЗ regexps рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо lex рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдПрдХ рдЖрд╡рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ :

 def imp_lex(characters): return lexer.lex(characters, token_exprs) 


рдпрджрд┐ рдЖрдк рдЗрди рд╢рдмреНрджреЛрдВ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдЪрдорддреНрдХрд╛рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:

 import sys from imp_lexer import * if __name__ == '__main__': filename = sys.argv[1] file = open(filename) characters = file.read() file.close() tokens = imp_lex(characters) for token in tokens: print token 


 $ python imp.py hello.imp 


рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ: imp-interpreter.tar.gz
рдореВрд▓ рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рдЬреЗ рдХреЙрдирд░реЛрдб рд╣реИрдВ ред

UPD: рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рдХреНрд░рдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ zeLark рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред

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


All Articles