рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдореИрдВ рддрдм рднреА рдПрдХ рд╕реНрдХреВрд▓реА рдЫрд╛рддреНрд░ рдерд╛ рдЬрдм рдореИрдВ рдкрдмреНрд▓рд┐рд╢рд┐рдВрдЧ рд╣рд╛рдЙрд╕ рдбрд╛рдпрд▓реЙрдЧ MEPhI рдХреА рдХрд┐рддрд╛рдм "рдмрд┐рдЧрд┐рдирд░ рдХреЛрд░реНрд╕ рд╕реА рдПрдВрдб рд╕реА ++" рдХреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рдкрдбрд╝ рдЧрдпрд╛ред рдпрд╣ рдЗрд╕ рдкреБрд╕реНрддрдХ рд╕реЗ рдерд╛ рдЬреЛ рдореИрдВрдиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдореВрд▓ рдмрд╛рддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛ рдерд╛, рдФрд░ рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рднреА рдЙрддреНрдкрдиреНрди рдХреА, рдЬрд┐рд╕реЗ рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред рдЗрд╕рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд░рдо рдерд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдбрд┐рд╕реЗрдВрдЯ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╕рд╛рде рдпрд╣ рдореЗрд░реА рдкрд╣рд▓реА рдореБрдарднреЗрдбрд╝ рдереАред рдореБрдЭреЗ рдЕрднреА рднреА рдЙрди рд▓рдВрдмреЗ рдШрдВрдЯреЛрдВ рдХреЛ рдпрд╛рдж рд╣реИ рдЬреЛ рдЗрд╕ рдХреЛрдб рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рдереЗред

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

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

рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмреЗрдХрд╕-рдиреМрд░ рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ

рдИ -> рдЯреА + рдИ | рдЯреА - рдИ | рдЯреА
рдЯреА -> рдПрдл * рдЯреА | рдПрдл / рдЯреА | рдПрдл
рдПрдл -> рдПрди | (рдЗ)

рдпрд╣рд╛рдБ рд╡рд░реНрдЯрд┐рдХрд▓ рдмрд╛рд░ рд╣реИ "|" рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЕрд░реНрде рд╣реИ "рдпрд╛", рдФрд░ рдИ, рдЯреА, рдПрдл, рдПрди - рдЗрди рд╡рд╛рдХреНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧреАред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрди рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

рдкрд╣рд▓реЗ рд╡рд╛рдХреНрдп рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдИ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдЯрд╛рдЗрдк рдЯреА рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЯрд╛рдЗрдк рдИ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдпрд╛ рдЯрд╛рдЗрдк рдИ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдИ рдпрд╛ рдмрд╕ рдЯрд╛рдЗрдк рдЯреА рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИред

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

рддреАрд╕рд░реЗ рд╡рд╛рдХреНрдп рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдПрдл рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдпрд╛ рддреЛ рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдпрд╛ рдХреЛрд╖реНрдардХ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдИ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИред

рдЖрдЗрдП рдЗрди рддреАрдиреЛрдВ рд╡рд╛рдХреНрдпреЛрдВ рдХреЛ рдПрдХ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

2 + 3 * (4 - 5) + 6 - 7

рд╣рдо рдкрд╣рд▓реЗ рд╡рд╛рдХреНрдп рдХреЛ рдХрдИ рдмрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ

рдИ (2 + 3 * (4-5) + 6-7) -> 
рдЯреА (2) + рдИ (3 * (4-5) + 6-7) -> 
рдЯреА (2) + рдЯреА (3 * (4-5)) + рдИ (6-7) -> 
T (2) + T (3 * (4-5)) + T (6) - T (7)

рдЕрдм рд╣рдорд╛рд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдХреЗрд╡рд▓ T рдЯрд╛рдЗрдк рдХреЗ рд╕рдмрдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рд╡рд╛рдХреНрдп рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

T (2) -> F (2)
T (3 * (4-5)) -> F (3) * T ((4-5)) -> F (3) * F ((4-5))
рдЯреА (6) -> рдПрдл (6)
T (7) -> F (7)

рдпрд╣ рддреАрд╕рд░реЗ рд╡рд╛рдХреНрдп рдХрд╛ рд╕рдордп рд╣реИ

рдПрдл (2) -> рдПрди (2) -> 2
рдПрдл (3) -> рдПрди (3) -> 3
рдПрдл (4-5)) -> рдИ (4-5)
рдПрдл (6) -> рдПрди (6) -> 6
рдПрдл (7) -> рдПрди (7) -> 7

рдХреЛрд╖реНрдардХ (4-5) рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╡рд╛рдХреНрдп рдХреЛ рдкреБрдирд░реНрд╕рдВрд░рдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдФрд░ рд╢реЗрд╖ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рдерд╛, рдЙрд╕рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рд╕рднреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб рдмреНрд░реИрдХреЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдРрд╕реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕рдВрдХреНрд░рдордг рдЕрдзрд┐рдХ рд╣реЛрдВрдЧреЗред рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ рдХрд┐ рдЖрдк рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╕рднреА рддреАрди рд╡рд╛рдХреНрдпреЛрдВ рдХреЛ рдПрдХ рдРрд╕реЗ рднрд╛рд╡ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдХреЛрд╖реНрдардХ рдХреЗ рд╕реНрддрд░ рдирд┐рд╣рд┐рдд рд╣реЛрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 2 + 2 * (3 + 4 * (5-6)), рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

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

рдпрджрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╡рд╛рдХреНрдп рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ

рдИ -> рдЯреА ┬▒ рдЯреА ┬▒ рдЯреА> рдЯреА ┬▒ ...ред рдЯреА

рджреВрд╕рд░реЗ рд╡рд╛рдХреНрдп рдХреЛ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЯреА -> рдПрдл * / рдПрдл * / рдПрдл * / * / ... * / рдПрдл

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдпрд╣рд╛рдВ рдПрдХ рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реА рддрд░рд╣, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рддреАрд╕рд░реЗ рд╡рд╛рдХреНрдп рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

String[] tokens = {"2", "+", "3", "*", "(", "4", "-", "5", ")", "+", "6", "-", "7"};

рдЕрдЧрд▓рд╛ рдкрд╛рд░реНрд╕рд░ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреА

  • рдкрд╛рд░реНрд╕ () рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ
  • рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ () рдкреНрд░рдХрд╛рд░ рдИ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП
  • рдЯреА рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╢рдмреНрдж ()
  • рдПрдл рдФрд░ рдПрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рд░рдХ ()

public class RecursiveDescentParser {

    private final String[] tokens;
    private int pos = 0; //   

    public RecursiveDescentParser(String[] tokens) {
        this.tokens = tokens;
    }

    public Double parse() {
        Double result = expression();
        if (pos != tokens.length) {
            throw new IllegalStateException("Error in expression at " + tokens[pos]));
        }
        return result;
    }

    // E -> T┬▒T┬▒T┬▒T┬▒ ... ┬▒T
    private Double expression() {
        //   
        Double first = term();

        while (pos < tokens.length) {
            String operator = tokens[pos];
            if (!operator.equals("+") && !operator.equals("-")) {
                break;
            } else {
                pos++;
            }

            //    ()
            Double second = term();
            if (operator.equals("+")) {
                first += second;
            } else {
                first -= second;
            }
        }
        return first;
    }

    // T -> F*/F*/F*/*/ ... */F
    private Double term() {
        //   
        Double first = factor();

        while (pos < tokens.length) {
            String operator = tokens[pos];
            if (!operator.equals("*") && !operator.equals("/")) {
                break;
            } else {
                pos++;
            }

            //    ()
            Double second = factor();
            if (operator.equals("*")) {
                first *= second;
            } else {
                first /= second;
            }
        }
        return first;
    }
    
    // F -> N | (E)
    private Double factor() {
        String next = tokens[pos];
        Double result;
        if (next.equals("(")) {
            pos++;
            //    ,        
            result = expression();  
            String closingBracket;
            if (pos < tokens.length) {
                closingBracket = tokens[pos];
            } else {
                throw new IllegalStateException("Unexpected end of expression");
            }
            if (pos < tokens.length && closingBracket.equals(")")) {
                pos++;
                return result;
            }
            throw new IllegalStateException("')' expected but " + closingBracket);
        }
        pos++;
        //       
        return Double.parseDouble(next);
    }
}

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

All Articles