рддреАрди-рдкрддрд╛ рдХреЛрдб рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦрдирд╛

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



рд╢реБрдн рджреЛрдкрд╣рд░
рдореИрдВ рдирд┐рдХрдЯ-рд╕рдВрдХрд▓рдХ рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВред рдЗрд╕ рдмрд╛рд░ рдореИрдВ рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдФрд░ рдирд┐рд░реНрдорд╛рдг рдкрд░ рд╕реНрдкрд░реНрд╢ рдХрд░реВрдБрдЧрд╛ рдЬреЛ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдкреЗрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЛ рдкрдврд╝реЗрдВ - тАЬрд╣рдо рдПрдХ LR (0) рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЬрдЯрд┐рд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ, " рдХреНрдпреЛрдВрдХрд┐ рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ рдореИрдВ рдЦрд░реЛрдВрдЪ рд╕реЗ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЙрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЕрд░реЗ рд╣рд╛рдБ, рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ - рд╣рдо рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред рдореИрдВ рдЗрд╕ рднрд╛рд╖рд╛ рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрдирддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИред рд╣рд░ рдХреЛрдИ рдЗрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╣рд┐рдореНрдордд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЕрднреА рднреА рдХреЗрд╡рд▓ рдПрдХ рдкреГрд╖реНрда рдЦреЛрд▓рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред рд╕рд╛рдзрди рдХреА atypicality рдЙрджрд╛рд╣рд░рдг рдХреЗ "рд╕реАрдЦрдиреЗ" рджреНрд╡рд╛рд░рд╛ рдСрдлрд╕реЗрдЯ рд╣реИред рдХрд╛рдо рдХреА рдЧрддрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ (100-150 рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕реАрдорд╛, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдФрд░ рдирд╣реАрдВ, рдЬреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ), рдФрд░ рдЬреЗрдПрд╕ рдореЗрдВ рдХреЛрдб рдХреА рд╕рдордЭ рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╣реИред



рддреАрди рдкрддрд╛ рдХреЛрдб


рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рддреАрди-рдкрддрд╛ рдХреЛрдб рдЪреБрдирд╛ред
рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдпрд╣ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдХреЛрдб рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдмрд╛рдЗрдЯрдХреЛрдб рдХреЗ рдмреАрдЪ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рднрд╛рд╖рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Sishnaya рд╕реНрдЯреНрд░рд┐рдВрдЧ:
a = (b + c) * (d - e) 
рдпрд╣ рдЗрд╕ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:
 f = b + c g = d - e a = f * g 

рдЗрд╕ рднрд╛рд╖рд╛ рдХрд╛ рдореБрдЦреНрдп рд╕рдВрдХреЗрдд рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдореЗрдВ рддреАрди рд╕реЗ рдЕрдзрд┐рдХ рдСрдкрд░реЗрдВрдб рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдордзреНрдпрд╡рд░реНрддреА рдХреЛрдб рдХреЛ рдмрд╛рдпрдЯреЗрдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рднрд╛рд╖рд╛ рдХреЗ рд╕рдорд░реВрдк рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рдпреЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЪрд░ рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛рдПрдВ рд╣реИрдВред рд╕рднреА рдЪрд░ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИрдВред рд╡реИрд╕реЗ, рдРрд░реЗ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдПрдХ рдСрдкрд░реЗрдВрдб рднреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрд╢рдВрд╕ рдореЗрдВ рд╣рдо 3 рдСрдкрд░реЗрдВрдбреНрд╕ рдХреА рд╕реАрдорд╛ рдХреЛ рдкрд╛рд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ)ред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдкрд░ рднреА рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣) - рд╕рд╢рд░реНрдд рдФрд░ рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрджрддрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдФрд░ рд╕реНрдЯреИрдХ рдХреЗ рдмрд┐рдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЪрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдпрд╣ рдЕрдХреНрд╕рд░ рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИред рднрд╛рд╖рд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдПрдХ рд╡реНрдпрд╛рдХрд░рдг рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реА рд╕рд┐рдВрдереЗрдЯрд┐рдХ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред
 //   <line> = <vars_decl>|<command> //    <var_decl> = <ident>|<ident><left_sq_bracket><number><right_sq_bracket> //   <var_list> = <var_decl>|<var_list><comma><whitespace><var_decl> //    <vars_decl> = <var_keyword><whitespace><var_list> //  L: operation <command> = <ident><colon><whitespace><operation>|<operation> //  <operation> = <io>|<binary>|<control>|<assign>|<stack> // / in var, out var <io> = <in_keyword><whitespace><var_output_array>|<out_keyword><whitespace><var_input_array> //     - [], ,   <var_output> = <var_ptr>|<ident> <var_output_array> = <var_output>|<var_ar> //  <var_ar> = <ident><left_sq_bracket><var_numb><right_sq_bracket> <var_numb> = <ident>|<number> //  <var_ptr> = <asterisk><ident> //  <var_ref> = <ref><ident> //     - [], ,  ,   ,  <var_input_array> = <var_input>|<var_ar> <var_input> = <var_output>|<var_ref>|<number> //   ,  3  <binary> = <var_output><assign_sign><var_input><operator><var_input> <operator> = <plus>|<minus>|<asterisk>|<div>|<mod> //  <control> = <goto>|<if> //  <goto> = <goto_keyword><whitespace><ident> //  <if> = <if_keyword><whitespace><var_input><comp_operator><var_input><whitespace><goto> //  <assign> = <var_output_array><assign_sign><var_input>|<var_output><assign_sign><var_input_array> //    <stack> = <pop_keyword><whitespace><var_output_array>|<push_keyword><whitespace><var_input_array> 

рдЕрдиреНрдп рд╕рднреА рд╡рд░реНрдг (рдЬреЛ рджрд╛рдПрдВ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╛рдПрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ) рдЯрд░реНрдорд┐рдирд▓ рд╣реИрдВ, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдиреАрдЪреЗ рдереЛрдбрд╝рд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред

рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯреНрд░реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг



рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛, рдЯреЛрдХрди рдХреА рдзрд╛рд░рд╛ рдкрд╛рд░реНрд╕рд░ рдХреЗ рдЗрдирдкреБрдЯ рдкрд░ рдЖрддреА рд╣реИ, рдпрд╣ рдзрд╛рд░рд╛ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП
 if a<b goto L 
рд╣рдо рдЯреЛрдХрди рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдзрд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ - рд▓реЗрдХреНрд╕рдХреЗрдпрд░реНрдбрдЖрдИрдПрдл , рд▓реЗрдХреНрд╕рд╡рд╛рдЗрдЯрд╕реНрдкреЗрд╕ , рд▓реЗрдХреНрд╕рдЖрдИрдбреЗрдВрдЯ , рд▓реЗрдХреНрд╕рдХреЙрдо , рд▓реЗрдХреНрд╕рдЖрдИрдбреЗрдВрдЯ , рд▓реЗрдХреНрд╕рд╡рд╛рдЗрдЯрд╕реНрдкреЗрд╕ , рд▓реЗрдХреНрд╕рдХреЗрдпрд░реНрдбрдЧреЛрдЯреЛ , рд▓реЗрдХреНрд╕рд╡рд┐рдЯреНрд╕рд╕реНрдкреЗрд╕ , рд▓реЗрдХреНрд╕рдЖрдИрдбреЗрдВрдЯ ред
рдЧреИрд░-рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЯреЛрдХрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ:
 <ident> = <letter>|<ident><letter>|<ident><digit> <number> = <digit>|<number><digit> <plus> = '+' <minus> = '-' <div> = '/' <mod> = '%' <comp_operator> = '<'|'>'|'>='|'<='|'=='|'!=' <whitespace> = ' ' <pop_keyword> = "pop" <push_keyword> = "push" <goto_keyword> = "goto" <in_keyword> = "in" <out_keyword> = "out" <var_keyword> = "var" <if_keyword> = "if" <left_sq_bracket> = '[' <right_sq_bracket> = ']' <colon> = ':' <asterisk> = '*' <assign_sign> = '=' <ref> = '&' <comma> = ',' $ = end of line 

рдХреЛрдб рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдореИрдВ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ рджреВрдВрдЧрд╛:
 function GetLex(stream) { var c = stream.get(); switch ( c ) { case ' ': return {type: LexTypes.LexWhitespace}; ... } if (c <= '9' && c >= '0') return {type: LexTypes.LexNumber, number: readNumber()}; if (c > 'z' || c < 'a') return {type: LexTypes.LexError}; var ident = readIdent(); if (ident == 'pop') return {type: LexTypes.LexKeywordPop}; ... return {type: LexTypes.LexIdent, ident: ident}; } 
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЯреЛрдХрди рдХреА рдПрдХ рдзрд╛рд░рд╛ рд╣реИред
рд╣рдо рдЗрд╕реЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдореИрдВрдиреЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡-рдЙрддреНрдкрдиреНрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдПрд▓рдЖрд░ (0) рдЪреБрдирд╛ (рдореИрдВрдиреЗ рдпрд╣ рднреА рд▓рд┐рдЦрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП)ред рдЗрд╕рдиреЗ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП 82 рд░рд╛рдЬреНрдпреЛрдВ рдФрд░ рд╕реНрд╡рд░реВрдкрд┐рдд рдХреЛрдб рдХреА 1400 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред рдкрд╛рд░реНрд╕рд░ рдХреЛрдб рд╕реНрд╡рдпрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ C ++ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдкреЗрдбрд╝ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдкреНрд░рддреНрдпреЗрдХ рдПрдХреНрд╢рдирд╢рд┐рдлреНрдЯ рдПрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдЯреЛрдХрди рд╡рд╛рд▓реЗ рдПрдХ рдкреЗрдбрд╝ рдХрд╛ рдкрддреНрддрд╛ (рдПрдХ рдиреЛрдб рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдмрдЪреНрдЪреЗ рдирд╣реАрдВ рд╣реИрдВ) рдмрдирд╛рддреЗ рд╣реИрдВред рдФрд░ рдЬрдм рд╣рдо рдирд┐рдпрдо рдХреЛ рдзреНрд╡рд╕реНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджрд╛рдПрдВ рд╣рд╛рде рдХреА рддрд░рдл рдХреЗ рд╕рдорд╛рди рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдПрдХ рдмрдВрдбрд▓ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдирдпрд╛ рдиреЛрдб рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдиреЛрдб (рдЬреЛ рд╣рдорд╛рд░реЗ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдПрдХ рдиреЛрдб рд╣реИ) рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд▓ рд╣реИ, рдПрдХ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЗрдбрд╝ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:
рдЫрд╡рд┐

рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд▓реЙрдиреНрдЪ рдХреА рддреИрдпрд╛рд░реА


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

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

рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди


рдореИрдВрдиреЗ рджреЛ рдирд┐рд╖реНрдкрд╛рджрди рдореЛрдб рдкреЗрд╢ рдХрд┐рдП - рдЪрд░рдг рджрд░ рдЪрд░рдг рдФрд░ рд╕рд░рд▓ред рдирд╛рдореЛрдВ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрдпрд╛ рд╣реИред
рдХреЛрдб:
 function executeLine() { if (input_data.active) { setTimeout(executeLine, 100); return ; } if (input_data.error) return ; var line = lines[currentline]; var ret; if (!line.correct) { addlog('syntax error at position ' + line.pos); return ; } var general = line.tree.childs[0]; if (general.nonterm == NonTerminals.vars_decl) ret = interp_var_list(general.childs[0]); else ret = interp_operation(general.childs[0]); if (!ret) return ; currentline++; if (currentline == linecount) { addlog('Finish!', true); return ; } if (!step_by_step) setTimeout(executeLine, 0); } 

input_data рдкрд╣рд▓реА рд╕рд╣рд╛рдпрдХ рд╡рд╕реНрддреБ рд╣реИред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЕрдкрдирд╛ рдИрд╡реЗрдВрдЯ рдореЙрдбрд▓ рд╣реИ, рдФрд░ рдпрд╣ рд╣рдорд╛рд░реЗ рд╕реНрд╡рдпрдВ рдХреЗ рдИрд╡реЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рд╣рдо рд╡реИрд▓реНрдпреВ рдЗрдирдкреБрдЯ рдбрд╛рдпрд▓реЙрдЧ (рдХрдорд╛рдВрдб рдореЗрдВ) рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо "рдлрд╝реНрд░реАрдЬрд╝" рдлрд╝реНрд▓реИрдЧ - input_data.active рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдбрд╛рдпрд▓реЙрдЧ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред ред рджреВрд╕рд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ, step_by_step, рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред
рдирд┐рд╖реНрдкрд╛рджрди рд╣реА рдЖрджрд┐рдо рд╣реИ - рд▓рдЧрднрдЧ рд╣рд░ рдЧреИрд░-рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╣рдо рд╡реГрдХреНрд╖реЛрдВ рдХреЛ рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреИрд░-рд╡реГрдХреНрд╖реЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВред
рдЧреИрд░-рдЯрд░реНрдорд┐рдирд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЙрджрд╛рд╣рд░рдг:
 function interp_control_goto(node) { var ident = node.childs[0].lex.ident; if (ident in labels) { currentline = labels[ident] - 1; return true; } if (!check_var(ident)) return false; var val = vars[ident]; if (val >= linecount) { addlog('invalid address of code'); return false; } currentline = val.value - 1; return true; } 


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

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


All Articles