.NET (рднрд╛рдЧ 1) рдХреЗ рд▓рд┐рдП C # рдореЗрдВ рдХреВрд▓ рд╢реИрдХреНрд╖рд┐рдХ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛

рдкрд░рд┐рдЪрдп


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

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

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

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

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

рдЗрд╕рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
  1. ANTLRWorks - рд╡реНрдпрд╛рдХрд░рдг рд▓рд┐рдЦрдиреЗ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ (рд╕реА, рд╕реА #, рдЬрд╛рд╡рд╛, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА, рдкрд░реНрд▓, рдкрд╛рдпрдерди, рд░реВрдмреА, рдЖрджрд┐) рдХреЗ рд▓рд┐рдП рд▓реЗрдХреНрд╕рд░реНрд╕ рдФрд░ рдкрд╛рд░реНрд╕рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдИрдбреАрдИред рдПрд▓рдПрд▓ (*) рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред
  2. ANTLR C # рд░рдирдЯрд╛рдЗрдо рдбрд┐рд╕реНрдЯреНрд░реАрдмреНрдпреВрд╢рди (Antlr3.Runtime.dll) рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рд▓реЗрд╕рд░ рдФрд░ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  3. рджреГрд╢реНрдп рд╕реНрдЯреВрдбрд┐рдпреЛ 2010 рдЕрдЧрд▓рд╛ рд▓реЗрдЦ WPF рдХреЗ рддрд╣рдд рдШрдЯрдХ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛, рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдФрд░ рдХреЛрдб рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрд╡рд▓реЙрдирдПрдбрд┐рдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдиреНрдирдд рдкрд╛рда рд╕рдВрдкрд╛рджрдХ)ред
  4. рдЬрд╛рд╡рд╛ рд░рдирдЯрд╛рдЗрдо рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ (рдЪреВрдВрдХрд┐ ANTLRWorks рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ)ред
  5. IL Disassembler рдХрд╛ рдЙрдкрдпреЛрдЧ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ C # рдЬреИрд╕реЗ рдХреЛрдИ рдХрдВрдкрд╛рдЗрд▓рд░ CIL рдХреЛрдб рдХреИрд╕реЗ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рднрд╛рд╖рд╛ рдХреВрд▓ рдХрд╛ рд╡рд┐рд╡рд░рдг


рдХреВрд▓ - рдХреНрд▓рд╛рд╕рд░реВрдо рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рд▓реИрдВрдЧреНрд╡реЗрдЬ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдПрдХ рд╢реИрдХреНрд╖рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдЬреЛ рдХрд┐рд╕реА рдХреЛ рднреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ , рдЬрд┐рд╕рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдХреВрд▓ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рд╕рдВрдХрд▓рд┐рдд рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рд╣реЛрддреА рд╣реИред рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдФрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ (рдпрд╣рд╛рдБ рдЙрдиреНрд╣реЗрдВ рдлреАрдЪрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ )ред
рд╕рднреА рдлрд╝реАрд▓реНрдб рдЖрдзрд╛рд░ рдФрд░ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рднреАрддрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рд╕рднреА рдХрд╛рд░реНрдп рд╣рд░ рдЬрдЧрд╣ (рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ) рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред
рдпрд╣ рднрд╛рд╖рд╛ рднрд╛рд╡реЛрдВ рдкрд░ рдмрдиреА рд╣реИред рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рдХрд╛рдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд▓рд╛рдЗрди рдЖрдЙрдЯрдкреБрдЯ рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рднреА рдкрд░рд┐рдгрд╛рдо рджреЗрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рдЙрд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬрд╣рд╛рдВ рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреВрд▓ рдореЗрдВ рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЗрдВрдЯ, рдмреВрд▓ рднреА рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдирд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬреЛ рд╢реВрдиреНрдп рдорд╛рди рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣рд╛рдВ рдЗрд╕реЗ рд╢реВрдиреНрдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ )ред рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВред
рдЗрд╕ рднрд╛рд╖рд╛ рдХреЗ рдХреАрд╡рд░реНрдб: рд╡рд░реНрдЧ, рдФрд░, рдЕрд╕рддреНрдп, рдлрд╛рдИ, рдЕрдЧрд░, рдореЗрдВ, рд╡рд┐рд░рд╛рд╕рдд, isvoid, рдЪрд▓реЛ, рд▓реВрдк, рдкреВрд▓, рддрдм, рдЬрдмрдХрд┐, рдорд╛рдорд▓рд╛, esac, рдирдпрд╛, рдирд╣реАрдВ, рд╕рддреНрдп
рдореИрдВ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреБрдЫ рдСрдкрд░реЗрдЯрд░ рдПрдХ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реИрдХреЗрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рд╕реА-рдЬреИрд╕реЗ рд╡рд╛рд▓реЗ) рдпрд╛ рд╢рдмреНрдж рдЕрдВрдд; ( рдореГрдд рдкрд╛рд╕реНрдХрд▓ рдХреЗ рд░реВрдк рдореЗрдВ), рдФрд░ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рдПрдХ рд╣реА рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдирд╛рдо (рдпрджрд┐ -> рдлрд╛рдИ, рд▓реВрдк -> рдкреВрд▓, рдХреЗрд╕ -> рдПрд╕рдПрд╕реА)ред
рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ, рдпрджрд┐ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрдЯрд░ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ, рддреЛ рдпрджрд┐ рд░рд┐рдЯрд░реНрди рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЖрдЦрд┐рд░рдХрд╛рд░, рд╡рд╣ рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕рд╣реА рдЙрддреНрддрд░: рдирд┐рдХрдЯрддрдо рд╕рд╛рдорд╛рдиреНрдп рдкреВрд░реНрд╡рдЬ (рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдЬрдЯрд┐рд▓ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрднреА рднреА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдореИрдВ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╕реНрд╡реАрд░ рджреЗрддрд╛ рд╣реВрдВ:

рдЪрд┐рддреНрд░ 1

рдпрд╣рд╛рдВ, рдХрдХреНрд╖рд╛ рдП рдФрд░ рдмреА рдХреЗ рд▓рд┐рдП, рдирд┐рдХрдЯрддрдо рд╕рд╛рдорд╛рдиреНрдп рдкреВрд░реНрд╡рдЬ рдХрдХреНрд╖рд╛ рдбреА рд╣реИред

рдХреЗрд╕ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрдИ рдмрд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рдорд╛рди рд╣реИред

рд╢реВрдиреНрдп рдХреЛ рд╣рдореЗрд╢рд╛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рдордп рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рд▓реВрдк рд▓реВрдк рди рд╣реЛ)ред

рдРрд╕рд╛ рдирд┐рд░реНрдорд╛рдг {<expr1>; ... <exprn>; } рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреА рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рдЕрдВрддрд┐рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ред

рдпрд╣рд╛рдВ рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ рдХрдХреНрд╖рд╛ рдФрд░ рдЙрд╕рдХреЗ рдкреВрд░реНрд╡рдЬреЛрдВ (рдЖрднрд╛рд╕реА рдХрд╛рд░реНрдпреЛрдВ) рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдХрд┐рд╕реА рднреА рдкреВрд░реНрд╡рдЬ рдореЗрдВ рдХрд╣реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ '@' рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЪрд┐рддреНрд░ 1 рдореЗрдВ рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдХрдХреНрд╖рд╛ рдИ рдореЗрдВ рдПрдХ рдлрдВрдХ () рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЕрдиреНрдп рд╕рднреА рд╡рдВрд╢рдЬ рдЗрд╕реЗ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдП рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдФрд░ рдХрдХреНрд╖рд╛ рдбреА рд╕реЗ рдлрдВрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
result <- (new A)@D.func() 

SELF_TYPE рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рдкрд░реНрдпрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕реНрд╡рдпрдВ рд╡рд░реНрддрдорд╛рди рд╡рд░реНрдЧ рдХрд╛ рд╕реВрдЪрдХ рд╣реИ (рдЕрд░реНрдерд╛рдд рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ)ред

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

рд╢реВрдиреНрдп - рд╢реВрдиреНрдп рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ, рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

ANTLRWorks рдореЗрдВ рдХреВрд▓ рд╡реНрдпрд╛рдХрд░рдг рд▓рд┐рдЦрдирд╛


рддреЛ, рдореВрд▓ рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 program ::= [[class; ]]+ class ::= class TYPE [inherits TYPE] { [[feature; ]]*} feature ::= ID( [ formal [[, formal]]*] ) : TYPE { expr } | ID : TYPE [ <- expr ] formal ::= ID : TYPE expr ::= ID <- expr | expr[@TYPE].ID( [ expr [[, expr]]*] ) | ID( [ expr [[, expr]]*] ) | if expr then expr else expr fi | while expr loop expr pool | { [[expr; ]] +} | let ID : TYPE [ <- expr ] [[, ID : TYPE [ <- expr ]]]* in expr | case expr of [[ID : TYPE => expr; ]]+ esac | new TYPE | isvoid expr | expr + expr | expr ? expr | expr ? expr | expr / expr | ~expr | expr < expr | expr <= expr | expr = expr | not expr | (expr) | ID | integer | string | true | false 


рдХрд┐рдВрд╡рджрдВрддреА: [[]] * - рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐; [[]] + рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реИ? рддреЛ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХреЗ рдФрд░ рд╕рдВрдХрд▓рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдУред рдХрд┐рд╕реЗ рдПрдХ рдФрд░ рдЕрдирд┐рд░реНрдгрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ?? рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рддреБрд░рдВрдд ANTLR рдореЗрдВ рдЗрд╕ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рд▓реЗрд╕рд░ рдФрд░ рдкрд╛рд░реНрд╕рд░ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдирд┐рдореНрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛:рд╣рдордиреЗ рдореИрдиреБрдЕрд▓ рдХреЛ рдЖрдЧреЗ рдкрдврд╝рд╛ред рдФрд░ рдлрд┐рд░ рдпрд╣ рд╕рд┐рд░реНрдл рд╕рдВрдЪрд╛рд▓рди рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╡реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд▓реЗрддреЗ рд╣реИрдВ (рд╢реАрд░реНрд╖ рдкрд░ - рдЙрдЪреНрдЪрддрдо, рдиреАрдЪреЗ - рд╕рдмрд╕реЗ рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдВ)редрдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдЕрдкрдирд╛ рд╡реНрдпрд╛рдХрд░рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рдг рдирд┐рдпрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ: рдирд┐рдЪрд▓реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдирдпрд╛ рдирд┐рдпрдо рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрд╛ рдСрдкрд░реЗрдЯрд░ рд╣реЛрдЧрд╛ рдФрд░ рджрд╛рдИрдВ рдУрд░ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдЯрд░реНрдорд┐рдирд▓ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЙрд▓рдЭрди рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдореВрд▓ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдирд┐рд░реНрдорд╛рдг рджреЗрдВ:
 expr: (ID ASSIGN^)* not; not: (NOT^)* relation; relation: addition ((LE^ | LT^ | GE^ | GT^ | EQUAL^) addition)*; addition: multiplication ((PLUS^ | MINUS^) multiplication)*; multiplication: isvoid ((MULT^ | DIV^) isvoid)*; isvoid: (ISVOID^)* neg; neg: (NEG^)* dot; dot: term ((ATSIGN typeName)? DOT ID LPAREN invokeExprs? RPAREN)? -> ^(Term term ID? typeName? invokeExprs?); 

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

рднрд╛рд╖рд╛ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╡рд░реНрдгреЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реЛрддреА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП, ANTLR рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
 {$channel = Hidden;}; 
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдо рдХреЗ рджрд╛рдИрдВ рдУрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 COMMENT : '--' .* ('\n'|'\r') {$channel = Hidden;}; 


ANTLR рдСрдкрд░реЗрдЯрд░реНрд╕


рдЖрдЧреЗ, рдореИрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП ANTLR рд╡рд┐рд╡рд░рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛:
  1. ! - рдЬрд░реВрд░рдд рд╣реИ рддрд╛рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рднрд╛рд╖рд╛ рдЯреЛрдХрди рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рди рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрд╖реНрдардХ рдФрд░ рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд░ рдЬреЛ рдХреЗрд╡рд▓ рдкрд╛рд░реНрд╕рд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╛рдИ, рдПрд╕рдПрд╕реА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рдПрдВрдбрд┐рдВрдЧ)ред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдЯреЛрдХрди рдХреА рдзрд╛рд░рд╛ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рди рдХрд┐ рдкрд╛рд░реНрд╕ рдЯреНрд░реА)ред
  2. -> - рдмрд╛рдИрдВ рдУрд░ рдЦрдбрд╝реЗ рдЯреЛрдХрди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рджрд╛рдИрдВ рдУрд░ рдЦрдбрд╝реЗ рдЯреЛрдХрди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рдХреЛрдб рдмрдирд╛рддреЗ рд╕рдордп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред рдЗрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ ^ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  3. ^ рдЗрд╕ рдСрдкрд░реЗрдЯрд░ рдФрд░ рдЙрд╕рдХреЗ рд╡рдВрд╢ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдЯреЛрдХрди рд╕реЗ рдЙрддреНрдкрдиреНрди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЯреНрд░реА рдореЗрдВ рдПрдХ рдирдпрд╛ рдиреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рджреЛ рд░реВрдк рд╣реИрдВ:
    • рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ рдирд┐рдпрдо рдХреЗ рд▓рд┐рдП:
       relation: addition ((LE^ | LT^ | GE^ | GT^ | EQUAL^) addition)*; 
      рдПрдХ рдиреЛрдб рдХреЛ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдЯреНрд░реА рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рдВрдЪрд╛рд▓рдХ рдХреЛ рдХреЛрд╖реНрдардХ рдФрд░ рдмрдЪреНрдЪреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ , рдЬреЛ рдСрдкрд░реЗрдЯрд░ рдХреЗ рджрд╛рдИрдВ рдУрд░ рд╣реЛрддрд╛ рд╣реИред
    • рдЙрдкрд╕рд░реНрдЧред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ рдирд┐рдпрдо рдХреЗ рд▓рд┐рдП:
       CLASS typeName (INHERITS typeName)? LCURLY featureList RCURLY -> ^(Class typeName featureList typeName?) 
      рдЯрд╛рдЗрдкрдиреЗрдо рдХреЗ рд╡рдВрд╢рдЬ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛ рдХреЗ рдореВрд▓ рдиреЛрдб рдХреЛ рдЯрд╛рдЗрдк рдХрд░реЗрдВред рдирд╛рдо рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ ?

рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд╕рднреА ANTLR рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдПрдХ рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдиреЗ рдЕрд╕рддрдд рдЧрдгрд┐рдд рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рд╣реИ), рдФрд░ рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЫреЛрдЯреЗ рд╡реНрдпрдХреНрддрд┐:
  1. * - Iterationред
  2. + - рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ред
  3. ? - рдмрд╛рдПрдВ рд╣рд╛рде рдХрд╛ рдЯреЛрдХрди рдпрд╛ рдЯреЛрдХрди рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдпрд╛ рддреЛ рдореМрдЬреВрдж рдпрд╛ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ '->' рдФрд░ '^' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдирдП рдЯреЛрдХрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕реА рдЦрдВрдб рдЯреЛрдХрди {} рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реИрд╕реЗ, рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВ рдХрд┐ .g рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд▓реЗрдХреНрд╕рд░ рдФрд░ рдкрд╛рд░реНрд╕рд░ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдХреЛрдб рд╢рд╛рдорд┐рд▓ рд╣реИ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, C # рдХреЗ рд▓рд┐рдП)ред рдлрд┐рд░ рднреА, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рдЕрднреА рднреА STRING рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ:

 STRING: '"' { StringBuilder b = new StringBuilder(); } ( '"' '"' { b.Append('"');} | c=~('"'|'\r'|'\n') { b.Append((char)c);} )* '"' { Text = b.ToString(); } ; 


рдпрд╣рд╛рдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рдХреБрд╢рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП StringBuilder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЗ рдЕрдиреНрдп рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ lexer рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред C # lexer рдФрд░ parser рдХреЛрдб рдореЗрдВ рдиреЗрдорд╕реНрдкреЗрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, System.Text)ред StringBuilder), рдирд┐рдореНрди рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреБрдЫ "рдЕрдирд╛рд╡рд╢реНрдпрдХ" рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБ рднреА рдпрд╣рд╛рдБ рдЕрдХреНрд╖рдо рд╣реИрдВ):

 @lexer::header {#pragma warning disable 3021 using System; using System.Text; } @parser::header {#pragma warning disable 3021 using System.Text;} 


рд╣рдордиреЗ ANTLRWorks рдореЗрдВ рд╡реНрдпрд╛рдХрд░рдг рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ C # lexer рдФрд░ parser рдХреЛрдб (рдзрдиреНрдпрд╡рд╛рдж, рдХреИрдк) рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

ANTLRWorks рджрд┐рдП рдЧрдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде 3 рдлрд╛рдЗрд▓реЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:

C # рдХреЛрдб рдореЗрдВ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рд▓реЗрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдЙрддреНрдкрдиреНрди C # рдХреЛрдб рдореЗрдВ рд╕рднреА рдЯреЛрдХрди рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рддреБрдЪреНрдЫ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ):
 var stream = new ANTLRStringStream(Source); // Source -  . lexer = new CoolGrammarLexer(stream, new RecognizerSharedState() { errorRecovery = true }); IToken token; token = lexer.NextToken(); while (token.Type != CoolGrammarLexer.EOF) { //    . //  : CoolTokens.Dictionary[token.Type] (  '('  LPAREN, //     ,      ) //  : token.Text (  '('   "(") //     : token.Line //       : token.Column token = lexer.NextToken(); //   ,   ,      . } //           0, //        (  ). lexer.Reset(); 

CoolTokens. retard рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
 var Lines = File.ReadAllLines(fileName); Dictionary = new Dictionary<int, string>(Lines.Length); foreach (var line in Lines) { var parts = line.Split('='); if (!Dictionary.ContainsKey(int.Parse(parts[1]))) Dictionary.Add(int.Parse(parts[1]), parts[0]); } 
fileName - CoolCompiler.tokens рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде

C # рдХреЛрдб рдореЗрдВ рдЙрддреНрдкрдиреНрди рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


 var tokenStream = new CommonTokenStream(lexer); //   lexer,   . parser = new CoolGrammarParser(tokenStream); Tree = parser.program(); //   ,     (.. program   ). 
рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдкреЗрдбрд╝ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, IList рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдирд┐рдореНрди рдЧреБрдгреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рднреА рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ C # рдореЗрдВ рдПрдХ рд╡реНрдпрд╛рдХрд░рдг рд╕реЗ рдХреЛрдб рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдВрд╢реЛрдзрдХ рдХреЛ рд╡реНрдпрд╛рдХрд░рдг рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдз (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдкрд╣рд▓реЗ) рдХреЗ рд╕рд╛рдордиреЗ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреЛрдб рд╕реЗ рдмрд╛рдж рдореЗрдВ рдХреЙрд▓ рдХрд░ рд╕рдХреЗрдВ (рдЕрдиреНрдпрдерд╛ рдпрд╣ рдирд┐рдЬреА рд╣реЛрдЧрд╛)

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


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ рдХрд┐ ANTLRWorks рдореЗрдВ рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рддрдм C # lexers рдФрд░ parsers рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ lexer рдФрд░ parser рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рдЕрдЧрд▓рд╛ рд▓реЗрдЦ рдЖрдкрдХреЛ рдПрдХ рднрд╛рд╖рд╛ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде (рдпрд╛рдиреА рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЪреЗрдХрд┐рдВрдЧ, рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдПрд░рд░ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ CIL рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕реА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП CIL рдХреЛрдб рдЬрдирд░реЗрдЯ рдХрд░реЗрдВ, рдХреИрд╕реЗ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╕реНрдЯреИрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ред .NET рдкреБрд╕реНрддрдХрд╛рд▓рдп System.Reflection.E рдХреЛрдб рдкреАрдврд╝реА рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдмреЗрд╢рдХ, рдореИрдВ рдЕрдкрдиреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдорд┐рд▓реЗ рдиреБрдХрд╕рд╛рдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдБрдЧрд╛ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, System.Reflection.Emit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рдирд╛)ред рдпрд╣ рднреА рд╡рд░реНрдгрди рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рд╕реБрдВрджрд░ рд╡реЙрд▓рдкреЗрдкрд░ рдХреЛ рдПрдХ рд╕реБрдВрджрд░ рдФрд░ рдЖрдзреБрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП! рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ рдЬреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдкрд░рд┐рдЪрдп рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдПрдХ рдкреНрд░рд╢реНрди рдкреВрдЫрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдмреНрд░реЛрд╕реЛрдХрд┐рд╕рд┐рдЯреА, рдЬрд┐рд╕рдХрд╛ рдЙрддреНрддрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдорд┐рд▓рд╛:

C # lexer рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╣рдореЗрд╢рд╛ NoViableAltException рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреЛрдб рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕ рдереНрд░реЛ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 catch (NoViableAltException nvae) { DebugRecognitionException(nvae); throw; } 
рдореИрдВ рдПрдХ рд╡реНрдпрд╛рдХрд░рдг рдлрд╝рд╛рдЗрд▓ рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рдереНрд░реЛ рди рд╣реЛ, рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдЕрдкрд╡рд╛рдж рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рд▓реЗрдХреНрд╕рд░ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ? рдФрд░ рдЖрдкрдХреЛ рд╣рд░ рдмрд╛рд░ C # рдХреЛрдб рдЬреЗрдирд░реЗрдЯ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рд╕рд╣реА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдиреЛрдЯ: ANTLR рдореЗрдВ @rulecatch рдХреЗ рд╕рд╛рде рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реБрдЖред

рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдП рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЙрддреНрддрд░ рд▓рд┐рдЦреЗред

рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА

рдХреВрд▓ рднрд╛рд╖рд╛ рдореИрдиреБрдЕрд▓, рдЗрд╕рдХрд╛ рд╡реНрдпрд╛рдХрд░рдг рдлрд╝рд╛рдЗрд▓ .g рдПрдХреНрд╕рдЯреЗрдВрд╢рди, ANTLRWorks рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд╕рд╛рде

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


All Articles