{"id":329931,"date":"2022-02-21T15:00:36","date_gmt":"2022-02-21T15:00:36","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=329931"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=329931","title":{"rendered":"<span>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Lua \u043d\u0430 Rust<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u044b \u043e\u0441\u0432\u043e\u0438\u0442\u0435 \u044d\u0442\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e, \u0432 \u0432\u0430\u0448\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Lua (\u043f\u0430\u0440\u0441\u0435\u0440, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430), \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u043d\u0430 Rust \u0441 \u0447\u0438\u0441\u0442\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0430. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 Lust, \u0435\u0433\u043e \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 <a href=\"https:\/\/github.com\/eatonphil\/lust\">GitHub<\/a>. <\/p>\n<p>  <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/649973\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/tp\/ei\/pm\/tpeipmwulztuxd2km9zcy2fo2og.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/tp\/ei\/pm\/tpeipmwulztuxd2km9zcy2fo2og.jpeg\" data-blurred=\"true\"\/><\/a><a name=\"habracut\"><\/a><\/p>\n<p>  \u0421 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e, \u043a\u0440\u043e\u043c\u0435 \u043f\u0440\u043e\u0447\u0438\u0445, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443:<\/p>\n<pre><code class=\"rust\">function fib(n) \u00a0\u00a0\u00a0if n &lt; 2 then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return n; \u00a0\u00a0\u00a0end  \u00a0\u00a0\u00a0local n1 = fib(n-1); \u00a0\u00a0\u00a0local n2 = fib(n-2); \u00a0\u00a0\u00a0return n1 + n2; end  print(fib(30)); <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u2014 \u043c\u043e\u0439 \u0432\u0442\u043e\u0440\u043e\u0439 Rust-\u043f\u0440\u043e\u0435\u043a\u0442. \u0410 \u0432\u044b\u0434\u0443\u043c\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0430\u0431\u043e\u0440\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u043b\u0438\u0448\u044c \u0432 \u0442\u0440\u0435\u0442\u0438\u0439 \u0440\u0430\u0437. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0448\u0443 \u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043c\u043e\u0439 \u0441\u0442\u0438\u043b\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430 \u0438\u0441\u0442\u0438\u043d\u0443 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438. \u041f\u043e\u043b\u0430\u0433\u0430\u044e, \u044d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0442\u0435\u043c, \u043a\u0442\u043e, \u043a\u0430\u043a \u0438 \u044f, \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043f\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0443 \u043a\u043e\u043c\u0430\u043d\u0434 \u0432 Rust \u0438 \u0441\u0447\u0451\u043b \u0438\u0445 \u043d\u0435\u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u043c\u043e\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0449\u0435 \u0442\u0435\u0445 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432.<\/p>\n<h2><font color=\"#3AC1EF\">\u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u044b<\/font><\/h2>\n<p>  \u041a\u043e\u043c\u0430\u043d\u0434\u0430 <code>cargo init<\/code> \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 Cargo, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0412 \u043a\u043e\u0434\u0435 \u0444\u0430\u0439\u043b\u0430 <code>src\/main.rs<\/code> \u043c\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0438\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e\u0441\u044f \u0432 \u043d\u0451\u043c \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0432\u044b\u0434\u0435\u043b\u044f\u044f \u0442\u043e\u043a\u0435\u043d\u044b. \u0414\u0430\u043b\u0435\u0435 \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0434\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0432 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. \u0410 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b.<\/p>\n<pre><code class=\"rust\">mod eval; mod lex; mod parse;  use std::env; use std::fs;  fn main() { \u00a0\u00a0\u00a0\u00a0let args: Vec&lt;String> = env::args().collect(); \u00a0\u00a0\u00a0\u00a0let contents = fs::read_to_string(&amp;args[1]).expect(\"Could not read file\");  \u00a0\u00a0\u00a0\u00a0let raw: Vec&lt;char> = contents.chars().collect();  \u00a0\u00a0\u00a0\u00a0let tokens = match lex::lex(&amp;raw) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Ok(tokens) => tokens, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Err(msg) => panic!(\"{}\", msg), \u00a0\u00a0\u00a0\u00a0};  \u00a0\u00a0\u00a0\u00a0let ast = match parse::parse(&amp;raw, tokens) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Ok(ast) => ast, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Err(msg) => panic!(\"{}\", msg), \u00a0\u00a0\u00a0\u00a0};  \u00a0\u00a0\u00a0\u00a0let pgrm = eval::compile(&amp;raw, ast);  \u00a0\u00a0\u00a0\u00a0eval::eval(pgrm); } <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043f\u043e\u043a\u0430 \u0432\u0441\u0451 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440.<\/p>\n<h2><font color=\"#3AC1EF\">\u041b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437<\/font><\/h2>\n<p>  \u0412 \u0445\u043e\u0434\u0435 \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0443\u0431\u0438\u0440\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b (\u043e\u043d\u0438, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u0435\u0445, \u0447\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442 \u0438\u043c\u0435\u043d\u0430 \u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430, Lua \u0431\u0435\u0437\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b) \u0438 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u044e\u0442 \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u0441\u043c\u044b\u0441\u043b \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b, \u0432\u0440\u043e\u0434\u0435 \u0437\u0430\u043f\u044f\u0442\u044b\u0445, \u0447\u0438\u0441\u0435\u043b, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432, \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0441\u043b\u043e\u0432 \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u0430 \u0431\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445, \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0442\u043e\u043c, \u0441 \u0447\u0435\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c, \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 <code>Location<\/code>, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0439 <code>increment<\/code> \u0438 <code>debug<\/code>. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0444\u0430\u0439\u043b\u0435 <code>src\/lex.rs<\/code>.<\/p>\n<pre><code class=\"rust\">#[derive(Copy, Clone, Debug)] pub struct Location { \u00a0\u00a0\u00a0\u00a0col: i32, \u00a0\u00a0\u00a0\u00a0line: i32, \u00a0\u00a0\u00a0\u00a0index: usize, } <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>increment<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432, \u0430 \u0442\u0430\u043a \u0436\u0435 \u2014 \u0437\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0444\u0430\u0439\u043b\u0430.<\/p>\n<pre><code class=\"rust\">impl Location { \u00a0\u00a0\u00a0\u00a0fn increment(&amp;self, newline: bool) -> Location { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if newline { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Location { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0index: self.index + 1, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0col: 0, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0line: self.line + 1, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Location { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0index: self.index + 1, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0col: self.col + 1, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0line: self.line, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>debug<\/code> \u0432\u044b\u0434\u0430\u0451\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u043d\u0430 \u0435\u0451 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0438 \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0pub fn debug&lt;S: Into&lt;String>>(&amp;self, raw: &amp;[char], msg: S) -> String { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let mut line = 0; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let mut line_str = String::new(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u041f\u043e\u0438\u0441\u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for c in raw { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if *c == '\\n' { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0line += 1;  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0435\u0439 \u043d\u0430\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if !line_str.is_empty() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0continue; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if self.line == line { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0line_str.push_str(&amp;c.to_string()); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let space = \" \".repeat(self.col as usize); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0format!(\"{}\\n\\n{}\\n{}^ Near here\", msg.into(), line_str, space) \u00a0\u00a0\u00a0\u00a0} } <\/code><\/pre>\n<p>  \u041d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u043e\u0434\u0430 \u2014 \u044d\u0442\u043e \u0442\u043e\u043a\u0435\u043d. \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0438\u043b\u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439. (\u0412 \u044d\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Lua \u043c\u044b \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 Lua \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u0441\u0442\u0440\u043e\u043a.)<\/p>\n<pre><code class=\"rust\">#[derive(Debug, PartialEq, Eq, Clone)] pub enum TokenKind { \u00a0\u00a0\u00a0\u00a0Identifier, \u00a0\u00a0\u00a0\u00a0Syntax, \u00a0\u00a0\u00a0\u00a0Keyword, \u00a0\u00a0\u00a0\u00a0Number, \u00a0\u00a0\u00a0\u00a0Operator, }  #[derive(Debug, Clone)] pub struct Token { \u00a0\u00a0\u00a0\u00a0pub value: String, \u00a0\u00a0\u00a0\u00a0pub kind: TokenKind, \u00a0\u00a0\u00a0\u00a0pub loc: Location, } <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f <code>lex<\/code> \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u0430\u0439\u043b\u0430 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u043b\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0438\u0434\u043e\u0432. \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0438\u0442 \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432\u0441\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u00ab\u043f\u043e\u0433\u043b\u043e\u0449\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b\u00bb.<\/p>\n<pre><code class=\"rust\">pub fn lex(s: &amp;[char]) -> Result&lt;Vec&lt;Token>, String> { \u00a0\u00a0\u00a0\u00a0let mut loc = Location { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0col: 0, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0index: 0, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0line: 0, \u00a0\u00a0\u00a0\u00a0}; \u00a0\u00a0\u00a0\u00a0let size = s.len(); \u00a0\u00a0\u00a0\u00a0let mut tokens: Vec&lt;Token> = vec![];  \u00a0\u00a0\u00a0\u00a0let lexers = [ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lex_keyword, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lex_identifier, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lex_number, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lex_syntax, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lex_operator, \u00a0\u00a0\u00a0\u00a0]; \u00a0\u00a0\u00a0\u00a0'outer: while loc.index &lt; size { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0loc = eat_whitespace(s, loc); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if loc.index == size { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for lexer in lexers { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let res = lexer(s, loc); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if let Some((t, next_loc)) = res { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0loc = next_loc; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tokens.push(t); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0continue 'outer; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return Err(loc.debug(s, \"Unrecognized character while lexing:\")); \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0Ok(tokens) } <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u041f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b<\/font><\/h3>\n<p>  \u041f\u043e\u0433\u043b\u043e\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u0444\u0430\u0439\u043b\u0435 \u043f\u0440\u0438 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0431\u0435\u043b\u0430, \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0442\u0430\u0431\u0443\u043b\u044f\u0446\u0438\u0438, \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445.<\/p>\n<pre><code class=\"rust\">fn eat_whitespace(raw: &amp;[char], initial_loc: Location) -> Location { \u00a0\u00a0\u00a0\u00a0let mut c = raw[initial_loc.index]; \u00a0\u00a0\u00a0\u00a0let mut next_loc = initial_loc; \u00a0\u00a0\u00a0\u00a0while [' ', '\\n', '\\r', '\\t'].contains(&amp;c) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_loc = next_loc.increment(c == '\\n'); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if next_loc.index == raw.len() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0c = raw[next_loc.index]; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0next_loc } <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0427\u0438\u0441\u043b\u0430<\/font><\/h3>\n<p>  \u041b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0447\u0438\u0441\u0435\u043b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u0434\u043e \u0442\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u0433\u0434\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u044b\u0445 \u0446\u0438\u0444\u0440 (\u0432 \u044d\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Lua \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430).<\/p>\n<pre><code class=\"rust\">fn lex_number(raw: &amp;[char], initial_loc: Location) -> Option&lt;(Token, Location)> { \u00a0\u00a0\u00a0\u00a0let mut ident = String::new(); \u00a0\u00a0\u00a0\u00a0let mut next_loc = initial_loc; \u00a0\u00a0\u00a0\u00a0let mut c = raw[initial_loc.index]; \u00a0\u00a0\u00a0\u00a0while c.is_digit(10) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ident.push_str(&amp;c.to_string()); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_loc = next_loc.increment(false); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0c = raw[next_loc.index]; \u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0446\u0438\u0444\u0440 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043d\u0435\u0442 \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u2014 \u044d\u0442\u043e \u043d\u0435 \u0447\u0438\u0441\u043b\u043e.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0if !ident.is_empty() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Some(( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Token { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value: ident, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0loc: initial_loc, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0kind: TokenKind::Number, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_loc, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)) \u00a0\u00a0\u00a0\u00a0} else { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0None \u00a0\u00a0\u00a0\u00a0} } <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b<\/font><\/h3>\n<p>  \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0446\u0438\u0444\u0440 \u0438 \u0437\u043d\u0430\u043a\u043e\u0432 \u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u044f.<\/p>\n<pre><code class=\"rust\">fn lex_identifier(raw: &amp;Vec&lt;char>, initial_loc: Location) -> Option&lt;(Token, Location)> { \u00a0\u00a0\u00a0\u00a0let mut ident = String::new(); \u00a0\u00a0\u00a0\u00a0let mut next_loc = initial_loc; \u00a0\u00a0\u00a0\u00a0let mut c = raw[initial_loc.index]; \u00a0\u00a0\u00a0\u00a0while c.is_alphanumeric() || c == '_' { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ident.push_str(&amp;c.to_string()); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_loc = next_loc.increment(false); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0c = raw[next_loc.index]; \u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  \u041d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441 \u0446\u0438\u0444\u0440\u044b.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0\/\/ \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0446\u0438\u0444\u0440\u043e\u0439 \u00a0\u00a0\u00a0\u00a0if ident.len() > 0 &amp;&amp; !ident.chars().next().unwrap().is_digit(10) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Some(( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Token { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value: ident, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0loc: initial_loc, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0kind: TokenKind::Identifier, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_loc, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)) \u00a0\u00a0\u00a0\u00a0} else { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0None \u00a0\u00a0\u00a0\u00a0} } <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430<\/font><\/h3>\n<p>  \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0447\u0442\u043e \u0440\u043e\u0434\u043d\u0438\u0442 \u0438\u0445 \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438, \u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043c\u0451\u043d \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/p>\n<pre><code class=\"rust\">fn lex_keyword(raw: &amp;[char], initial_loc: Location) -> Option&lt;(Token, Location)> { \u00a0\u00a0\u00a0\u00a0let syntax = [\"function\", \"end\", \"if\", \"then\", \"local\", \"return\"];  \u00a0\u00a0\u00a0\u00a0let mut next_loc = initial_loc; \u00a0\u00a0\u00a0\u00a0let mut value = String::new(); \u00a0\u00a0\u00a0\u00a0'outer: for possible_syntax in syntax { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let mut c = raw[initial_loc.index]; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_loc = initial_loc; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0while c.is_alphanumeric() || c == '_' { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value.push_str(&amp;c.to_string()); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_loc = next_loc.increment(false); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0c = raw[next_loc.index];  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let n = next_loc.index - initial_loc.index; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if value != possible_syntax[..n] { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value = String::new(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0continue 'outer; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u041d\u0435\u043f\u043e\u043b\u043d\u043e\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if value.len() &lt; possible_syntax.len() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value = String::new(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0continue; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u0415\u0441\u043b\u0438 \u043c\u044b \u0434\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 - \u0437\u043d\u0430\u0447\u0438\u0442 \u2014 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u043d\u043d\u0438\u0439 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u041d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 \u0431\u043e\u043b\u0435\u0435 \u0434\u043b\u0438\u043d\u043d\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0break; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0if value.is_empty() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  \u041f\u043e\u043c\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u0434\u0430 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0441\u0442\u0440\u043e\u043a, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0435\u0449\u0451 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u2014 \u043f\u043e\u043b\u043d\u043e\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>function1<\/code> \u2014 \u044d\u0442\u043e \u043d\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e. \u042d\u0442\u043e \u2014 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440. \u0418 \u0445\u043e\u0442\u044f <code>function 1<\/code> \u2014 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u043a\u0435\u043d\u043e\u0432 (\u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>function<\/code> \u0438 \u0447\u0438\u0441\u043b\u043e <code>1<\/code>), \u043e\u043d\u0430 \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u043c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c Lua.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0\/\/ \u0415\u0441\u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0431\u0443\u0434\u0435\u0442 \u0447\u0430\u0441\u0442\u044c\u044e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430, \u0442\u043e\u0433\u0434\u0430 \u00a0\u00a0\u00a0\u00a0\/\/ \u044d\u0442\u043e - \u043d\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e. \u00a0\u00a0\u00a0\u00a0if next_loc.index &lt; raw.len() - 1 { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let next_c = raw[next_loc.index]; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if next_c.is_alphanumeric() || next_c == '_' { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0Some(( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Token { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value: value, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0loc: initial_loc, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0kind: TokenKind::Keyword, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_loc, \u00a0\u00a0\u00a0\u00a0)) } <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438<\/font><\/h3>\n<p>  \u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 (\u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435) \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0434\u0430, \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438. \u042d\u0442\u043e \u043d\u0435\u0447\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0437\u0430\u043f\u044f\u0442\u044b\u0445, \u0441\u043a\u043e\u0431\u043e\u043a \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<pre><code class=\"rust\">fn lex_syntax(raw: &amp;[char], initial_loc: Location) -> Option&lt;(Token, Location)> { \u00a0\u00a0\u00a0\u00a0let syntax = [\";\", \"=\", \"(\", \")\", \",\"];  \u00a0\u00a0\u00a0\u00a0for possible_syntax in syntax { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let c = raw[initial_loc.index]; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let next_loc = initial_loc.increment(false); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ TODO: \u044d\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043c\u043d\u043e\u0433\u043e\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u0432\u0440\u043e\u0434\u0435 >= \u0438\u043b\u0438 == \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if possible_syntax == c.to_string() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return Some(( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Token { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value: possible_syntax.to_string(), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0loc: initial_loc, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0kind: TokenKind::Syntax, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_loc, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0None } <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b<\/font><\/h3>\n<p>  \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u2014 \u044d\u0442\u043e \u043d\u0435\u0447\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u043f\u043b\u044e\u0441\u0430, \u043c\u0438\u043d\u0443\u0441\u0430 \u0438 \u0437\u043d\u0430\u043a\u0430 \u00ab\u043c\u0435\u043d\u044c\u0448\u0435\u00bb. \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u2014 \u044d\u0442\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u0445 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u043c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<pre><code class=\"rust\">fn lex_operator(raw: &amp;[char], initial_loc: Location) -> Option&lt;(Token, Location)> { \u00a0\u00a0\u00a0\u00a0let operators = [\"+\", \"-\", \"&lt;\"];  \u00a0\u00a0\u00a0\u00a0for possible_syntax in operators { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let c = raw[initial_loc.index]; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let next_loc = initial_loc.increment(false); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ TODO: \u044d\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043c\u043d\u043e\u0433\u043e\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u0432\u0440\u043e\u0434\u0435 >= \u0438\u043b\u0438 == \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if possible_syntax == c.to_string() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return Some(( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Token { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value: possible_syntax.to_string(), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0loc: initial_loc, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0kind: TokenKind::Operator, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_loc, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0None } <\/code><\/pre>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u043c\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430!<\/p>\n<h2><font color=\"#3AC1EF\">\u0413\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437<\/font><\/h2>\n<p>  \u0412 \u0445\u043e\u0434\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 (\u0434\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u044b\u0445) \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u0422\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c \u0438\u043b\u0438 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c (AST, Abstract Syntax Tree).<\/p>\n<p>  \u0422\u0443\u0442 \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0441\u043a\u0443\u0447\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0434\u0435\u0440\u0435\u0432\u0430. \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 (\u0438, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e, \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435), \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u2014 \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c. \u041e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 <code>if<\/code> \u0438\u043b\u0438 <code>return<\/code>. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439.<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0440\u0430\u0437\u043c\u0435\u0449\u0451\u043d \u0432 \u0444\u0430\u0439\u043b\u0435 <code>src\/parse.rs<\/code>.<\/p>\n<pre><code class=\"rust\">#[derive(Debug)] pub enum Statement { \u00a0\u00a0\u00a0\u00a0Expression(Expression), \u00a0\u00a0\u00a0\u00a0If(If), \u00a0\u00a0\u00a0\u00a0FunctionDeclaration(FunctionDeclaration), \u00a0\u00a0\u00a0\u00a0Return(Return), \u00a0\u00a0\u00a0\u00a0Local(Local), }  pub type Ast = Vec&lt;Statement>; <\/code><\/pre>\n<p>  \u0412 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e.<\/p>\n<pre><code class=\"rust\">#[derive(Debug)] pub enum Literal { \u00a0\u00a0\u00a0\u00a0Identifier(Token), \u00a0\u00a0\u00a0\u00a0Number(Token), }  #[derive(Debug)] pub struct FunctionCall { \u00a0\u00a0\u00a0\u00a0pub name: Token, \u00a0\u00a0\u00a0\u00a0pub arguments: Vec&lt;Expression>, }  #[derive(Debug)] pub struct BinaryOperation { \u00a0\u00a0\u00a0\u00a0pub operator: Token, \u00a0\u00a0\u00a0\u00a0pub left: Box&lt;Expression>, \u00a0\u00a0\u00a0\u00a0pub right: Box&lt;Expression>, }  #[derive(Debug)] pub enum Expression { \u00a0\u00a0\u00a0\u00a0FunctionCall(FunctionCall), \u00a0\u00a0\u00a0\u00a0BinaryOperation(BinaryOperation), \u00a0\u00a0\u00a0\u00a0Literal(Literal), }  #[derive(Debug)] pub struct FunctionDeclaration { \u00a0\u00a0\u00a0\u00a0pub name: Token, \u00a0\u00a0\u00a0\u00a0pub parameters: Vec&lt;Token>, \u00a0\u00a0\u00a0\u00a0pub body: Vec&lt;Statement>, }  #[derive(Debug)] pub struct If { \u00a0\u00a0\u00a0\u00a0pub test: Expression, \u00a0\u00a0\u00a0\u00a0pub body: Vec&lt;Statement>, }  #[derive(Debug)] pub struct Local { \u00a0\u00a0\u00a0\u00a0pub name: Token, \u00a0\u00a0\u00a0\u00a0pub expression: Expression, }  #[derive(Debug)] pub struct Return { \u00a0\u00a0\u00a0\u00a0pub expression: Expression, } <\/code><\/pre>\n<p>  \u0420\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0434 AST \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430!<\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b<\/font><\/h3>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0430.<\/p>\n<pre><code class=\"rust\">fn expect_keyword(tokens: &amp;[Token], index: usize, value: &amp;str) -> bool { \u00a0\u00a0\u00a0\u00a0if index >= tokens.len() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return false; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0let t = tokens[index].clone(); \u00a0\u00a0\u00a0\u00a0t.kind == TokenKind::Keyword &amp;&amp; t.value == value }  fn expect_syntax(tokens: &amp;[Token], index: usize, value: &amp;str) -> bool { \u00a0\u00a0\u00a0\u00a0if index >= tokens.len() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return false; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0let t = tokens[index].clone(); \u00a0\u00a0\u00a0\u00a0t.kind == TokenKind::Syntax &amp;&amp; t.value == value }  fn expect_identifier(tokens: &amp;[Token], index: usize) -> bool { \u00a0\u00a0\u00a0\u00a0if index >= tokens.len() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return false; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0let t = tokens[index].clone(); \u00a0\u00a0\u00a0\u00a0t.kind == TokenKind::Identifier } <\/code><\/pre>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0434\u0435\u043b. \u0417\u0430\u0439\u043c\u0451\u043c\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u0441\u00a0 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c\u0438!<\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f<\/font><\/h3>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>parse<\/code> \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0438 \u0435\u0451 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, <code>parse_statement<\/code>, \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>lex<\/code> \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041f\u0440\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u043e\u0433\u043e, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043e\u043d\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 <code>if<\/code> \u0438\u043b\u0438 <code>return<\/code>, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c.<\/p>\n<pre><code class=\"rust\">fn parse_statement(raw: &amp;[char], tokens: &amp;[Token], index: usize) -> Option&lt;(Statement, usize)> { \u00a0\u00a0\u00a0\u00a0let parsers = [ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parse_if, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parse_expression_statement, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parse_return, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parse_function, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parse_local, \u00a0\u00a0\u00a0\u00a0]; \u00a0\u00a0\u00a0\u00a0for parser in parsers { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let res = parser(raw, tokens, index); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if res.is_some() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return res; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0None }  pub fn parse(raw: &amp;[char], tokens: Vec&lt;Token>) -> Result&lt;Ast, String> { \u00a0\u00a0\u00a0\u00a0let mut ast = vec![]; \u00a0\u00a0\u00a0\u00a0let mut index = 0; \u00a0\u00a0\u00a0\u00a0let ntokens = tokens.len(); \u00a0\u00a0\u00a0\u00a0while index &lt; ntokens { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let res = parse_statement(raw, &amp;tokens, index); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if let Some((stmt, next_index)) = res { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0index = next_index; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ast.push(stmt); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0continue; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return Err(tokens[index].loc.debug(raw, \"Invalid token while parsing:\")); \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0Ok(ast) } <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/font><\/h3>\n<p>  \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043f\u043e\u0432 Rust. \u041e\u043d\u0430 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>parse_expression<\/code> (\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0441\u043a\u043e\u0440\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c), \u0432 \u0435\u0451 \u043a\u043e\u043d\u0446\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439.<\/p>\n<pre><code class=\"rust\">fn parse_expression_statement( \u00a0\u00a0\u00a0\u00a0raw: &amp;[char], \u00a0\u00a0\u00a0\u00a0tokens: &amp;[Token], \u00a0\u00a0\u00a0\u00a0index: usize, ) -> Option&lt;(Statement, usize)> { \u00a0\u00a0\u00a0\u00a0let mut next_index = index; \u00a0\u00a0\u00a0\u00a0let res = parse_expression(raw, tokens, next_index)?;  \u00a0\u00a0\u00a0\u00a0let (expr, next_next_index) = res; \u00a0\u00a0\u00a0\u00a0next_index = next_next_index; \u00a0\u00a0\u00a0\u00a0if !expect_syntax(tokens, next_index, \";\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tokens[next_index] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Expected semicolon after expression:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439  \u00a0\u00a0\u00a0\u00a0Some((Statement::Expression(expr), next_index)) } <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/font><\/h3>\n<p>  \u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u044d\u0442\u043e\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Lua \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043b\u0438\u0448\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u0430\u043c\u0438 (\u0447\u0438\u0441\u043b\u0430\u043c\u0438, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438) \u0438\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0441 \u0434\u0432\u0443\u043c\u044f \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430\u043c\u0438. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c, \u0442\u0443\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0434\u0432\u0443\u043c\u044f \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430\u043c\u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0422\u043e \u0435\u0441\u0442\u044c, \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432\u0440\u043e\u0434\u0435 <code>1 + 2 + 3<\/code> \u043d\u0430\u0434\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 <code>local tmp1 = 1 + 2;<\/code> <code>local tmp2 = tmp1 + 3;<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<pre><code class=\"rust\">fn parse_expression(raw: &amp;[char], tokens: &amp;[Token], index: usize) -> Option&lt;(Expression, usize)> { \u00a0\u00a0\u00a0\u00a0if index >= tokens.len() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0let t = tokens[index].clone(); \u00a0\u00a0\u00a0\u00a0let left = match t.kind { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TokenKind::Number => Expression::Literal(Literal::Number(t)), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TokenKind::Identifier => Expression::Literal(Literal::Identifier(t)), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0_ => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0}; <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0437\u0430 \u043f\u0435\u0440\u0432\u044b\u043c \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u043e\u043c \u0438\u0434\u0451\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u0430\u044f \u0441\u043a\u043e\u0431\u043a\u0430 \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u2014 \u043c\u044b \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0let mut next_index = index + 1; \u00a0\u00a0\u00a0\u00a0if expect_syntax(tokens, next_index, \"(\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u0441\u043a\u043e\u0431\u043a\u0443  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u0412\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let mut arguments: Vec&lt;Expression> = vec![]; <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>parse_expression<\/code>.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0while !expect_syntax(tokens, next_index, \")\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if arguments.is_empty() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if !expect_syntax(tokens, next_index, \",\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tokens[next_index] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Expected comma between function call arguments:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let res = parse_expression(raw, tokens, next_index); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if let Some((arg, next_next_index)) = res { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_index = next_next_index; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0arguments.push(arg); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tokens[next_index] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Expected valid expression in function call arguments:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u0441\u043a\u043e\u0431\u043a\u0443  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return Some(( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Expression::FunctionCall(FunctionCall { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name: tokens[index].clone(), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0arguments, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_index, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)); \u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0436\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0441\u043a\u043e\u0431\u043a\u0438 \u043d\u0435\u0442, \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u043b\u0438\u0431\u043e \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043b\u0438\u0431\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0441 \u0434\u0432\u0443\u043c\u044f \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c, \u0437\u043d\u0430\u0447\u0438\u0442 \u2014 \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441 \u0434\u0432\u0443\u043c\u044f \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430\u043c\u0438.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0\/\/ \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u00a0\u00a0\u00a0\u00a0if next_index >= tokens.len() || tokens[next_index].clone().kind != TokenKind::Operator { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return Some((left, next_index)); \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\/\/ \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441 \u0434\u0432\u0443\u043c\u044f \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430\u043c\u0438 \u00a0\u00a0\u00a0\u00a0let op = tokens[next_index].clone(); \u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u043d\u0434  \u00a0\u00a0\u00a0\u00a0if next_index >= tokens.len() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tokens[next_index] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Expected valid right hand side binary operand:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0let rtoken = tokens[next_index].clone(); <\/code><\/pre>\n<p>  \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0443\u0442 \u043c\u044b \u043c\u043e\u0436\u0435\u043c (\u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c) \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>parse_expression<\/code>. \u041f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u043d\u0435 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0443\u0442 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0430\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0431\u044b\u043b \u0431\u044b \u0434\u0440\u0443\u0433\u043e\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u043b.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0let right = match rtoken.kind { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TokenKind::Number => Expression::Literal(Literal::Number(rtoken)), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0TokenKind::Identifier => Expression::Literal(Literal::Identifier(rtoken)), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0_ => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0rtoken \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Expected valid right hand side binary operand:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0}; \u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u043d\u0434 \u0438\u0437 \u043f\u0440\u0430\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f  \u00a0\u00a0\u00a0\u00a0Some(( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Expression::BinaryOperation(BinaryOperation { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0left: Box::new(left), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0right: Box::new(right), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0operator: op, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_index, \u00a0\u00a0\u00a0\u00a0)) } <\/code><\/pre>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d!<\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/font><\/h3>\n<p>  \u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 <code>function<\/code>, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430.<\/p>\n<pre><code class=\"rust\">fn parse_function(raw: &amp;[char], tokens: &amp;[Token], index: usize) -> Option&lt;(Statement, usize)> { \u00a0\u00a0\u00a0\u00a0if !expect_keyword(tokens, index, \"function\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0let mut next_index = index + 1; \u00a0\u00a0\u00a0\u00a0if !expect_identifier(tokens, next_index) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tokens[next_index] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Expected valid identifier for function name:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0let name = tokens[next_index].clone(); <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0438\u043c\u0435\u043d\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c, \u0438\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432, \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u044f\u0442\u044b\u043c\u0438.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u043c\u044f \u00a0\u00a0\u00a0\u00a0if !expect_syntax(tokens, next_index, \"(\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tokens[next_index] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Expected open parenthesis in function declaration:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0441\u043a\u043e\u0431\u043a\u0443 \u00a0\u00a0\u00a0\u00a0let mut parameters: Vec&lt;Token> = vec![]; \u00a0\u00a0\u00a0\u00a0while !expect_syntax(tokens, next_index, \")\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if !parameters.is_empty() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if !expect_syntax(tokens, next_index, \",\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!(\"{}\", tokens[next_index].loc.debug(raw, \"Expected comma or close parenthesis after parameter in function declaration:\")); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parameters.push(tokens[next_index].clone()); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0441\u043a\u043e\u0431\u043a\u0443 <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u2014 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0432\u0441\u0435\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0432 \u0442\u0435\u043b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0437\u0430\u043d\u0438\u043c\u0430\u044f\u0441\u044c \u044d\u0442\u0438\u043c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0451\u043c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>end<\/code>.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0let mut statements: Vec&lt;Statement> = vec![]; \u00a0\u00a0\u00a0\u00a0while !expect_keyword(tokens, next_index, \"end\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let res = parse_statement(raw, tokens, next_index); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if let Some((stmt, next_next_index)) = res { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_index = next_next_index; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0statements.push(stmt); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tokens[next_index] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Expected valid statement in function declaration:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c end  \u00a0\u00a0\u00a0\u00a0Some(( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Statement::FunctionDeclaration(FunctionDeclaration { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parameters, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0body: statements, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_index, \u00a0\u00a0\u00a0\u00a0)) } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0440\u0430\u0431\u043e\u0442 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043f\u0430\u0440\u0441\u0435\u0440\u0430.<\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 return<\/font><\/h3>\n<p>  \u0412\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>return<\/code> \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 <code>return<\/code>, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0442\u043e\u0447\u043a\u0438 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439.<\/p>\n<pre><code class=\"rust\">fn parse_return(raw: &amp;[char], tokens: &amp;[Token], index: usize) -> Option&lt;(Statement, usize)> { \u00a0\u00a0\u00a0\u00a0if !expect_keyword(tokens, index, \"return\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0let mut next_index = index + 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c return \u00a0\u00a0\u00a0\u00a0let res = parse_expression(raw, tokens, next_index); \u00a0\u00a0\u00a0\u00a0if res.is_none() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tokens[next_index] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Expected valid expression in return statement:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0let (expr, next_next_index) = res.unwrap(); \u00a0\u00a0\u00a0\u00a0next_index = next_next_index; \u00a0\u00a0\u00a0\u00a0if !expect_syntax(tokens, next_index, \";\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tokens[next_index] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Expected semicolon in return statement:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439  \u00a0\u00a0\u00a0\u00a0Some((Statement::Return(Return { expression: expr }), next_index)) } <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445<\/font><\/h3>\n<p>  \u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 <code>local<\/code>. \u041f\u043e\u0442\u043e\u043c \u0438\u0434\u0451\u0442 \u0438\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u0437\u0430\u0442\u0435\u043c \u2014 \u0437\u043d\u0430\u043a \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430, \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0442\u043e\u0447\u043a\u0430 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439.<\/p>\n<pre><code class=\"rust\">fn parse_local(raw: &amp;[char], tokens: &amp;[Token], index: usize) -> Option&lt;(Statement, usize)> { \u00a0\u00a0\u00a0\u00a0if !expect_keyword(tokens, index, \"local\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0let mut next_index = index + 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c local  \u00a0\u00a0\u00a0\u00a0if !expect_identifier(tokens, next_index) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tokens[next_index] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Expected valid identifier for local name:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0let name = tokens[next_index].clone(); \u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u043c\u044f  \u00a0\u00a0\u00a0\u00a0if !expect_syntax(tokens, next_index, \"=\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tokens[next_index] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Expected = syntax after local name:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c =  \u00a0\u00a0\u00a0\u00a0let res = parse_expression(raw, tokens, next_index); \u00a0\u00a0\u00a0\u00a0if res.is_none() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tokens[next_index] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Expected valid expression in local declaration:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0let (expr, next_next_index) = res.unwrap(); \u00a0\u00a0\u00a0\u00a0next_index = next_next_index;  \u00a0\u00a0\u00a0\u00a0if !expect_syntax(tokens, next_index, \";\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tokens[next_index] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Expected semicolon in return statement:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439  \u00a0\u00a0\u00a0\u00a0Some(( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Statement::Local(Local { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0expression: expr, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_index, \u00a0\u00a0\u00a0\u00a0)) } <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 if<\/font><\/h3>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Lua \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>elseif<\/code> \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>if<\/code> \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043b\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 <code>if<\/code> \u0448\u043b\u0430 \u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f. \u0417\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 <code>else<\/code>, \u0430 \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043b\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>if<\/code> (\u0441\u043f\u0438\u0441\u043e\u043a \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439). \u0412 \u043a\u043e\u043d\u0446\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>end<\/code>.<\/p>\n<pre><code class=\"rust\">fn parse_if(raw: &amp;[char], tokens: &amp;[Token], index: usize) -> Option&lt;(Statement, usize)> { \u00a0\u00a0\u00a0\u00a0if !expect_keyword(tokens, index, \"if\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0let mut next_index = index + 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c if \u00a0\u00a0\u00a0\u00a0let res = parse_expression(raw, tokens, next_index); \u00a0\u00a0\u00a0\u00a0if res.is_none() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tokens[next_index] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Expected valid expression for if test:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0let (test, next_next_index) = res.unwrap(); \u00a0\u00a0\u00a0\u00a0next_index = next_next_index;  \u00a0\u00a0\u00a0\u00a0if !expect_keyword(tokens, next_index, \"then\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c then  \u00a0\u00a0\u00a0\u00a0let mut statements: Vec&lt;Statement> = vec![]; \u00a0\u00a0\u00a0\u00a0while !expect_keyword(tokens, next_index, \"end\") { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let res = parse_statement(raw, tokens, next_index); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if let Some((stmt, next_next_index)) = res { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_index = next_next_index; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0statements.push(stmt); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tokens[next_index] \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Expected valid statement in if body:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return None; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0next_index += 1; \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c end  \u00a0\u00a0\u00a0\u00a0Some(( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Statement::If(If { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0test, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0body: statements, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0next_index, \u00a0\u00a0\u00a0\u00a0)) } <\/code><\/pre>\n<p>  \u0420\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0434 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043d\u0430 \u044d\u0442\u043e\u043c \u043e\u043a\u043e\u043d\u0447\u0435\u043d\u0430.<\/p>\n<h2><font color=\"#3AC1EF\">\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0441\u0430\u043c\u043e\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b<\/font><\/h2>\n<p>  \u041d\u0430\u0448\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0441\u0442\u0435\u043a\u0435, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0442\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430 \u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434.<\/p>\n<p>  \u041f\u0440\u0438\u043d\u044f\u0442\u043e\u0435 \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043e \u0432\u044b\u0437\u043e\u0432\u0430\u0445 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0432 \u0441\u0442\u0435\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043a\u0430\u0434\u0440\u0430 \u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432 \u0441\u0442\u0435\u043a \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 (\u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0439 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438). \u0414\u0430\u043b\u0435\u0435 \u2014 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043a\u0430\u0434\u0440\u0430. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0432 \u0441\u0442\u0435\u043a\u0435 \u0434\u043b\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0445 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u043d\u0435\u043c\u0443, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043c\u0435\u0441\u0442\u0430, \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e \u043a\u0430\u0434\u0440\u0430 \u0432 \u043c\u0435\u0441\u0442\u043e, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0435\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c (\u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e-\u0442\u0430\u043a\u0438 \u0433\u043b\u0443\u043f\u043e).<\/p>\n<p>  \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u044f, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u00ab\u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c\u00bb, \u0430 \u0442\u0430\u043a \u0436\u0435 \u2014 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434, \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u0440\u0438 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438, \u0432\u043e\u0437\u0432\u0440\u0430\u0442, \u0432\u044b\u0437\u043e\u0432. \u041e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u043e\u0432 \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432, \u0430 \u0442\u0430\u043a \u0436\u0435 \u2014 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438.<\/p>\n<p>  \u042f \u043f\u043e\u044f\u0441\u043d\u044e \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439.<\/p>\n<pre><code class=\"rust\">use crate::parse::*; use std::collections::HashMap;  #[derive(Debug)] enum Instruction { \u00a0\u00a0\u00a0\u00a0DupPlusFP(i32), \u00a0\u00a0\u00a0\u00a0MoveMinusFP(usize, i32), \u00a0\u00a0\u00a0\u00a0MovePlusFP(usize), \u00a0\u00a0\u00a0\u00a0Store(i32), \u00a0\u00a0\u00a0\u00a0Return, \u00a0\u00a0\u00a0\u00a0JumpIfNotZero(String), \u00a0\u00a0\u00a0\u00a0Jump(String), \u00a0\u00a0\u00a0\u00a0Call(String, usize), \u00a0\u00a0\u00a0\u00a0Add, \u00a0\u00a0\u00a0\u00a0Subtract, \u00a0\u00a0\u00a0\u00a0LessThan, } <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>Program<\/code>. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c.<\/p>\n<pre><code class=\"rust\">#[derive(Debug)] struct Symbol { \u00a0\u00a0\u00a0\u00a0location: i32, \u00a0\u00a0\u00a0\u00a0narguments: usize, \u00a0\u00a0\u00a0\u00a0nlocals: usize, }  #[derive(Debug)] pub struct Program { \u00a0\u00a0\u00a0\u00a0syms: HashMap&lt;String, Symbol>, \u00a0\u00a0\u00a0\u00a0instructions: Vec&lt;Instruction>, } <\/code><\/pre>\n<p>  \u0412 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e. \u041e\u043d\u0430, \u043a\u0430\u043a \u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433, \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u044b\u0437\u043e\u0432\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>compile_statement<\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u0437 AST.<\/p>\n<pre><code class=\"rust\">pub fn compile(raw: &amp;[char], ast: Ast) -> Program { \u00a0\u00a0\u00a0\u00a0let mut locals: HashMap&lt;String, i32> = HashMap::new(); \u00a0\u00a0\u00a0\u00a0let mut pgrm = Program { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0syms: HashMap::new(), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0instructions: Vec::new(), \u00a0\u00a0\u00a0\u00a0}; \u00a0\u00a0\u00a0\u00a0for stmt in ast { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0compile_statement(&amp;mut pgrm, raw, &amp;mut locals, stmt); \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0pgrm } <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>compile_statement<\/code>, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u0435\u0442 \u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0438\u0434\u043e\u0432.<\/p>\n<pre><code class=\"rust\">fn compile_statement( \u00a0\u00a0\u00a0\u00a0pgrm: &amp;mut Program, \u00a0\u00a0\u00a0\u00a0raw: &amp;Vec&lt;char>, \u00a0\u00a0\u00a0\u00a0locals: &amp;mut HashMap&lt;String, i32>, \u00a0\u00a0\u00a0\u00a0stmt: Statement, ) { \u00a0\u00a0\u00a0\u00a0match stmt { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Statement::FunctionDeclaration(fd) => compile_declaration(pgrm, raw, locals, fd), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Statement::Return(r) => compile_return(pgrm, raw, locals, r), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Statement::If(if_) => compile_if(pgrm, raw, locals, if_), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Statement::Local(loc) => compile_local(pgrm, raw, locals, loc), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Statement::Expression(e) => compile_expression(pgrm, raw, locals, e), \u00a0\u00a0\u00a0\u00a0} } <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/font><\/h3>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0441 \u0441\u0430\u043c\u044b\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u2014 \u0441 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0418\u0445 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0442 \u0437\u0430\u0449\u0438\u0442\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0438\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u043b\u0438\u0441\u044c \u0431\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<pre><code class=\"rust\">fn compile_declaration( \u00a0\u00a0\u00a0\u00a0pgrm: &amp;mut Program, \u00a0\u00a0\u00a0\u00a0raw: &amp;[char], \u00a0\u00a0\u00a0\u00a0_: &amp;mut HashMap&lt;String, i32>, \u00a0\u00a0\u00a0\u00a0fd: FunctionDeclaration, ) { \u00a0\u00a0\u00a0\u00a0\/\/ \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043a\u043e\u043d\u0446\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0437\u0430\u0449\u0438\u0442\u044b \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u00a0\u00a0\u00a0\u00a0let done_label = format!(\"function_done_{}\", pgrm.instructions.len()); \u00a0\u00a0\u00a0\u00a0pgrm.instructions \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.push(Instruction::Jump(done_label.clone())); <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u2014 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0435\u0449\u0451 \u043e\u0434\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\/\u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0435\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  \u041f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u044b \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0432 \u0441\u0442\u0435\u043a, \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u044f \u043f\u0435\u0440\u0435\u0434 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u043a\u0430\u0434\u0440\u0430. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u043e\u0439\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0435\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0let mut new_locals = HashMap::&lt;String, i32>::new();  \u00a0\u00a0\u00a0\u00a0let function_index = pgrm.instructions.len() as i32; \u00a0\u00a0\u00a0\u00a0let narguments = fd.parameters.len(); \u00a0\u00a0\u00a0\u00a0for (i, param) in fd.parameters.iter().enumerate() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pgrm.instructions.push(Instruction::MoveMinusFP( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0i, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0narguments as i32 - (i as i32 + 1), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0)); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0new_locals.insert(param.value.clone(), i as i32); \u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0for stmt in fd.body { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0compile_statement(pgrm, raw, &amp;mut new_locals, stmt); \u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0442\u0435\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u043d\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f <code>location<\/code> \u0443\u0436\u0435 \u0437\u0430\u0434\u0430\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u2014 \u0442\u043e \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0pgrm.syms.insert( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fd.name.value, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Symbol { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0location: function_index as i32, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0narguments, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0nlocals: new_locals.keys().len(), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0); <\/code><\/pre>\n<p>  \u0418 \u043c\u044b, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u043c\u0435\u0442\u043a\u043e\u0439, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043d\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u042d\u0442\u043e, \u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043e\u0442 0 \u0434\u043e N.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0pgrm.syms.insert( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0done_label, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Symbol { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0location: pgrm.instructions.len() as i32, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0narguments: 0, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0nlocals: 0, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0); } <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0432\u0441\u0451 \u0438 \u0441\u043b\u043e\u0436\u043d\u043e. \u0410 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0431\u0443\u0434\u0435\u0442 \u0435\u0449\u0451 \u043f\u0440\u043e\u0449\u0435.<\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445<\/font><\/h3>\n<p>  \u041c\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043c\u0451\u043d, \u0443\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b). \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0441\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u043a\u0435\u043d\u0430 <code>identifier<\/code> \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043a\u0430\u0434\u0440\u0430.<\/p>\n<pre><code class=\"rust\">fn compile_local( \u00a0\u00a0\u00a0\u00a0pgrm: &amp;mut Program, \u00a0\u00a0\u00a0\u00a0raw: &amp;[char], \u00a0\u00a0\u00a0\u00a0locals: &amp;mut HashMap&lt;String, i32>, \u00a0\u00a0\u00a0\u00a0local: Local, ) { \u00a0\u00a0\u00a0\u00a0let index = locals.keys().len(); \u00a0\u00a0\u00a0\u00a0locals.insert(local.name.value, index as i32); \u00a0\u00a0\u00a0\u00a0compile_expression(pgrm, raw, locals, local.expression); \u00a0\u00a0\u00a0\u00a0pgrm.instructions.push(Instruction::MovePlusFP(index)); } <\/code><\/pre>\n<p>  \u0418 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0432 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u043e\u0431\u0440\u0430\u0442\u043d\u043e, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u0441\u0442\u0435\u043a\u0435.<\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u041b\u0438\u0442\u0435\u0440\u0430\u043b\u044b<\/font><\/h3>\n<p>  \u0427\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <code>store<\/code> \u0434\u043b\u044f \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u0435\u043b \u0432 \u0441\u0442\u0435\u043a. \u041b\u0438\u0442\u0435\u0440\u0430\u043b\u044b-\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0438\u0437 \u0441\u0432\u043e\u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0445 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043a\u0430\u0434\u0440\u0430, \u0432 \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0435\u043a\u0430.<\/p>\n<pre><code class=\"rust\">fn compile_literal( \u00a0\u00a0\u00a0\u00a0pgrm: &amp;mut Program, \u00a0\u00a0\u00a0\u00a0_: &amp;[char], \u00a0\u00a0\u00a0\u00a0locals: &amp;mut HashMap&lt;String, i32>, \u00a0\u00a0\u00a0\u00a0lit: Literal, ) { \u00a0\u00a0\u00a0\u00a0match lit { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Literal::Number(i) => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let n = i.value.parse::&lt;i32>().unwrap(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pgrm.instructions.push(Instruction::Store(n)); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Literal::Identifier(ident) => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pgrm.instructions \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.push(Instruction::DupPlusFP(locals[&amp;ident.value])); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0} } <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0412\u044b\u0437\u043e\u0432\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/font><\/h3>\n<p>  \u0422\u0443\u0442 \u0432\u0441\u0451 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e: \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0432\u044b\u0437\u043e\u0432\u0430.<\/p>\n<pre><code class=\"rust\">fn compile_function_call( \u00a0\u00a0\u00a0\u00a0pgrm: &amp;mut Program, \u00a0\u00a0\u00a0\u00a0raw: &amp;Vec&lt;char>, \u00a0\u00a0\u00a0\u00a0locals: &amp;mut HashMap&lt;String, i32>, \u00a0\u00a0\u00a0\u00a0fc: FunctionCall, ) { \u00a0\u00a0\u00a0\u00a0let len = fc.arguments.len(); \u00a0\u00a0\u00a0\u00a0for arg in fc.arguments { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0compile_expression(pgrm, raw, locals, arg); \u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0pgrm.instructions \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.push(Instruction::Call(fc.name.value, len)); } <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0434\u0432\u0443\u043c\u044f \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430\u043c\u0438<\/font><\/h3>\n<p>  \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0434\u0432\u0443\u043c\u044f \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430\u043c\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0442\u0430\u043a: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u2014 \u0438\u0445 \u043b\u0435\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c, \u043f\u043e\u0442\u043e\u043c \u2014 \u043f\u0440\u0430\u0432\u0430\u044f, \u0430 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0432 \u043d\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f. \u0412\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438. \u041e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u0434\u0432\u0443\u043c\u044f \u0432\u0435\u0440\u0445\u043d\u0438\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0435\u043a\u0430.<\/p>\n<pre><code class=\"rust\">fn compile_binary_operation( \u00a0\u00a0\u00a0\u00a0pgrm: &amp;mut Program, \u00a0\u00a0\u00a0\u00a0raw: &amp;[char], \u00a0\u00a0\u00a0\u00a0locals: &amp;mut HashMap&lt;String, i32>, \u00a0\u00a0\u00a0\u00a0bop: BinaryOperation, ) { \u00a0\u00a0\u00a0\u00a0compile_expression(pgrm, raw, locals, *bop.left); \u00a0\u00a0\u00a0\u00a0compile_expression(pgrm, raw, locals, *bop.right); \u00a0\u00a0\u00a0\u00a0match bop.operator.value.as_str() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"+\" => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pgrm.instructions.push(Instruction::Add); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"-\" => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pgrm.instructions.push(Instruction::Subtract); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"&lt;\" => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pgrm.instructions.push(Instruction::LessThan); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0_ => panic!( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"{}\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bop.operator \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.loc \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.debug(raw, \"Unable to compile binary operation:\") \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0), \u00a0\u00a0\u00a0\u00a0} } <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/font><\/h3>\n<p>  \u041f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0412\u044b\u0431\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0438\u043f\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u042d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u044b \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438.<\/p>\n<pre><code class=\"rust\">fn compile_expression( \u00a0\u00a0\u00a0\u00a0pgrm: &amp;mut Program, \u00a0\u00a0\u00a0\u00a0raw: &amp;[char], \u00a0\u00a0\u00a0\u00a0locals: &amp;mut HashMap&lt;String, i32>, \u00a0\u00a0\u00a0\u00a0exp: Expression, ) { \u00a0\u00a0\u00a0\u00a0match exp { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Expression::BinaryOperation(bop) => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0compile_binary_operation(pgrm, raw, locals, bop); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Expression::FunctionCall(fc) => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0compile_function_call(pgrm, raw, locals, fc); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Expression::Literal(lit) => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0compile_literal(pgrm, raw, locals, lit); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0} } <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 if<\/font><\/h3>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c, \u0438\u0434\u0443\u0449\u0438\u043c \u043f\u043e\u0441\u043b\u0435 <code>if<\/code>.<\/p>\n<pre><code class=\"rust\">fn compile_if(pgrm: &amp;mut Program, raw: &amp;[char], locals: &amp;mut HashMap&lt;String, i32>, if_: If) { \u00a0\u00a0\u00a0\u00a0compile_expression(pgrm, raw, locals, if_.test); \u00a0\u00a0\u00a0\u00a0let done_label = format!(\"if_else_{}\", pgrm.instructions.len()); \u00a0\u00a0\u00a0\u00a0pgrm.instructions \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.push(Instruction::JumpIfNotZero(done_label.clone())); <\/code><\/pre>\n<p>  \u041f\u043e\u0442\u043e\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u043b\u043e <code>if<\/code>.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0for stmt in if_.body { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0compile_statement(pgrm, raw, locals, stmt); \u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  \u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u2014 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 <code>done<\/code> \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043f\u043e\u0441\u043b\u0435 <code>if<\/code>.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0pgrm.syms.insert( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0done_label, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Symbol { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0location: pgrm.instructions.len() as i32 - 1, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0nlocals: 0, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0narguments: 0, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0); } <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 return<\/font><\/h3>\n<p>  \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0442\u0438\u043f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 <code>return<\/code>. \u041f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0442\u0430\u043a\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <code>return<\/code>.<\/p>\n<pre><code class=\"rust\">fn compile_return( \u00a0\u00a0\u00a0\u00a0pgrm: &amp;mut Program, \u00a0\u00a0\u00a0\u00a0raw: &amp;[char], \u00a0\u00a0\u00a0\u00a0locals: &amp;mut HashMap&lt;String, i32>, \u00a0\u00a0\u00a0\u00a0ret: Return, ) { \u00a0\u00a0\u00a0\u00a0compile_expression(pgrm, raw, locals, ret.expression); \u00a0\u00a0\u00a0\u00a0pgrm.instructions.push(Instruction::Return); } <\/code><\/pre>\n<p>  \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0433\u043e\u0442\u043e\u0432! \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u2014 \u0440\u0435\u0448\u0438\u043c \u0441\u0430\u043c\u0443\u044e \u0445\u0438\u0442\u0440\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443. \u0420\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0434 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u043c \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043e\u043f\u0438\u0448\u0443 \u043d\u0438\u0436\u0435, \u0437\u0430\u043d\u044f\u043b\u0430 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u043e\u0432, \u043d\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0432\u043e\u0437\u043d\u0451\u0439 \u0441 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u043e\u043c \u0438 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043a\u043e\u0434\u0430.<\/p>\n<h2><font color=\"#3AC1EF\">\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430<\/font><\/h2>\n<p>  \u0418\u0442\u0430\u043a, \u043d\u0430\u043c \u043d\u0430 \u0440\u0443\u043a\u0443 \u0442\u043e, \u0447\u0442\u043e \u0442\u0443\u0442 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430, \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043a\u0430\u0434\u0440\u0430. \u0418\u043c\u0435\u0435\u0442\u0441\u044f \u0442\u0443\u0442 \u0438 \u0441\u0442\u0435\u043a \u0434\u0430\u043d\u043d\u044b\u0445. \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043a\u0430\u0434\u0440\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u043e \u0432 \u0441\u0442\u0435\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p>  \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438.<\/p>\n<pre><code class=\"rust\">pub fn eval(pgrm: Program) { \u00a0\u00a0\u00a0\u00a0let mut pc: i32 = 0; \u00a0\u00a0\u00a0\u00a0let mut fp: i32 = 0; \u00a0\u00a0\u00a0\u00a0let mut data: Vec&lt;i32> = vec![];  \u00a0\u00a0\u00a0\u00a0while pc &lt; pgrm.instructions.len() as i32 { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0match &amp;pgrm.instructions[pc as usize] { <\/code><\/pre>\n<p>  \u041a\u0430\u0436\u0434\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u0430 \u0437\u0430 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 \u0438\u043b\u0438 \u0437\u0430 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430.<\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0421\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u00ab\u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c\u00bb<\/font><\/h3>\n<p>  \u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432. \u041c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Instruction::Add => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let right = data.pop().unwrap(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let left = data.pop().unwrap(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data.push(left + right); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pc += 1; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Instruction::Subtract => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let right = data.pop().unwrap(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let left = data.pop().unwrap(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data.push(left - right); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pc += 1; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Instruction::LessThan => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let right = data.pop().unwrap(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let left = data.pop().unwrap(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data.push(if left &lt; right { 1 } else { 0 }); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pc += 1; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>store<\/code> \u0442\u043e\u0436\u0435 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442. \u041e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e\u0432\u043e\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u043b \u0432 \u0441\u0442\u0435\u043a.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Instruction::Store(n) => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data.push(*n); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pc += 1; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0420\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b<\/font><\/h3>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u0442\u043e\u0436\u0435 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e. \u041d\u0430\u0434\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u043c\u0435\u0441\u0442\u0435, \u043a\u0443\u0434\u0430 \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438, \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0440\u0435\u0447\u044c \u0438\u0434\u0451\u0442 \u043e\u0431 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u2014 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u0435.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Instruction::JumpIfNotZero(label) => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let top = data.pop().unwrap(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if top == 0 { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pc = pgrm.syms[label].location; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pc += 1; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Instruction::Jump(label) => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pc = pgrm.syms[label].location; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445<\/font><\/h3>\n<p>  \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>MovePlusFP<\/code> \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 (\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e \u043a\u0430\u0434\u0440\u0430) \u0432 \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0435\u043a\u0430. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u0438 \u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Instruction::MovePlusFP(i) => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let val = data.pop().unwrap(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let index = fp as usize + *i; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043e \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0while index >= data.len() { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data.push(0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data[index] = val; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pc += 1; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445<\/font><\/h3>\n<p>  \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>DupPlusFP<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>compile_locals<\/code> \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u0441\u0442\u0435\u043a\u0435 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0438\u0445 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043a\u0430\u0434\u0440\u0430.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Instruction::DupPlusFP(i) => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data.push(data[(fp + i) as usize]); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pc += 1; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0414\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/font><\/h3>\n<p>  \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>MoveMinusFP<\/code> \u2014 \u044d\u0442\u043e, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u00ab\u0445\u0430\u043a\u00bb, \u043d\u0443\u0436\u043d\u044b\u0439 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0435\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. \u041e\u043d\u0430 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043c\u0435\u0441\u0442\u0430, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e\u0441\u044f \u0437\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u043a\u0430\u0434\u0440\u0430, \u0432 \u043c\u0435\u0441\u0442\u043e, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0435\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Instruction::MoveMinusFP(local_offset, fp_offset) => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data[fp as usize + local_offset] = data[(fp - (fp_offset + 4)) as usize]; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pc += 1; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  \u041d\u0430\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043b\u0438\u0448\u044c \u0441 \u0434\u0432\u0443\u043c\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438: <code>call<\/code> \u0438 <code>return<\/code>.<\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f call<\/font><\/h3>\n<p>  \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>call<\/code> \u043f\u043e-\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u043c\u0443 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0442\u0430\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u2014 <code>print<\/code>).<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Instruction::Call(label, narguments) => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if label == \"print\" { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for _ in 0..*narguments { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print!(\"{}\", data.pop().unwrap()); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print!(\" \"); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0println!(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pc += 1; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0continue; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0432 \u0441\u0442\u0435\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043a\u0430\u0434\u0440\u0430, \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434, \u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 (\u043d\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445). \u041e\u043d\u0430, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u043d\u043e\u0441\u0442\u044c. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e <code>call<\/code> \u0437\u0430\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e \u043a\u0430\u0434\u0440\u0430, \u0430 \u043f\u043e\u0442\u043e\u043c, \u043f\u043e\u0441\u043b\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043a\u0430\u0434\u0440\u0430, \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data.push(fp); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data.push(pc + 1); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data.push(pgrm.syms[label].narguments as i32); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pc = pgrm.syms[label].location; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fp = data.len() as i32;  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let mut nlocals = pgrm.syms[label].nlocals; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0while nlocals > 0 { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data.push(0); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0nlocals -= 1; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 return<\/font><\/h3>\n<p>  \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>return<\/code> \u0431\u0435\u0440\u0451\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430. \u041f\u043e\u0442\u043e\u043c \u043e\u043d\u0430 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u043e\u0442\u0442\u0443\u0434\u0430 \u0432\u0441\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b. \u0414\u0430\u043b\u0435\u0435 \u2014 \u043e\u043d\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043a\u0430\u0434\u0440\u0430, \u0430 \u0442\u0430\u043a \u0436\u0435 \u2014 \u0431\u0435\u0440\u0451\u0442 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u043a\u0430\u0434\u0440\u0430. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043e\u043d\u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u0442\u0435\u043a.<\/p>\n<pre><code class=\"rust\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Instruction::Return => { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let ret = data.pop().unwrap();  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0while fp &lt; data.len() as i32 { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data.pop(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let mut narguments = data.pop().unwrap(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pc = data.pop().unwrap(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0fp = data.pop().unwrap();  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0while narguments > 0 { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data.pop(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0narguments -= 1; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data.push(ret); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} <\/code><\/pre>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0431\u0443\u0434\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435, \u0435\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b, \u0432 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435, \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a \u0438 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0438\u0445 \u0438\u0437 \u043d\u0435\u0433\u043e, \u043c\u044b \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0438\u043b\u0438 \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430.<\/p>\n<p>  \u0412\u043e\u0442 \u0438 \u0432\u0441\u0451! \u041c\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430\u0434 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u043c\u0438 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u043c, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u044b \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c Lua. \u0421\u0442\u0440\u0430\u043d\u043d\u043e\u0432\u0430\u0442\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c? \u0414\u0430. \u041f\u0440\u043e\u0441\u0442\u0430\u044f? \u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u0447\u0442\u043e \u0442\u0430\u043a. \u0420\u0430\u0431\u043e\u0447\u0430\u044f? \u0422\u0430\u043a\u043e\u0435 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0430\u044f!<\/p>\n<h2><font color=\"#3AC1EF\">\u0418\u0442\u043e\u0433\u0438<\/font><\/h2>\n<p>  \u0418\u0442\u0430\u043a, \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u043c\u0435\u043d\u0435\u0435 \u0447\u0435\u043c 1200 \u0441\u0442\u0440\u043e\u043a Rust-\u043a\u043e\u0434\u0430, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043d\u0435\u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435, \u0447\u0442\u043e \u0443\u043c\u0435\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 Lua. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438 \u0432 Lua 5.4.3 (\u044d\u0442\u043e \u2014 \u043d\u0435 LuaJIT). \u0427\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f?<\/p>\n<pre><code class=\"rust\">$ cargo build --release $ cat test\/fib.lua function fib(n) \u00a0\u00a0\u00a0if n &lt; 2 then \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return n; \u00a0\u00a0\u00a0end  \u00a0\u00a0\u00a0local n1 = fib(n-1); \u00a0\u00a0\u00a0local n2 = fib(n-2); \u00a0\u00a0\u00a0return n1 + n2; end  print(fib(30)); $ time .\/target\/release\/lust test\/fib.lua 832040 .\/target\/release\/lust test\/fib.lua\u00a0 0.29s user 0.00s system 99% cpu 0.293 total $ time lua test\/fib.lua 832040 lua test\/fib.lua\u00a0 0.06s user 0.00s system 99% cpu 0.063 total <\/code><\/pre>\n<p>  \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043d\u0430\u0448\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Lua \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439. \u0410 \u0437\u043d\u0430\u0447\u0438\u0442 \u2014 \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u0434\u0430, \u043e \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u0432\u044b\u0448\u0435.<\/p>\n<p>  \u0417\u0430\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u044c \u043b\u0438 \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0438\u043b\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d?<\/p>\n<p>  <a href=\"http:\/\/ruvds.com\/ru-rub?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=perevod&amp;utm_content=minimalnaya_realizaciya_lua_na_rust\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ou\/g5\/kh\/oug5kh6sjydt9llengsiebnp40w.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ou\/g5\/kh\/oug5kh6sjydt9llengsiebnp40w.png\"\/><\/a><\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/649973\/\"> https:\/\/habr.com\/ru\/company\/ruvds\/blog\/649973\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u044b \u043e\u0441\u0432\u043e\u0438\u0442\u0435 \u044d\u0442\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e, \u0432 \u0432\u0430\u0448\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Lua (\u043f\u0430\u0440\u0441\u0435\u0440, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430), \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u043d\u0430 Rust \u0441 \u0447\u0438\u0441\u0442\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0430. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 Lust, \u0435\u0433\u043e \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 <a href=\"https:\/\/github.com\/eatonphil\/lust\">GitHub<\/a>. <\/p>\n<p>  <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/649973\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/tp\/ei\/pm\/tpeipmwulztuxd2km9zcy2fo2og.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/tp\/ei\/pm\/tpeipmwulztuxd2km9zcy2fo2og.jpeg\" data-blurred=\"true\"\/><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-329931","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/329931","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=329931"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/329931\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=329931"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=329931"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=329931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}