рдЕрдВрдХрдЧрдгрд┐рдд рдХрд╛ рд╡реНрдпрд╛рдХрд░рдг рдпрд╛ ANTLR рдкрд░ рдПрдХ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рд▓рд┐рдЦреЗрдВ

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



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

  1. ANTLRWorks - рд╡реНрдпрд╛рдХрд░рдг рд╡рд┐рдХрд╛рд╕ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг
  2. ANTLR v3 - рд╕реНрд╡рдпрдВ ANTLR (рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг 3.2 рд╣реИ)
  3. рд╕реА # рд░рдирдЯрд╛рдЗрдо рдбрд┐рд╕реНрдЯреНрд░реАрдмреНрдпреВрд╢рди (Antlr3.Runtime.dll) - рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП .NET рд▓рд╛рдЗрдмреНрд░реЗрд░реА
  4. рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ - C # рдХреЛрдб рдХреЛ рдХрдВрдкрд╛рдЗрд▓ рдФрд░ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдиреНрдп рдЯреВрд▓
  5. рдЬрд╛рд╡рд╛ рд░рдирдЯрд╛рдЗрдо - рдЪреВрдВрдХрд┐ ANTLR рдФрд░ ANTLRWorks рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ


ANTLR рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдм рдХреБрдЫ, рдпрд╛рдиреА рдкрд╣рд▓реЗ рддреАрди рдмрд┐рдВрджреБ, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ http://www.antlr.org/download.html рд╕реЗ рдореБрдлреНрдд рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛рдиреА рдмрд┐рдирд╛ рдХреБрдЫ рд▓рд┐рдПред



рдЕрдм рдХреБрдЫ рд╢рдмреНрдж, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, ANTLR рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рд╣рдо рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ)ред ANTLR (рднрд╛рд╖рд╛ рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЙрдкрдХрд░рдг) рдПрдХ рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд▓рдХреНрд╖реНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ (C ++, Java, C #, рдкрд╛рдпрдерди, рд░реВрдмреА) рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдкрд╛рд░реНрд╕рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо (рдЬреИрд╕реЗ рдПрдХ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ) рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрд▓рдПрд▓ (*) рдХреЗ рд╡рд░реНрдгрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ - RBNF рдХреЗ рдХрд░реАрдм рдХреА рднрд╛рд╖рд╛ рдореЗрдВ рд╡реНрдпрд╛рдХрд░рдгред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓реЗрдЦрдХ рд╕реИрди рдлреНрд░рд╛рдВрд╕рд┐рд╕реНрдХреЛ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рд╕реЗ рдкреНрд░реЛрдлреЗрд╕рд░ рдЯреЗрд░реЗрдВрд╕ рдкрд╛рд░реНрд░ рд╣реИрдВред рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реИ рдФрд░ рдмреАрдПрд╕рдбреА рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рд╡рд┐рддрд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред



1. рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг



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



2. рд╡реНрдпрд╛рдХрд░рдг рд╡рд┐рдХрд╛рд╕



рдпрд╣ ANTLRWorks рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдФрд░ рд╣рдорд╛рд░реЗ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рд▓реЙрдиреНрдЪ рд╣реЛрдиреЗ рдкрд░, ANTLRWorks рдкреВрдЫреЗрдВрдЧреЗ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред "ANTLR 3 рд╡реНрдпрд╛рдХрд░рдг (* .g)" рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдВрдбреЛ рдореЗрдВ, рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рдирд╛рдо рджрд░реНрдЬ рдХрд░реЗрдВ (рдЗрд╕реЗ "рдХреИрд▓реНрдХ" рдХрд╣рддреЗ рд╣реИрдВ), рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд░реЗрдВ ("рд╕рдВрдпреБрдХреНрдд рд╡реНрдпрд╛рдХрд░рдг")ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╢рд╛рдмреНрджрд┐рдХ рдФрд░ рдкрд╛рд░реНрд╕рд░ рджреЛрдиреЛрдВ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдирд┐рдпрдо рд╣реЛрдВрдЧреЗред рдЖрдЧреЗ рдХреА рдЕрд╕рд╣рдорддрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╣рдо рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рд▓реЗрдХреНрд╕рд░ рдФрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдкрд╛рд░реНрд╕рд░ рдХрд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рдореЗрдВ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдиреЛрдЯреЗрд╢рди рдХреЛ рд╕рдордЭреЗрдВрдЧреЗред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд▓реЗрдХреНрд╕рд░ рдкрд╛рддреНрд░реЛрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рд╕реЗ рдЯреЛрдХрди (рдЯреЛрдХрди) рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ: рдкреВрд░реНрдгрд╛рдВрдХ, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рддрд╛рд░, рдЖрджрд┐, рдФрд░ рдкрд╛рд░реНрд╕рд░ рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдЯреЛрдХрди рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЯреЛрдХрди рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдореИрдВ рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╛рдпрд░ рдФрд░ рдЗрдВрдЯреЗрдЧрд░ рдХреЛ рдЯрд┐рдХ рдХрд░рдиреЗ рдХреА рднреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рд╣реЛрдВред рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:



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



рдЖрдЗрдП рдЕрдм INT рдирд┐рдпрдо рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рджреЗрдЦреЗрдВред ANTLR рдореЗрдВ '0' .. '9' + рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ INT рдЕрдВрдХреЛрдВ рдХрд╛ рдПрдХ рдЕрдиреБрдХреНрд░рдо рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЕрдВрдХ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдкреНрд░рддреАрдХ '+' рдХреЗ рдмрдЬрд╛рдп рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд┐рд╡реЛрд▓ '*' рдерд╛, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЕрдВрдХреЛрдВ рдХрд╛ рдХреНрд░рдо рдЦрд╛рд▓реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдИрдбреА рдирд┐рдпрдо рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдЖрдИрдбреА рд▓реЛрдЕрд░рдХреЗрд╕ рдФрд░ рдЕрдкрд░рдХреЗрд╕ рд▓реИрдЯрд┐рди рдЕрдХреНрд╖рд░реЛрдВ, рд╕рдВрдЦреНрдпрд╛рдУрдВ, рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдФрд░ рдЕрдХреНрд╖рд░ рдпрд╛ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдгреЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИред



рдареАрдХ рд╣реИ, рдЕрдм рд╣рдо рдкрд╛рд░реНрд╕рд░ рдХреЗ рд▓рд┐рдП рдпрд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдз рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд╣рд▓реЗ рдирд┐рдпрдо рдкрд░ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЕрд░реНрдерд╛рддреН , рд╡рд╣ рдирд┐рдпрдо рдЬрд╣рд╛рдВ рд╕реЗ рдкрд╛рд░реНрд╕рд░ рдЯреЛрдХрди рдХреА рдзрд╛рд░рд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП:

 calc	
	 : рдХрдерди +
	 ;


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

 рдХрдерди
	 : рдСрдирд▓рд╛рдЗрди рдирдпрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ
	 |  ID '=' expr NEWLINE
	 |  NEWLINE
	 ;


рдЬреЛ рд▓реЛрдЧ рднреВрд▓ рдЧрдП рд╣реИрдВ рдХрд┐ рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реИрдВ, рдЗрд╕ рдирд┐рдпрдо рдкрд░ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЬрд╛рдирд╡рд░ рд╣реИред рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рдЯреЛрдХрди рдЖрджреЗрд╢ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЕрд░реНрдерд╛рдд, рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд┐рд╕реА рднреА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди (expr) рд▓рд╛рдЗрди рдлреАрдб (NEWLINE) рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рдПрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрд╢рди рд▓рд╛рдЗрди рдлреАрдб рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рд▓рд╛рдЗрди рдлреАрдб рд╣реИред рд╣рд╛рдВ, рд╡реИрд╕реЗ, рдирдП рдСрдирд▓рд╛рдЗрди рдирд┐рдпрдо рдХреЛ рд▓реЗрд╕рд░ рдирд┐рдпрдореЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВ, рдЬрд┐рд╕реЗ рдореИрдВ рд╡реНрдпрд╛рдХрд░рдг рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рд░рдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ:

 NEWLINE: '\ r'?  '\ n'
	 ;


рд╕рдВрдХреЗрдд "?" рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡рд░реНрдг '\ r' рд╡рд╛рдХреНрдп рдореЗрдВ 1 рд╕рдордп рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред



рдЕрдм рдПрдХ рдирд┐рдпрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ:

 expr
	 : рдорд▓реНрдЯреА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди ('+' рдорд▓реНрдЯреА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди | '-' рдорд▓реНрдЯреА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди) *
	 ;


ANTLR рднрд╛рд╖рд╛ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ expr рдордирдорд╛рдирд╛ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд╕рд╛рде рд╢рдмреНрджреЛрдВ рдХрд╛ рдПрдХ рдордирдорд╛рдирд╛ рдЕрдиреБрдХреНрд░рдо рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд▓реНрдЯреА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди-рдорд▓реНрдЯреАрдПрдХреНрд╕рдкреНрд░реЗрд╢рди + рдорд▓реНрдЯреАрдПрдХреНрд╕рдкреНрд░реЗрд╢рди-рдорд▓реНрдЯреАрдПрдХреНрд╕рдкреНрд░реЗрд╢рди-рдорд▓реНрдЯреАрдПрдХреНрд╕рдкреНрд░реЗрд╢рди + рдорд▓реНрдЯреАрдПрдХреНрд╕рдкреНрд░реЗрд╢рдиред



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

 multExpression
	 : a1 = рдкрд░рдорд╛рдгреБ ('*' a2 = atom | '/' a2 = atom) *
	 ;
	
 рдкрд░рдорд╛рдгреБ
	 : рдЖрдИрдбреА
	 |  INT
	 |  '(' expr ')'
	 ;


рдпрджрд┐ рдЖрдк рдирд┐рдпрдореЛрдВ рдХреЛ рдПрдХ рд╡реНрдпрд╛рдХрд░рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдо рдХреЗ рд▓рд┐рдП ANTLRWorks рдПрдХ рдЧреНрд░рд╛рдл рдЦреАрдВрдЪрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЧреМрд░ рдХрд┐рдпрд╛ рд╣реИ? рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдЕрдм рдореБрдЭреЗ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдо рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:



рдпрд╣реАрдВ рдкрд░ рд╡реНрдпрд╛рдХрд░рдг рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд▓ рд╣реИ?



3. рдкрд╛рд░реНрд╕рд░ рдФрд░ рд▓реЗрд╕рд░ рдХреА рдЙрддреНрдкрддреНрддрд┐ рдФрд░ рдкреНрд░рдХреНрд╖реЗрдкрдг



рдЦреИрд░, рд╣рдордиреЗ рдПрдХ рд╡реНрдпрд╛рдХрд░рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рд╕реА # рдореЗрдВ рдПрдХ рдкрд╛рд░реНрд╕рд░ рдФрд░ рд▓реЗрдХреНрд╕рд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЪреВрдВрдХрд┐ ANTLRWorks рдЕрдзрд┐рдХ рдЬрд╛рд╡рд╛-рдЙрдиреНрдореБрдЦ рд╣реИ, рдЗрд╕рд▓рд┐рдП рджреГрд╢реНрдп рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдб рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ (рдореЗрд░реЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ) рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЙрд╕ рдкрд░ рдФрд░ рдмрд╛рдж рдореЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡реНрдпрд╛рдХрд░рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВред рд╡реНрдпрд╛рдХрд░рдг рдирд╛рдо рдХреЗ рд╕рд╛рде рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

 рд╡рд┐рдХрд▓реНрдк
 {
	 рднрд╛рд╖рд╛ = CSharp2;
 }
 @ рдЕрдкрд░ :: рдирд╛рдо рд╕реНрдерд╛рди {рдЙрддреНрдкрдиреНрди}
 @lexer :: рдирд╛рдо рд╕реНрдерд╛рди {рдЙрддреНрдкрдиреНрди}


рдпреЗ рдкрдВрдХреНрддрд┐рдпрд╛рдБ ANTLR рдХреЛ рдмрддрд╛рдПрдВрдЧреА рдХрд┐ рд╣рдо C # рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ parser рдФрд░ lexer рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрдВред рд╕рднреА, рдЖрдк рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ .bat рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 java -jar antlr-3.2.jar -o рдЙрддреНрдкрдиреНрди рдХреИрд▓рдЧрд░реА
 рдард╣рд░рд╛рд╡


рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ .bat рдлрд╝рд╛рдЗрд▓ antlr-3.2.jar рдФрд░ Calc.g рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣реИред

"-O" рд╕реНрд╡рд┐рдЪ рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рд▓рд┐рдП рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрддреНрдкрдиреНрди рдлрд╛рдЗрд▓реЗрдВ рдЭреВрда рд╣реЛрдВрдЧреАред рдард╣рд░рд╛рд╡ рдХреЗрд╡рд▓ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рддрд╛рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХреЗрдВред

рд╣рдо .bat рдлрд╝рд╛рдЗрд▓ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рд╡рд╣рд╛рдВ рд╣рдо рддреАрди рдлрд╛рдЗрд▓реЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ:



рдкрд╛рд░реНрд╕рд░ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛ рдФрд░ рдЗрд╕рдореЗрдВ рджреЛ рдкреНрд░рд╛рдкреНрдд .cs рдлрд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝реАрдВред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдирд╛рдорд╕реНрдерд╛рди рдХреЛ рдЬреЗрдирд░реЗрдЯреЗрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧ '' рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ C # рд░рдирдЯрд╛рдЗрдо рдбрд┐рд╕реНрдЯреНрд░реАрдмреНрдпреВрд╢рди (Antlr3.Runtime.dll рдлрд╝рд╛рдЗрд▓ рдХреЛ DOT-NET-runtime-3.1.1.zip рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ ANTLR рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рд╛рдЗрдЯ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛) рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рдореБрдЦреНрдп () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

 рдХреЛрд╢рд┐рд╢
 {
	 // рдЗрдирдкреБрдЯ рдХрдВрд╕реЛрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдгреЛрдВ рдХреА рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рд╕реЗрдЯ рдХрд░реЗрдВ
	 ANTLReaderStream рдЗрдирдкреБрдЯ = рдирдпрд╛ ANTLReaderStream (Console.In);
	 // рдЗрд╕ рдереНрд░реЗрдб рдкрд░ рд▓реЗрд╕рд░ рд╕реЗрдЯ рдХрд░реЗрдВ
	 CalcLexer lexer = рдирдпрд╛ CalcLexer (рдЗрдирдкреБрдЯ);
	 // рдПрдХ рд▓реЗрдХреНрд╕рд░-рдЖрдзрд╛рд░рд┐рдд рдЯреЛрдХрди рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдПрдВ
	 CommonTokenStream рдЯреЛрдХрди = рдирдпрд╛ CommonTokenStream (lexer);
	 // рдкрд╛рд░реНрд╕рд░ рдмрдирд╛рдПрдВ
	 CalcParser parser = рдирдпрд╛ CalcParser (рдЯреЛрдХрди);
	 // рдФрд░ рдкрд╣рд▓рд╛ рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдпрдо рдЪрд▓рд╛рдПрдВ !!!
	 parser.calc ();
 }
 рдкрдХрдбрд╝ (рдЕрдкрд╡рд╛рдж рдИ)
 {
	 Console.WriteLine (e.Message);
 }
 Console.ReadKey ();


рд╣реЛ рдЧрдпрд╛ !!! рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВред



рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд (EOF) рд╡рд░реНрдг рдХрд╛ рд╕рд╛рдордирд╛ рд╣реЛрдиреЗ рдкрд░ рдЗрдирдкреБрдЯ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЪрд░рд┐рддреНрд░ рдХреЛ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, CTRL + Z рджрдмрд╛рдПрдВред

рд╕рдм рдХреБрдЫ рд▓рдЧрднрдЧ рд╢рд╛рдирджрд╛рд░ рд╣реИред рдЖрдкрдиреЗ рд╢рд╛рдпрдж рджреЗрдЦрд╛ рдХрд┐ рд╕реНрдХреНрд░реАрди рдкрд░ рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд╡рд┐рдХрд╛рд░! рдХрд╖реНрдЯрдкреНрд░рдж рдЕрдкреВрд░реНрдгрддрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрднреА рддрдХ рдмрдВрдж ANTLRWorks рдирд╣реАрдВ?



4. рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдирд╛



рдордЬрд╝рд╛ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЖрд░рдВрдн рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдирд┐рдкреЗрдЯ рдЬреЛрдбрд╝рдХрд░ ANTLR рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

рд╡реНрдпрд╛рдХрд░рдг:

 @ рд╣реЗрджрд░ {
	 рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░;
	 System.Collections рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░;
 }

 @ рдореЗрдорд░реНрд╕ {
	 рд╣реИрд╢рдЯреЗрдмрд▓ рдореЗрдореЛрд░реА = рдирдпрд╛ рд╣реИрд╢рдЯреЗрдмрд▓ ();
 }


рдореИрдВ рд╕рдордЭрд╛ рджреВрдВрдЧрд╛ред @ рдореЗрдорд░реНрд╕ ANTLR рд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкрд╛рд░реНрд╕рд░ рдХреНрд▓рд╛рд╕ (рд╡реИрд░рд┐рдПрдмрд▓ рд╡реИрд▓реНрдпреВрдЬрд╝ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдореЗрдВ рдПрдХ рдирд┐рдЬреА рдореЗрдореЛрд░реА рдореЗрдВрдмрд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рд╣реЗрдбрд░ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╣реИрд╢рдЯреЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдиреЗрдорд╕реНрдкреЗрд╕ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЕрдм рдЖрдк рд╣рдорд╛рд░реЗ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ C # рдХреЛрдб рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдХрдерди рдирд┐рдпрдо рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

 рдХрдерди
	 : expr NEWLINE {Console.WriteLine ($ expr.value);  }
	 |  ID '=' expr NEWLINE {memory.Add ($ ID.text, $ expr.value);  }
	 |  NEWLINE
	 ;


рдХреЛрдб рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ {} рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИред рдпрджрд┐ рдХрдерди рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рддреЛ рд╣рдо рд╕реНрдХреНрд░реАрди рдкрд░ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рджреВрд╕рд░рд╛ - рддреЛ рд╣рдо рдЪрд░ рдирд╛рдо рдФрд░ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдп $ expr.value рдХрд╣рд╛рдВ рд╕реЗ рдЖрддрд╛ рд╣реИ? рдФрд░ рдЗрд╕реЗ рдпрд╣рд╛рдБ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 expr рд░рд┐рдЯрд░реНрди [int value]	
	 : me1 = рдорд▓реНрдЯреА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди {$ value = me1;}
	 ('+' me2 = рдорд▓реНрдЯреА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди {$ value + = $ me2.value;};
	 | '-' me2 = рдорд▓реНрдЯреА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди {$ value - = $ me2.value;}) *
	 ;


рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рд╣рдо рдПрдПрдирдЯреАрдПрд▓рдЖрд░ рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХреНтАНрд╕рдЖрд░ рдирд┐рдпрдо рдПрдХ рдорд╛рди рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░рдХрд╛рд░ рдЗрдВрдЯ рдХрд╛ рдорд╛рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреЛрдиреЛрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдореЗрдВ "$ expr.value" рдФрд░ "рд░рд┐рдЯрд░реНрди [int value]" рдореВрд▓реНрдп рд╕рдВрдпреЛрдЧ рд╕реЗ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 expr рд░рд┐рдЯрд░реНрди [int tratata]
 ...
	 ;


рдФрд░ рдлрд┐рд░ $ expr.value рдХреА рдУрд░ рдореБрдбрд╝реЗрдВ, рдлрд┐рд░ ANTLR рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдЧрд╛ред

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

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

рдЪрд░реНрдЪрд╛ рдХреА, рдЕрдм рдмрд┐рдВрджреБ рдХреЗ рдХрд░реАрдмред

рдПрдХреНрд╕рдкреНрд░ рдирд┐рдпрдо рдореЗрдВ, рджреЛ рд╡рд┐рдХрд▓реНрдк рдПрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ '|' | рдпрд╣ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЗ рднрд╛рдЧ 2 рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ expr рдлреЙрд░реНрдо рдХреЗ рд╡рд╛рдХреНрдп рд╣реИрдВ MultExpression-multExpression + multExpression-multExpression-multExpression + multExpressionред рдЕрдм рдХреЛрдб рдХреЛ рдШреБрдВрдШрд░рд╛рд▓реЗ рдХреЛрд╖реНрдардХ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдкрд╣рд▓реЗ рдкрдж рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░, рдСрдкрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдмрд╛рдж рдХреЗ рд╢рдмреНрджреЛрдВ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдпрд╛ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирд┐рдпрдо рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ

multExpression:

 рдорд▓реНрдЯреА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд░рд┐рдЯрд░реНрди [рдЗрдВрдЯ рд╡реИрд▓реНрдпреВ]
	 : a1 = рдкрд░рдорд╛рдгреБ {$ value = $ a1.value ;;
	 ('*' a2 = atom {$ value * = $ a2.value;)
	 | '/' a2 = рдкрд░рдорд╛рдгреБ {$ value / = $ a2.value;}) *
	 ;


рдкрд░рдорд╛рдгреБ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЕрдВрддрд┐рдо рдирд┐рдпрдо рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:

 рдкрд░рдорд╛рдгреБ рдкреНрд░рддрд┐рдлрд▓ [int value]
	 : ID {$ value = (int) рдореЗрдореЛрд░реА [$ ID.text] ;;
	 |  INT {$ рдореВрд▓реНрдп = int.Parse ($ INT.text) ;;
	 |  '(' expr ')' {$ value = $ expr.value ;;
	 ;


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

рдпрд╣ .bat рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд░реНрд╕рд░ рдФрд░ рд▓реЗрдХреНрд╕рд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореБрдЦреНрдп () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЛрдб рдХреЛ рднреА рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИред рд╣рдо рдЕрдкрдирд╛ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЦреЗрд▓рддреЗ рд╣реИрдВред





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





рдкрд╛рд░реНрд╕рд░ рдиреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдкрд░рд┐рдгрд╛рдо рдХреА рд╕рд╣реА рдЧрдгрдирд╛ рдХреАред рдЖрдк "2 ++ 3" рдЬреИрд╕реЗ рдХреБрдЫ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ 5 рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



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



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



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

  1. рдирд┐рд╢реНрдЪрд┐рдд ANTLR рд╕рдВрджрд░реНрдн, рдЯреЗрд░реЗрдВрд╕ Parr, 2007ред

    рдЖрдИрдПрд╕рдмреАрдПрди -10: 0-9787392-5-6, рдЖрдИрдПрд╕рдмреАрдПрди -13: 978-09787392-4-9
  2. рд▓реИрдВрдЧреНрд╡реЗрдЬ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдкреИрдЯрд░реНрди, рдЯреЗрд░реЗрдВрд╕ рдкрд╛рд░реНрд░, 2010ред

    рдЖрдИрдПрд╕рдмреАрдПрди -10: 1-934356-45-X, рдЖрдИрдПрд╕рдмреАрдПрди -13: 978-1-934356-45-6



All Articles