рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ "рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдмрдирд╛рдирд╛" рдХреЗ рдЕрдзреНрдпрд╛рдп 2 рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдореЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐
рдЕрдзреНрдпрд╛рдп 1 рдореЗрдВ рдмрдирд╛рдП рдЧрдП рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рд╣рдо рдЕрдкрдиреА рдХрд▓реАрд╕рд┐рдпрд╛ рдХреА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг
рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░
рд╕рдХреЗрдВ ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╛рд░реНрд╕рд░ рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо
рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА (рдПрдПрд╕рдЯреА) (рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА) рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред
рд╣рдо рдХреИрд▓реАрдбреЛрд╕реНрдХреЛрдк рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд░реНрд╕рд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗ
рдЬреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░
рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдкреНрд░рдзрд╛рдирддрд╛ рдХреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ (рдмрд╛рдЗрдирд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдФрд░ рдмрд╛рдХреА рд╕рдм рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА)ред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЦреБрдж рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рд▓реЗрдВ, рдЪрд▓рд┐рдП рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛: рд╕рд╛рд░ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдЯреНрд░реАред
рд╕рд╛рд░ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдЯреНрд░реА (рдПрдПрд╕рдЯреА)
рдПрдПрд╕рдЯреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдмрд╛рдж рдХреЗ рдЪрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдкреАрдврд╝реА) рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╕реНрддреБ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмрд╣реБрд░реВрдкрджрд░реНрд╢рдХ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднрд╛рд╡, рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдФрд░ рдХрд╛рд░реНрдп рд╣реИрдВред рдЖрдЗрдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ:
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдПрдХреНрд╕рдкреНрд░реИрд╕реНрдЯ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдФрд░ рдЙрд╕рдХреЗ рдЙрдкрд╡рд░реНрдЧ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред
рдЕрдм рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдпреЛрдЧреА рддрд░реАрдХреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХреЗрд╡рд▓ рдПрдПрд╕рдЯреА рдмрдирд╛рдПрдВрдЧреЗред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрд╡рд░реВрдкрд┐рдд рдХреЛрдб рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрднрд╛рд╕реА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред рдпрд╣рд╛рдБ рдЕрдиреНрдп рдПрдПрд╕рдЯреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдиреЛрдб рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рджреА рдЧрдИ рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдХреИрд▓рд┐рдбреЛрд╕реНрдХреЛрдк рдореЗрдВ рдХрд░реЗрдВрдЧреЗ:
рдпрд╣ рд╕рд░рд▓ рд╣реИ: рдПрдХ рдЪрд░ рдореЗрдВ рдПрдХ рдЪрд░ рдирд╛рдо рд╣реЛрддрд╛ рд╣реИ, рдПрдХ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдореЗрдВ рдЕрдкрдирд╛ рдУрдкрдХреЛрдб (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, '+') рдФрд░ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рднрд╛рд╡ (рдПрдПрд╕рдЯреА рдиреЛрдбреНрд╕) рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдФрд░ рд╕рднреА рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрддреА рд╣реИред рдПрдПрд╕рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдорд╣рд╛рди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░реНрд╕, рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╕рдВрд░рдЪрдирд╛, рдЖрджрд┐ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдореБрджреНрджреЗ рдирд╣реАрдВ рд╣реИрдВред
рд╣рдордиреЗ рдЕрдкрдиреА рднрд╛рд╖рд╛ рдХреЗ рднрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдиреЛрдбреНрд╕ рдХреА рдкрд╣рдЪрд╛рди рдХреА рд╣реИред рдпрд╣ рдЯреНрдпреВрд░рд┐рдВрдЧ-рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╕рд╢рд░реНрдд рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдареАрдХ рдХрд░ рджреЗрдВрдЧреЗред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдЪреАрдЬреЗрдВ рдЬреЛ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рд╡реЗ рдлрд╝рдВрдХреНрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡рдпрдВ рд╣реИрдВ:
рдмрд╣реБрд░реВрдкрджрд░реНрд╢рдХ рдореЗрдВ, рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЙрдирдХреЗ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╣реА рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдБрдХрд┐ рд╕рднреА рдорд╛рди рджреЛрд╣рд░реЗ рд╕рдЯреАрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рддрд░реНрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрд╣реАрдВ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ, ExprAST рд╡рд░реНрдЧ рдореЗрдВ рд╕рдВрднрд╡рддрдГ рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдлрд╝реАрд▓реНрдб рд╣реЛрдЧрд╛ред
рдЕрдм рд╣рдо рдЕрдВрдд рдореЗрдВ рдмрд╣реБрд░реВрдкрджрд░реНрд╢рдХ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд╛рд░реНрд╕рд░ рдЖрдзрд╛рд░
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдПрд╕рдЯреА рддрддреНрд╡ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рдкрд╛рд░реНрд╕рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдБ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдПрдХреНрд╕ рдореЗрдВ "x + y" (рдЬреЛ рдХрд┐ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рддреАрди рдЯреЛрдХрди рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ) рдЬреИрд╕реЗ рдХреБрдЫ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
ExprAST *X = new VariableExprAST("x"); ExprAST *Y = new VariableExprAST("y"); ExprAST *Result = new BinaryExprAST('+', X, Y);
рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХрдИ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ:
рдпрд╣ рдХреЛрдб рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЯреЛрдХрди рдмрдлрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдПрдХ рдЯреЛрдХрди рдкрд░ рдЖрдЧреЗ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧрд╛ рдХрд┐ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд░реНрдЯреЛрдХ рд╡рд░реНрддрдорд╛рди рдЯреЛрдХрди рд╣реИред
рдпреЗ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд░реНрд╕рд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕реБрдзрд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред
рдЗрди рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдо рдЕрдкрдиреЗ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╢рд╛рдмреНрджрд┐рдХред
рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕
рдЪрд▓реЛ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдпрдо рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдирд┐рдпрдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИред рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╢рд╛рдмреНрджрд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕:
рдлрд╝рдВрдХреНрд╢рди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдЬрдм рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЯреЛрдХрди tok_number рд╣реИред рдпрд╣ рдПрдХ
NumberExprAST рдиреЛрдб рдмрдирд╛рддрд╛ рд╣реИ, рдпрд╣ рд╡рд░реНрддрдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рдЕрдЧрд▓реЗ рдЯреЛрдХрди рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдмрдирд╛рдП рдЧрдП рдиреЛрдб рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред
рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдкрд╣рд▓реВ рд╣реИрдВред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рдЯреЛрдХрди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдирд┐рдпрдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдЕрдЧрд▓реЗ рдЯреЛрдХрди (рдЬреЛ рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдпрдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ) рдХреЗ рд╕рд╛рде рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдмрдлрд░ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд╛ рдорд╛рдирдХ рддрд░реАрдХрд╛ рд╣реИред рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрд╖реНрдардХреЛрдВ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд░реНрд╕рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рддреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:
- рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рдЬрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЯреЛрдХрди рдХрд╛ рдЪрд┐рд╣реНрди рд╣реИ '(', рд▓реЗрдХрд┐рди рдЙрдкрд╕рдВрдЪрд╛рдИ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреЛрдИ рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ ')'ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "(4)" рдХреЗ рдмрдЬрд╛рдп "(4 x") рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рдРрд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдкрд╛рд░реНрд╕рд░ рдХреЛ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗ рд╣реБрдП: рд╣рдорд╛рд░реЗ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЕрд╢рдХреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
- рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдкрд╣рд▓реВ ParseExpression рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ (рд╣рдо рдЬрд▓реНрдж рд╣реА рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ ParseExpression ParseParenExpr рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдпрд╣ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рддрдВрддреНрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдореЗрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡реНрдпрд╛рдХрд░рдгреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдРрд╕реЗ рд╡реНрдпрд╛рдХрд░рдгреЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рдирд┐рдпрдо рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреЛрд╖реНрдардХ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдПрдПрд╕рдЯреА рдиреЛрдб рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрд╖реНрдардХреЛрдВ рдХреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд╕рдореВрд╣ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИред рдЬрдм рдкрд╛рд░реНрд╕рд░ рдПрдПрд╕рдЯреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреЛрд╖реНрдардХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд░рд╣ рдЬрд╛рддреА рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдпрдо рдЪрд░ рд╕рдВрджрд░реНрдн рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рд╕рдВрднрд╛рд▓ рд░рд╣реЗ рд╣реИрдВ:
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред (рдЬрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЯреЛрдХрди tok_identifier рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ)ред рдЗрд╕рдореЗрдВ рд░рд┐рдХрд░реНрд╕рди рдФрд░ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдЖрдЧреЗ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдПрдХ рдЪрд░ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИред рдпрд╣ рдПрдХ рдЬрд╛рдВрдЪ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЯреЛрдХрди рдПрдХ рдЪрд┐рдиреНрд╣ рд╣реИ '(', рдпрд╛ рддреЛ
VariableExprAST рдпрд╛
CallExprAST рдХрд╣рддрд╛ рд╣реИ ред
рдЕрдм рдЬрдмрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд░рд▓рддрдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рддрд░реНрдХ рд╣реИрдВ, рд╣рдо рдЗрд╕реЗ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд░реНрдЧ рдХреЛ "рдкреНрд░рд╛рдердорд┐рдХ" (рдкреНрд░рд╛рдердорд┐рдХ) рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдХрд╣реЗрдВрдЧреЗ
рдЬреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдПрдХ рдордирдорд╛рдиреА рдкреНрд░рд╛рдердорд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ:
рдЕрдм рдЬрдм рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рдорд╛рдиреНрдп рдХрд░реНрдЯреЛрдХ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдХреНрдпреЛрдВ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдЧреЗ рджреЗрдЦрдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЗрд╕реА рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рдЬрдм рдореВрд▓ рднрд╛рд╡реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдмрд╛рдЗрдирд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИрдВред
рдмрд╛рдЗрдирд░реА рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ рдкрд╛рд░реНрд╕рд┐рдВрдЧ
рдмрд╛рдЗрдирд░реА рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдард┐рди рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрдХреНрд╕рд░ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреНрд░рд┐рдВрдЧ "x + y * z" рдХреЗ рд▓рд┐рдП, рдкрд╛рд░реНрд╕рд░ рдпрд╛ рддреЛ "x (y + y) * z" рдпрд╛ "x + (y * z)" рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЧрдгрд┐рдд рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ "*" (рдЧреБрдгрд╛) рдореЗрдВ "+" (рдЬреЛрдбрд╝) рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред
рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рд╕реБрдВрджрд░ рдФрд░ рдХреБрд╢рд▓ рддрд░реАрдХрд╛
рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдкреНрд░рдзрд╛рдирддрд╛ рдХреЛ
рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╣реИ ред рдпрд╣ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рддрдХрдиреАрдХ рдСрдкрд░реЗрд╢рди рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдПрдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рддрд╛рд▓рд┐рдХрд╛ рдЪрд╛рд╣рд┐рдП:
рдмрд╣реБрд░реВрдкрджрд░реНрд╢рдХ рдХреЗрд╡рд▓ 4 рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ (рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдмрд╣рд╛рджреБрд░ рдФрд░ рдирд┐рдбрд░ рдкрд╛рдардХ рджреНрд╡рд╛рд░рд╛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред
GetTokPrecedence рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рдЯреЛрдХрди рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрддрд╛ рд╣реИ, рдпрд╛ -1 рдпрджрд┐ рдЯреЛрдХрди рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИред рдРрд╕реА рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдирдП рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреА рд╣реИ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдкрд░реЗрдЯрд░реЛрдВ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИред рдЖрдк рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░
GetTokPrecedence рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм рд╣рдо рдмрд╛рдЗрдирд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдкреНрд░рдзрд╛рдирддрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ "a + b + (c + d) * e * f + g"ред рдСрдкрд░реЗрдЯрд░ рдкреВрд░реНрд╡рддрд╛ рдкрд╛рд░реНрд╕рд░ рдЗрд╕реЗ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдкреНрд░рд╛рдердорд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рд╛рдердорд┐рдХ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди, рдкреНрд░рдореБрдЦ рдкреНрд░рд╛рдердорд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ "a" рдкрд╣рд▓реЗ рдкрд╛рд░реНрд╕ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдпрд╣ рдЬреЛрдбрд╝реЗ рдХреЛ рджреЗрдЦреЗрдЧреА [+, b] [+, (c + d)] [*, ] [*, f] рдФрд░ [+, g ]ред рдХреЛрд╖реНрдардХ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: рдкрд╛рд░реНрд╕рд░ рдХреЛ рдиреЗрд╕реНрдЯреЗрдб рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреИрд╕реЗ (рд╕реА + рдбреА)ред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рдкреНрд░рд╛рдердорд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ [рдмрд┐рдиреЙрдк, рдкреНрд░рд╛рдЗрдорд░реЗрдХреНрд╕рдкреНрд░] рдЬреЛрдбрд╝реЗ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдмрд╛рдж:
ParseBinOpRHS рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЬреЛрдбрд╝реЗ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╡рд░реНрддреАрддрд╛ рдФрд░ рдПрдХ рд╕рдВрдХреЗрддрдХ рд▓реЗрддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ "x" рдПрдХ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрдз рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ: рдЗрд╕ рдкреНрд░рдХрд╛рд░, "рдмрд┐рдиреЛрдкреНрд░рд┐рд╣рд╕" рдЦрд╛рд▓реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдЙрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдКрдкрд░ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреЛрдб
ParseBinOpRHS рдХреЗ рд▓рд┐рдП "рдП" рдФрд░ рд╡рд░реНрддрдорд╛рди рдЯреЛрдХрди "+" рдХреА
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЙрддреНрддреАрд░реНрдг рдХрд░рддрд╛ рд╣реИ ред
ParseBinOpRHS рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдореВрд▓реНрдп рдЗрд╕рдХреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ
рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА
рдиреНрдпреВрдирддрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдзрд╛рд░рд╛ [+, x] рдФрд░ ParseBinOpRHS рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЬреЛрдбрд╝реА рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ 40 рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдпрд╣ рдЯреЛрдХрди рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧреА (рдЪреВрдВрдХрд┐ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ "+" рдХреЗрд╡рд▓ 20 рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, ParseBinOpRHS рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:
рдпрд╣ рдХреЛрдб рд╡рд░реНрддрдорд╛рди рдЯреЛрдХрди рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдХрдо рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдЯреЛрдХрди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ -1 рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЕрдорд╛рдиреНрдп рд╣реИ, рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЬрд╛рдВрдЪ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдЬреЛрдбрд╝реЗ рдХреА рдзрд╛рд░рд╛ рдХрдм рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдпрд╣ рдЪреЗрдХ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЯреЛрдХрди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдСрдкрд░реЗрдЯрд░ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдХреЛрдб рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИ), рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдкреНрд░рд╛рдердорд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЬреЛрдбрд╝реЗ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкрд╣рд▓рд╛ [+, рдмреА] рд╣реЛрдЧрд╛ред
рдЕрдм рдЬрдм рд╣рдордиреЗ рдЖрд░рдПрдЪрдПрд╕ рдЕрдиреБрдХреНрд░рдо рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдФрд░ рдПрдХ рдЬреЛрдбрд╝реА рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдХреИрд╕реЗ рдмрд╛рдВрдзреЗрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдо рджреЛрдиреЛрдВ "(рдП + рдмреА) рдмрд┐рдиреЛрдк рдЕрдирдкрд░реНрд╕рдб" рдФрд░ "рдП + (рдмреА рдмрд┐рдиреЙрдк рдЕрдирд╕реНрдкрд╛рд░реНрд╕реНрдб)" рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЬрд╣рд╛рдВ рдмрд┐рдиреЙрдк рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдСрдкрд░реЗрдЯрд░ рд╣реИ, рдЕрдирдкрд░реНрд╕рдб рдЕрдирд╕реИрдмреНрдб рдкрд╛рд░реНрдЯ рд╣реИ)ред рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ тАЬрдмрд┐рдиреЙрдктАЭ (рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░) рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдмрд┐рдирдСрдк рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ (рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ "+" рд╣реИ):
рдпрджрд┐ "рдЖрд░рдПрдЪрдПрд╕" рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣рдорд╛рд░реЗ рд╡рд░реНрддрдорд╛рди рдСрдкрд░реЗрдЯрд░ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕реЗ рдХрдо рдпрд╛ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдорд╛рдорд▓рд╛ рд╣реИ ("рдП + рдмреА) рдмрд┐рдиреЙрдк ..."ред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╡рд░реНрддрдорд╛рди "+" рдСрдкрд░реЗрдЯрд░ рдФрд░ рдЕрдЧрд▓реЗ "+" рдСрдкрд░реЗрдЯрд░ рдХреА рд╕рдорд╛рди рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо тАЬa + bтАЭ рдХреЗ рд▓рд┐рдП AST рдиреЛрдб рдмрдирд╛рдПрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗ:
... ... }
рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, "a + b +" рдХреЛ "(a + b)" рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд▓реВрдк рдХреЗ рдЕрдЧрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ "+" рдХреЗ рд╕рд╛рде рдЪрд╛рд▓реВ рдЯреЛрдХрди рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рднрд╛рдЧ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрдЧреЗ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, "(c + d)" рдХреЛ рдкреНрд░рд╛рдердорд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рдд, рд╡рд░реНрддрдорд╛рди рдЬреЛрдбрд╝реА [+, (c + d)] рд╣реЛрдЧреАред рддрдм рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ "*" рдХреЗ рд╕рд╛рде рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреАред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рд╛рдердорд┐рдХрддрд╛ "*" рдкреНрд░рд╛рдердорд┐рдХрддрд╛ "+" рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддрд╛рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рд╢рд░реНрдд рдирд┐рд░реНрдорд╛рдг рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдмрд╛рдИрдВ рдУрд░ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ "рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рджрд╛рдИрдВ рдУрд░ рдХреЛ рдХреИрд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП"? рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдПрдПрд╕рдЯреА рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдЖрд░рдПрдЪрдПрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реНрдг рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ "(рд╕реА + рдбреА) * рдИ * рдПрдл" рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рд╕рд░рд▓ рд╣реИ (рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рджреЛ рдЙрдкрд░реЛрдХреНрдд рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдХреЛрдб рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реИ):
RHS = ParseBinOpRHS(TokPrec+1, RHS); if (RHS == 0) return 0;
}
рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рдкреНрд░рд╛рдердорд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рджрд╛рдИрдВ рдУрд░ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреА рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ "+" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рдХреЗ рдХрд┐рд╕реА рднреА рдЕрдиреБрдХреНрд░рдо рдХреЛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ "RHS" рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо ParseBinOpRHS рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ "TokPrec + 1" рдХреЗ рд╕рд╛рде рдиреНрдпреВрдирддрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкреАрдбрд╝рд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рдЖрд░рдЯреАрдПрдЪ рдХреЗ рд░реВрдк рдореЗрдВ "(рд╕реА + рдбреА) * рдИ * рдПрдл" рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдПрд╕рдЯреА рдиреЛрдб рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛, рдЬреЛ рддрдм '+' рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдкрдХреНрд╖ рдмрди рдЬрд╛рддрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ, рдЬрдмрдХрд┐ рд▓реВрдк рдХреЗ рдЕрдЧрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ, + рдЬреА рднрд╛рдЧ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдПрд╕рдЯреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдб (14 рд▓рд╛рдЗрдиреЛрдВ) рдХреЗ рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рдЯреБрдХрдбрд╝реЗ рдХреА рдорджрдж рд╕реЗ, рд╣рдо рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдХреЛрдб рдХрд╛ рд╕рд┐рд░реНрдл рдПрдХ рддреНрд╡рд░рд┐рдд рдЕрд╡рд▓реЛрдХрди рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рдЯреЛрдХрди рдХреА рдПрдХ рдордирдорд╛рдиреА рдзрд╛рд░рд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд╕реЗ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рдЯреЛрдХрди рдкрд░ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЕрдм рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛рдУрдВ рдЖрджрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдмрд╛рдХреА рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛
рдЕрдЧрд▓реА рдЪреАрдЬрд╝ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ рд╡рд╣ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд░рд╣реА рд╣реИред рдмрд╣реБрд░реВрдкрджрд░реНрд╢рдХ рдореЗрдВ, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рд╣рд░реА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╢рд░реАрд░ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рдЗрд╕ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╕реАрдзрд╛ рдФрд░ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ (рдЬрдм рдЖрдк рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╕реЗ рдмрдЪ рдЧрдП):
рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд╛рджрдЧреА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк + рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧреА:
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ "рдкрд╛рдк" рдФрд░ "рдХреЙрд╕" рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдмрд╛рд╣рд░реА" рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдордпрдкреВрд░реНрд╡ рдШреЛрд╖рдгрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреАред 'рдмрд╛рд╣рд░реА' рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╢рд░реАрд░ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛:
рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдордХреНрдЦреА рдкрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП рдЕрдирд╛рдо рдЕрд╢рдХреНрдд (рддрд░реНрдХ рдХреЗ рдмрд┐рдирд╛) рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВрдЧреЗ:
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рднрд╛рдЧ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рдЫреЛрдЯрд╛ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╕рднреА рдХреЛрдб рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ!
рдкреНрд░рдмрдВрдзрди рдХрд╛рд░реНрдпрдХреНрд░рдо
рдирд┐рдпрдВрддреНрд░рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗрд╡рд▓ рдЪрдХреНрд░реАрдп рд░реВрдк рд╕реЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд╣рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ, рдиреАрдЪреЗ рдкреВрд░реНрдг рдХреЛрдб рдореЗрдВ "рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ" рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВред
рдЗрд╕ рдХреЛрдб рдореЗрдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдЕрд░реНрдзрд╡рд┐рд░рд╛рдореЛрдВ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рддреБрдо рдкреВрдЫрддреЗ рд╣реЛ рдХреНрдпреЛрдВ?
рдореБрдЦреНрдп рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ "4 + 5" рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдВрдд рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдкрд╛рда рджрд░реНрдЬ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ, рдЖрдк "рдбрд┐рдлрд╝ рдлрд╝реВ ..." рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 4 +5 рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЕрдВрдд рд╣реИ, рдпрд╛ рдЖрдк рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП "* 6" рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдКрдкрд░реА рд╕реНрддрд░ рдХреЗ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдореЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдЖрдкрдХреЛ "4 + 5" рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдФрд░ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдкрддрд╛ рдЪрд▓ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИредрдирд┐рд╖реНрдХрд░реНрд╖
рдЯрд┐рдкреНрдкрдгреА рдХреЛрдб рдХреА рдХреЗрд╡рд▓ 400 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде (рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдпрд╛ рд░рд┐рдХреНрдд рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде 240 рдкрдВрдХреНрддрд┐рдпрд╛рдБ), рд╣рдордиреЗ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдФрд░ рдкрд╛рд░реНрд╕рд░реНрд╕ рдФрд░ рдПрдПрд╕рдЯреА рдирд┐рд░реНрдорд╛рдг рд╕рд╣рд┐рдд рд╣рдорд╛рд░реА рдиреНрдпреВрдирддрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕ рд╕рдм рдХреЗ рд╕рд╛рде, рдмрд╣реБрд░реВрдкрджрд░реНрд╢рдХ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХреЛрдб рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рд╣рдореЗрдВ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╡реНрдпрд╛рдХрд░рдгрд┐рдХ рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд╕рддреНрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:$ ./a.out
ready> def foo(xy) x+foo(y, 4.0);
Parsed a function definition.
ready> def foo(xy) x+yy;
Parsed a function definition.
Parsed a top-level expr
ready> def foo(xy) x+y );
Parsed a function definition.
Error: unknown token when expecting an expression
ready> extern sin(a);
ready> Parsed an extern
ready> ^D
$
рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдЖрдк рдирдП рдПрдПрд╕рдЯреА рдиреЛрдбреНрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рднрд╛рд╖рд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрджрд┐ред рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдПрдПрд╕рдЯреА рд╕реЗ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рд░рд┐рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди (рдЖрдИрдЖрд░) рдХреИрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдПредрдкреВрд░реНрдг рдХреЛрдб рд╕реВрдЪреА
рдпрд╣рд╛рдБ рдЗрд╕ рдФрд░ рдкрд┐рдЫрд▓реЗ рдЕрдзреНрдпрд╛рдп рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдПрдХ рдкреВрд░реА рд╕реВрдЪреА рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рд╛рдпрддреНрдд рд╣реИ: рдЖрдкрдХреЛ LLVM рдпрд╛ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред (рдЫреЛрдбрд╝рдХрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдорд╛рдирдХ рд╕реА рдФрд░ рд╕реА ++ рдкреБрд╕реНрддрдХрд╛рд▓рдп)ред рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:#
g++ -g -O3 toy.cpp
#
./a.out
рдареАрдХ рд╣реИ, рдХреЛрдб рд╣реА: #include <cstdio> #include <cstdlib> #include <string> #include <map> #include <vector> //===----------------------------------------------------------------------===// // Lexer ( ) //===----------------------------------------------------------------------===// // [0-255], , // enum Token { tok_eof = -1, // ( ) tok_def = -2, tok_extern = -3, // ( : , ) tok_identifier = -4, tok_number = -5 }; static std::string IdentifierStr; // , tok_identifier static double NumVal; // , tok_number /// gettok - . static int gettok() { static int LastChar = ' '; // . while (isspace(LastChar)) LastChar = getchar(); if (isalpha(LastChar)) { // : [a-zA-Z][a-zA-Z0-9]* IdentifierStr = LastChar; while (isalnum((LastChar = getchar()))) IdentifierStr += LastChar; if (IdentifierStr == "def") return tok_def; if (IdentifierStr == "extern") return tok_extern; return tok_identifier; } if (isdigit(LastChar) || LastChar == '.') { // : [0-9.]+ std::string NumStr; do { NumStr += LastChar; LastChar = getchar(); } while (isdigit(LastChar) || LastChar == '.'); NumVal = strtod(NumStr.c_str(), 0); return tok_number; } if (LastChar == '#') { // do LastChar = getchar(); while (LastChar != EOF && LastChar != '\n' && LastChar != '\r'); if (LastChar != EOF) return gettok(); } // . if (LastChar == EOF) return tok_eof; // ASCII int ThisChar = LastChar; LastChar = getchar(); return ThisChar; } //===----------------------------------------------------------------------===// // Abstract Syntax Tree ( ) //===----------------------------------------------------------------------===// /// ExprAST - . class ExprAST { public: virtual ~ExprAST() {} }; /// NumberExprAST - (, "1.0"). class NumberExprAST : public ExprAST { double Val; public: NumberExprAST(double val) : Val(val) {} }; /// VariableExprAST - (, "a"). class VariableExprAST : public ExprAST { std::string Name; public: VariableExprAST(const std::string &name) : Name(name) {} }; /// BinaryExprAST - . class BinaryExprAST : public ExprAST { char Op; ExprAST *LHS, *RHS; public: BinaryExprAST(char op, ExprAST *lhs, ExprAST *rhs) : Op(op), LHS(lhs), RHS(rhs) {} }; /// CallExprAST - . class CallExprAST : public ExprAST { std::string Callee; std::vector<ExprAST*> Args; public: CallExprAST(const std::string &callee, std::vector<ExprAST*> &args) : Callee(callee), Args(args) {} }; /// PrototypeAST - "" , /// (, , /// ). class PrototypeAST { std::string Name; std::vector<std::string> Args; public: PrototypeAST(const std::string &name, const std::vector<std::string> &args) : Name(name), Args(args) {} }; /// FunctionAST - class FunctionAST { PrototypeAST *Proto; ExprAST *Body; public: FunctionAST(PrototypeAST *proto, ExprAST *body) : Proto(proto), Body(body) {} }; //===----------------------------------------------------------------------===// // Parser ( ) //===----------------------------------------------------------------------===// /// CurTok/getNextToken - . CurTok - /// , . getNextToken /// CurTok. static int CurTok; static int getNextToken() { return CurTok = gettok(); } /// BinopPrecedence - static std::map<char, int> BinopPrecedence; /// GetTokPrecedence - . static int GetTokPrecedence() { if (!isascii(CurTok)) return -1; // , . int TokPrec = BinopPrecedence[CurTok]; if (TokPrec <= 0) return -1; return TokPrec; } /// Error* - . ExprAST *Error(const char *Str) { fprintf(stderr, "Error: %s\n", Str);return 0;} PrototypeAST *ErrorP(const char *Str) { Error(Str); return 0; } FunctionAST *ErrorF(const char *Str) { Error(Str); return 0; } static ExprAST *ParseExpression(); /// identifierexpr /// ::= identifier /// ::= identifier '(' expression* ')' static ExprAST *ParseIdentifierExpr() { std::string IdName = IdentifierStr; getNextToken(); // . if (CurTok != '(') // . return new VariableExprAST(IdName); // . getNextToken(); // ( std::vector<ExprAST*> Args; if (CurTok != ')') { while (1) { ExprAST *Arg = ParseExpression(); if (!Arg) return 0; Args.push_back(Arg); if (CurTok == ')') break; if (CurTok != ',') return Error("Expected ')' or ',' in argument list"); getNextToken(); } } // ')'. getNextToken(); return new CallExprAST(IdName, Args); } /// numberexpr ::= number static ExprAST *ParseNumberExpr() { ExprAST *Result = new NumberExprAST(NumVal); getNextToken(); // return Result; } /// parenexpr ::= '(' expression ')' static ExprAST *ParseParenExpr() { getNextToken(); // (. ExprAST *V = ParseExpression(); if (!V) return 0; if (CurTok != ')') return Error("expected ')'"); getNextToken(); // ). return V; } /// primary /// ::= identifierexpr /// ::= numberexpr /// ::= parenexpr static ExprAST *ParsePrimary() { switch (CurTok) { default: return Error("unknown token when expecting an expression"); case tok_identifier: return ParseIdentifierExpr(); case tok_number: return ParseNumberExpr(); case '(': return ParseParenExpr(); } } /// binoprhs /// ::= ('+' primary)* static ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS) { // , while (1) { int TokPrec = GetTokPrecedence(); // , // , if (TokPrec < ExprPrec) return LHS; // , , . int BinOp = CurTok; getNextToken(); // eat binop // ExprAST *RHS = ParsePrimary(); if (!RHS) return 0; // BinOp RHS , RHS, // RHS LHS. int NextPrec = GetTokPrecedence(); if (TokPrec < NextPrec) { RHS = ParseBinOpRHS(TokPrec+1, RHS); if (RHS == 0) return 0; } // LHS/RHS. LHS = new BinaryExprAST(BinOp, LHS, RHS); } } /// expression /// ::= primary binoprhs /// static ExprAST *ParseExpression() { ExprAST *LHS = ParsePrimary(); if (!LHS) return 0; return ParseBinOpRHS(0, LHS); } /// prototype /// ::= id '(' id* ')' static PrototypeAST *ParsePrototype() { if (CurTok != tok_identifier) return ErrorP("Expected function name in prototype"); std::string FnName = IdentifierStr; getNextToken(); if (CurTok != '(') return ErrorP("Expected '(' in prototype"); // . std::vector<std::string> ArgNames; while (getNextToken() == tok_identifier) ArgNames.push_back(IdentifierStr); if (CurTok != ')') return ErrorP("Expected ')' in prototype"); // . getNextToken(); // ')'. return new PrototypeAST(FnName, ArgNames); } /// definition ::= 'def' prototype expression static FunctionAST *ParseDefinition() { getNextToken(); // def. PrototypeAST *Proto = ParsePrototype(); if (Proto == 0) return 0; if (ExprAST *E = ParseExpression()) return new FunctionAST(Proto, E); return 0; } /// toplevelexpr ::= expression static FunctionAST *ParseTopLevelExpr() { if (ExprAST *E = ParseExpression()) { // . PrototypeAST *Proto = new PrototypeAST("", std::vector<std::string>()); return new FunctionAST(Proto, E); } return 0; } /// external ::= 'extern' prototype static PrototypeAST *ParseExtern() { getNextToken(); // extern. return ParsePrototype(); } //===----------------------------------------------------------------------===// // Top-Level parsing ( ) //===----------------------------------------------------------------------===// static void HandleDefinition() { if (ParseDefinition()) { fprintf(stderr, "Parsed a function definition.\n"); } else { // . getNextToken(); } } static void HandleExtern() { if (ParseExtern()) { fprintf(stderr, "Parsed an extern\n"); } else { // . getNextToken(); } } static void HandleTopLevelExpression() { // . if (ParseTopLevelExpr()) { fprintf(stderr, "Parsed a top-level expr\n"); } else { // . getNextToken(); } } /// top ::= definition | external | expression | ';' static void MainLoop() { while (1) { fprintf(stderr, "ready> "); switch (CurTok) { case tok_eof: return; case ';': getNextToken(); break; // . case tok_def: HandleDefinition(); break; case tok_extern: HandleExtern(); break; default: HandleTopLevelExpression(); break; } } } //===----------------------------------------------------------------------===// // Main driver code ( ) //===----------------------------------------------------------------------===// int main() { // . // 1 - . BinopPrecedence['<'] = 10; BinopPrecedence['+'] = 20; BinopPrecedence['-'] = 20; BinopPrecedence['*'] = 40; // highest. fprintf(stderr, "ready> "); getNextToken(); // " ". MainLoop(); return 0; }
рдкреБрдирд╢реНрдЪ
рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдмрд╣реБрдд рдХрдард┐рди рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдЕрдиреБрд╡рд╛рдж рдФрд░ рдереЛрдбрд╝реЗ "рдЧреИрд░-рд░реВрд╕реА рдореЛрдбрд╝" рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ, рдореИрдВ рдЕрдЧрд▓реЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рд╕рд╣реА рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реВрдВ (рдпрд╣ рдЖрд╕рд╛рди рд╣реИ)ред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЦреБрд╢реА рдХреЗ рд╕рд╛рде рдореИрдВ рдкреАрдПрдо рд╕реБрдзрд╛рд░, рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг, рдЗрдЪреНрдЫрд╛рдУрдВ рдФрд░ рдЦрддрд░реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ :)