рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
- ANTLRWorks - рд╡реНрдпрд╛рдХрд░рдг рд╡рд┐рдХрд╛рд╕ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг
- ANTLR v3 - рд╕реНрд╡рдпрдВ ANTLR (рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг 3.2 рд╣реИ)
- рд╕реА # рд░рдирдЯрд╛рдЗрдо рдбрд┐рд╕реНрдЯреНрд░реАрдмреНрдпреВрд╢рди (Antlr3.Runtime.dll) - рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП .NET рд▓рд╛рдЗрдмреНрд░реЗрд░реА
- рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ - C # рдХреЛрдб рдХреЛ рдХрдВрдкрд╛рдЗрд▓ рдФрд░ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдиреНрдп рдЯреВрд▓
- рдЬрд╛рд╡рд╛ рд░рдирдЯрд╛рдЗрдо - рдЪреВрдВрдХрд┐ 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 ;
рдЬреЛ рд▓реЛрдЧ рднреВрд▓ рдЧрдП рд╣реИрдВ рдХрд┐ рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реИрдВ, рдЗрд╕ рдирд┐рдпрдо рдкрд░ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛
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 рдлрд╝рд╛рдЗрд▓ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рд╡рд╣рд╛рдВ рд╣рдо рддреАрди рдлрд╛рдЗрд▓реЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ:
- CalcLexer.cs - lexer рдХреЛрдб
- CalcParser.cs - рдкрд╛рд░реНрд╕рд░ рдХреЛрдб
- Calc.tokens - рдЯреЛрдХрди рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдлрд╝рд╛рдЗрд▓
рдкрд╛рд░реНрд╕рд░ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛ рдФрд░ рдЗрд╕рдореЗрдВ рджреЛ рдкреНрд░рд╛рдкреНрдд .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. рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА
- рдирд┐рд╢реНрдЪрд┐рдд ANTLR рд╕рдВрджрд░реНрдн, рдЯреЗрд░реЗрдВрд╕ Parr, 2007ред
рдЖрдИрдПрд╕рдмреАрдПрди -10: 0-9787392-5-6, рдЖрдИрдПрд╕рдмреАрдПрди -13: 978-09787392-4-9 - рд▓реИрдВрдЧреНрд╡реЗрдЬ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдкреИрдЯрд░реНрди, рдЯреЗрд░реЗрдВрд╕ рдкрд╛рд░реНрд░, 2010ред
рдЖрдИрдПрд╕рдмреАрдПрди -10: 1-934356-45-X, рдЖрдИрдПрд╕рдмреАрдПрди -13: 978-1-934356-45-6