{"id":482623,"date":"2026-06-06T11:03:50","date_gmt":"2026-06-06T11:03:50","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=482623"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=482623","title":{"rendered":"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0435\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438 \u043d\u0430 Rust #1: \u041b\u0435\u043a\u0441\u0435\u0440"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043d\u0443\u043b\u044f \u043d\u0430 Rust. \u041e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0441\u044c \u044f \u043d\u0430 \u0442\u0435\u0445, \u043a\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0438 \u044f\u0437\u044b\u043a\u0438 \u0438 \u0437\u043d\u0430\u0435\u0442 Rust, \u043d\u0443\u0436\u043d\u043e \u0443\u0436\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0432 \u043d\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f. \u042d\u0442\u043e\u0442 \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044f \u0432\u044b\u0431\u0440\u0430\u043b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u043e\u0432, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0433\u0438\u0431\u043a\u0438\u0439 \u043a\u043e\u0434, \u043d\u0443 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u043c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f)<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u044f \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u043e\u043c \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u044f\u0437\u044b\u043a\u043e\u0432, \u0438 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043c\u043e\u0433\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435 \u0441\u0430\u043c\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0443\u0433\u0443\u0431\u043e \u043c\u043e\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0411\u0443\u0434\u0443 \u0440\u0430\u0434, \u0435\u0441\u043b\u0438 \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u0435\u0441\u043b\u0438 \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0442\u0430\u043a\u043e\u0432\u044b\u0435.<\/p>\n<p>\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440, \u043d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u00ab\u041e \u043c\u043e\u0435\u043c \u043e\u043f\u044b\u0442\u0435\u00bb.<\/p>\n<blockquote>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0435\u0449\u0435 \u043e\u0431\u0449\u0438\u0439 \u0441\u043e\u0432\u0435\u0442 \u0447\u0430\u0439\u043d\u0438\u043a\u0430\u043c: \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u043d\u0430 \u043b\u0435\u0442\u0443, \u043f\u044b\u0442\u0430\u0439\u0442\u0435\u0441\u044c \u0432\u043d\u0438\u043a\u043d\u0443\u0442\u044c. \u041f\u0440\u043e\u0441\u0442\u043e \u044f \u0440\u0430\u043d\u044c\u0448\u0435 \u0447\u0430\u0441\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043b, \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0431\u0438\u0432\u0430\u043b \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0438\u0437\u0443\u0447\u0430\u043b. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443 \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u0439\u043c\u0443. \u0418 \u043a\u0430\u043a \u043f\u043e &#8212; \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043d\u0430\u0434\u043e \u0431\u0440\u043e\u0441\u0430\u0442\u044c. \u041c\u043e\u0436\u043d\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0431\u0443\u043c\u0430\u0433\u0435 \u0438\u043b\u0438 \u0432 \u043f\u0435\u0438\u043d\u0442\u0435, \u043d\u043e \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043c\u043e\u0442\u0440\u044e \u043d\u0430 \u043a\u043e\u0434, \u0438 \u0432\u043d\u0438\u043a\u0430\u044e, \u0432\u0441\u043a\u043e\u0440\u0435 \u0432\u043f\u0430\u0434\u0430\u044e \u0432 \u00ab\u043f\u043e\u0442\u043e\u043a\u00bb, \u0438 \u0443\u0436\u0435 \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e.<\/p>\n<\/blockquote>\n<h2>\u041e \u043c\u043e\u0435\u043c \u043e\u043f\u044b\u0442\u0435<\/h2>\n<p>\u042f \u043e\u0434\u0438\u043d \u0438\u0437 \u0442\u0435\u0445 \u043b\u044e\u0434\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043b\u044e\u0431\u044f\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043d\u0438\u0433\u0438 \u0438 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043e\u0440\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0447\u0438\u043d\u0430\u043b \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u043e\u0432 \u0441 \u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e OwnLang \u043e\u0442 Animmon&#8217;\u0430, \u0430 \u043d\u0435 \u0441 \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043d\u0438\u0433 \u0438\u043b\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0442\u0430\u0442\u0435\u0439.<\/p>\n<p>\u0418 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c, \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043f\u043e\u043a\u0430 \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043c\u043e\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043d\u0435 \u0431\u044b\u043b \u0434\u043e\u0432\u0435\u0434\u0435\u043d \u0434\u043e \u0443\u043c\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u044f \u0443\u0437\u043d\u0430\u0432\u0430\u043b, \u0447\u0442\u043e \u043a\u043e\u0434 \u043c\u043e\u0433 \u0431\u044b\u0442\u044c \u043b\u0443\u0447\u0448\u0435, \u044f \u0448\u0435\u043b \u0438 \u043f\u0438\u0441\u0430\u043b \u044f\u0437\u044b\u043a \u0441 \u043d\u0443\u043b\u044f, \u0443\u0436\u0435 \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u043d\u0438\u044f\u043c\u0438.  <\/p>\n<h2>\u0426\u0435\u043b\u044c<\/h2>\n<p>\u0422\u0443\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043f\u043e \u043f\u0443\u0442\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430 \u0438 \u0435\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430.<\/p>\n<p>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u044f\u0437\u044b\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 Python-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439. \u0422\u0430\u043a\u0436\u0435 \u044f\u0437\u044b\u043a, \u043a\u0430\u043a \u0443\u0436\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0438\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u043c. \u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0438\u0442\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 (AST). \u042f\u0437\u044b\u043a \u0431\u0443\u0434\u0435\u0442 \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u043b\u0430\u0431\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0435\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0438\u043f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u044f \u0434\u0443\u043c\u0430\u043b \u043d\u0430 \u0441\u0447\u0435\u0442 \u043e\u0448\u0438\u0431\u043e\u043a. \u0418 \u043f\u0440\u0438\u0448\u0435\u043b \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 \u0432\u044b\u0432\u043e\u0434\u0443, \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043c \u043e\u0448\u0438\u0431\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0438\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043b\u0438\u0448\u043d\u0438\u0439 \u0440\u0430\u0437 \u043d\u0435 \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0438\u0445 \u0438 \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u044f\u0437\u044b\u043a\u0430. \u0412 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043d\u0438 \u0432 \u043a\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u043a \u043d\u0435 \u0434\u0435\u043b\u0430\u0439\u0442\u0435! \u041b\u0443\u0447\u0448\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 Result, \u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0431\u0440\u043e\u0441\u043a\u0430 \u044f\u0437\u044b\u043a\u0430, \u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0433\u0430\u0439\u0434\u0430 \u0441\u043e\u0439\u0434\u0435\u0442.<\/p>\n<p>\u041d\u0443 \u0438 \u0441\u0430\u043c\u0438 \u0442\u0438\u043f\u044b, \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432: <strong>String, Boolean, Number.<\/strong> \u0412 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043f\u0438\u0441\u043a\u0438 \u0438 \u0442.\u0434., \u043d\u043e \u043f\u043e\u043a\u0430-\u0447\u0442\u043e \u043d\u0430\u043c \u0445\u0432\u0430\u0442\u0438\u0442 \u044d\u0442\u043e\u0433\u043e.<\/p>\n<p>\u041c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c if-elif-else, \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0446\u0438\u043a\u043b while, \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e \u0442\u0438\u043f\u0443 print \u0438 input. <\/p>\n<p>\u041a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">fn add(a, b) {    return a + b}n = num(input(\"Enter n: \"))a = add(num, 5 )if a &lt; 10 {    print(\"a &lt; 10\")} elif a &gt; 10 {    print(\"a &gt; 10\")} else {    print(\"a = 10\")}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0430\u043c \u043f\u0443\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0432\u044b\u043c:<\/p>\n<p>1) \u0422\u043e\u043a\u0435\u043d\u0438\u0437\u0430\u0446\u0438\u044f &#8212; \u0442\u0443\u0442 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u044b, \u0432 \u043e\u0431\u044c\u0435\u043a\u0442\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0439: \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438, \u043e\u0442\u0441\u0442\u0443\u043f \u043e\u0442 \u043d\u0430\u0441\u0430\u043b\u0430 \u0441\u0442\u0440\u043e\u043a\u0438, \u0434\u043b\u0438\u043d\u043d\u0443 \u0442\u043e\u043a\u0435\u043d\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u0442\u0435\u043a\u0441\u0442\u0435, \u044d\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u043a\u043e\u0434\u0435. \u0422\u0430\u043a\u0436\u0435 \u0432 \u0442\u043e\u043a\u0435\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0435\u0433\u043e \u0442\u0438\u043f, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Plus, Minus, \u0442\u0430\u043a \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u043a\u0430, \u0447\u0438\u0441\u043b\u043e \u0438\u043b\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e.<\/p>\n<p>2) \u041f\u0430\u0440\u0441\u0438\u043d\u0433 &#8212; \u0442\u0443\u0442, \u0434\u0443\u043c\u0430\u044e, \u0441\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u0434\u043b\u044f \u0447\u0430\u0439\u043d\u0438\u043a\u043e\u0432. \u0421\u043e\u0437\u0434\u0430\u0435\u043c AST (Abstract Syntax Tree). \u042f \u0441\u0430\u043c \u0434\u043e\u043b\u0433\u043e \u043d\u0435 \u043c\u043e\u0433 \u0437\u0430\u0448\u0430\u0440\u0438\u0442\u044c \u0437\u0430 \u044d\u0442\u043e (\u041f\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c), \u043d\u043e \u0435\u0441\u043b\u0438 \u043d\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c, \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0433\u043b\u044f\u043d\u044c\u0442\u0435 \u043a\u043d\u0438\u0433\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u00abEngeneering A Compiler\u00bb, \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0438\u0449\u0438\u0442\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443. \u042f \u0441\u0430\u043c \u043b\u0438\u0447\u043d\u043e \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u0430\u043c, \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u043e\u043f\u044b\u0442\u0435, \u043d\u043e \u0432\u0430\u043c \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0433\u0443\u0433\u043b\u0438\u0442\u044c) \u041d\u0443 \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e \u0441\u0430\u043c \u043f\u0430\u0440\u0441\u0438\u043d\u0433. <\/p>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u043f\u0430\u0440\u0441\u0435\u0440 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f: \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (+-*\/), \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f (&lt;, &gt;, &gt;=, &lt;=, ==, !=) \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (&amp;&amp; (\u0438), || (\u0438\u043b\u0438)), \u0442\u0430\u043a\u0436\u0435 \u0441\u043a\u043e\u0431\u043a\u0438. \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u043c \u0441\u043f\u0443\u0441\u043a\u0435: <\/p>\n<ol>\n<li>\n<p>primary &#8212; \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0442\u043e\u043a\u0435\u043d\u0430, \u0435\u0441\u043b\u0438 \u0442\u043e\u043a\u0435\u043d \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438, \u0442\u043e \u043f\u0430\u043d\u0438\u043a\u0443\u0435\u043c<\/p>\n<\/li>\n<li>\n<p>unary &#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u0430 ! (\u043d\u0435) \u0438 &#8212; (\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435)<\/p>\n<\/li>\n<li>\n<p>multiplicative &#8212; \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0432\u0441\u0451 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>additive &#8212; \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 <\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 (comparison) \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (logical) \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0437\u0436\u0435, \u043f\u043e\u043a\u0430-\u0447\u0442\u043e \u043d\u0430\u043c \u0445\u0432\u0430\u0442\u0438\u0442 \u044d\u0442\u043e\u0433\u043e. \u0422\u0430\u043a\u0436\u0435, \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 &#8212; \u044d\u0442\u043e if-elif-else, return (\u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u0439\u0442\u043c\u0435\u043d\u0442), \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0442.\u0434.. \u041f\u043e\u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0438\u0445 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0421\u0442\u0435\u0439\u0442\u043c\u0435\u043d\u0442\u0430\u043c\u0438 (Statement).<\/p>\n<p>3) \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0438\u0442\u0430\u0442\u043e\u0440\u0430! \u0423 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 &#8212; Stmt, \u0442\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432\u0441\u0435 \u0442\u0438\u043f\u044b \u0441\u0442\u0435\u0439\u0442\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0442\u0434. \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u0432\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 exec(&amp;self, rt: &amp;mut Runtime). \u0422\u0430\u043a\u0436\u0435, \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u043c\u044b \u043b\u0435\u0433\u043a\u043e \u0441\u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u0442\u043b\u044f\u0446\u0438\u044e \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u0438\u043b\u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u044f\u0437\u044b\u043a (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, QBE \u0438 LLVM).<\/p>\n<h2>\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c!<\/h2>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u0438 3 \u0444\u0430\u0439\u043b\u0430 \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 lexer: <strong>mod.rs<\/strong>, <strong>token.rs <\/strong>\u0438 <strong>lexer.rs<\/strong>.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c <strong>token.rs<\/strong>.<\/p>\n<p><strong>TokenKind<\/strong> &#8212; \u044d\u0442\u0438 \u0442\u0438\u043f \u0442\u043e\u043a\u0435\u043d\u0430, \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c, \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c \u0438\u043b\u0438 \u043b\u044e\u0431\u044b\u043c \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u044f\u0437\u044b\u043a\u0430. \u041d\u0438\u0436\u0435 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b enum \u0441 \u0432\u0441\u0435\u043c \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430, \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c <strong>TKind<\/strong>.<\/p>\n<p>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b (\u0418\u043c\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0444\u0443\u043d\u043a\u0446\u0438\u0439) \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0438. \u0414\u043b\u044f \u0447\u0438\u0441\u0435\u043b \u0438 \u0441\u0442\u0440\u043e\u043a \u0432 enum, \u0435\u0441\u0442\u044c \u043f\u043e\u0441\u0442\u0444\u0438\u043a\u0441 <strong>\u00abLit\u00bb<\/strong> &#8212; <strong>Literal<\/strong>, \u0442\u043e \u0435\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e\u0435 \u043d\u0435\u043f\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432 \u043a\u043e\u0434\u0435, \u044d\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0447\u0438\u0441\u043b\u0430.<\/p>\n<p>\u041a\u0435\u0439\u0432\u043e\u0440\u0434\u044b, \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b, \u0432\u0441\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: <strong>print<\/strong>, <strong>input<\/strong>, <strong>num<\/strong>, <strong>str<\/strong>. <\/p>\n<details class=\"spoiler\">\n<summary>lexer\/token.rs: TokenKind<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"rust\">pub type TKind = TokenKind;#[derive(Debug, Clone)]pub enum TokenKind {    Plus,  \/\/ +    Minus, \/\/ -    Slash, \/\/ \/    Star,  \/\/ *    LBrace, \/\/ {    RBrace, \/\/ }    LParen, \/\/ (    RParen, \/\/ )    Comma,  \/\/ ,    Assign, \/\/ =    Bang,   \/\/ !    Gt, \/\/ &gt;    Lt, \/\/ &lt;    Ge, \/\/ &gt;=    Le, \/\/ &lt;=    Eq, \/\/ ==    Ne, \/\/ !=    And, \/\/ &amp;&amp;    Or,  \/\/ ||    Id(String),    StrLit(String),    NumLit(f64),    Bool(bool),    \/\/ Keywords    Fn,    If,    Elif,    Else,    While,    Break,    Continue,    Return,    \/\/ Functions    Print,    Input,    Num,    Str,    Eof,}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>lexer\/token.rs: Token<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"rust\">#[derive(Debug, Clone)]pub struct Token {    pub kind: TKind,    pub len: usize,    pub pos: usize,    pub line: usize,    pub offset: usize,}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u0442\u043e\u043a\u0435\u043d\u0435, \u043a\u0430\u043a \u044f \u043f\u0438\u0441\u0430\u043b \u0440\u0430\u043d\u0435\u0435, \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0435\u0433\u043e \u0442\u0438\u043f, \u0438 2 \u0432\u0438\u0434\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435: \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0443\u044e (pos), \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u043e\u043a\u0438 (line, offset), \u0442\u0430\u043a\u0436\u0435 len \u0434\u043b\u044f \u043f\u043e\u043a\u0430\u0437\u0430 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a. <\/p>\n<p>line \u0438 offset \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u043a\u0430\u0437\u0430 \u043e\u0448\u0438\u0431\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u0437\u044f\u0442\u044c \u0432\u0441\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430, \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438, \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. pos \u0438 len \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u043f\u043e\u043a\u0430\u0437\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0443\u0436\u0435 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0438\u0442\u0430\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 \u0432 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0435 (\u0415\u0441\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u0440\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440)<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0448\u0438\u0431\u043a\u0438<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">Error in 0:20 - Unknown char0 | + - * \/ ! () {} , = ;  |                     ^<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0447\u043d\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u0435\u043a\u0441\u0435\u0440. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 Lexer. \u0412 \u043d\u0435\u0439 \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c: <strong>pos<\/strong>, <strong>line<\/strong>, <strong>offset<\/strong>, lines, chars, tokens.<\/p>\n<p><strong>pos<\/strong> \u0438 <strong>chars<\/strong> \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0431\u0435\u0440\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b.<\/p>\n<p><strong>line<\/strong> \u0438 <strong>offset<\/strong> &#8212; \u0438\u0445 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0434\u043b\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u043a\u0435\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438 \u0441\u0432\u043e\u0438 \u043f\u043e\u043b\u0437\u0438\u0446\u0438\u0438.<\/p>\n<p><strong>lines<\/strong> &#8212; \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043e\u0448\u0438\u0431\u043e\u043a, \u043e\u0442\u0441\u044e\u0434\u0430 \u0431\u0435\u0440\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443, \u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435 \u043a\u043e\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d.<\/p>\n<p><strong>tokens<\/strong> &#8212; \u0441\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u043e\u043a\u0435\u043d\u044b, \u0441\u0434\u0435\u0441\u044c, \u043f\u043e\u0442\u043e\u043c\u0443-\u0447\u0442\u043e \u044f \u0432\u044b\u0434\u0435\u043b\u044e \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u043f\u043e\u0437\u0436\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443.<\/p>\n<details class=\"spoiler\">\n<summary>lexer\/lexer.rs: Lexer<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"rust\">pub struct Lexer&lt;'a&gt; {    pos: usize,    chars: Vec&lt;char&gt;,    lines: Vec&lt;&amp;'a str&gt;,    line: usize,    offset: usize,}impl&lt;'a&gt; Lexer&lt;'a&gt; {    pub fn new(source: &amp;'a str) -&gt; Self {        let lines = source.lines().collect();        let chars = source.chars().collect();        Self {            lines,            chars,            pos: 0,            line: 0,            offset: 0,        }    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<h2>\u041f\u0438\u0448\u0435\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b<\/h2>\n<p><strong>error<\/strong>(msg, line_num, offset, len) -&gt; String: \u043c\u0435\u0442\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u041f\u043e\u0437\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0430\u043d\u0438\u043a\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f\u0442\u0443 \u0441\u0442\u0440\u043e\u043a\u0443.<\/p>\n<pre><code class=\"rust\">fn error(&amp;self, msg: &amp;str, line_num: usize, offset: usize, len: usize) -&gt; String {    let line = self.lines[line_num];    let header = format!(\"Error in {line_num}:{offset} - {msg}\");    let err_line = format!(\"{line_num} | {line}\");    let point = format!(        \"{} | {}{}\",        \" \".repeat(line_num.to_string().len()),        \" \".repeat(offset),        \"^\".repeat(len),    );    format!(\"{header}\\n{err_line}\\n{point}\\n\")}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>peek<\/strong>(offset) -&gt; char: \u0431\u0435\u0440\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b \u0438\u0437 self.chars \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c self.pos + offset, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 (\u041d\u0443 \u0438\u043b\u0438 \u0432\u044b\u0445\u043e\u0434 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0442\u0440\u043e\u043a\u0438) \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u043f\u0430\u043d\u0438\u043a\u0443, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0445\u0430 \u0432\u0435\u0440\u043d\u0435\u0442 char.<\/p>\n<pre><code class=\"rust\">fn peek(&amp;self, offset: i8) -&gt; char {    let idx = self.pos + offset as usize;    let c = self.chars.get(idx);    match c {        Some(ch) =&gt; *ch,        None =&gt; panic!(            \"{}\",            self.error(\"Out of bounds index\", self.line, self.offset, 1)        ),    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>advance<\/strong>(offset): \u041f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 offset \u043a self.offset \u0438 self.pos. \u0422\u043e\u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.<\/p>\n<pre><code class=\"rust\">fn advance(&amp;mut self, offset: u8) {    self.offset += offset as usize;    self.pos += offset as usize;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>push<\/strong>(kind, line_num, offset, len, pos): \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u0432 self.tokens<\/p>\n<pre><code class=\"rust\">fn push(&amp;mut self, kind: TKind, line: usize, offset: usize, len: usize, pos: usize) {    self.tokens.push(Token {        kind,        line,        offset,        len,        pos,    });}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>\u0422\u043e\u043a\u0435\u043d\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<details class=\"spoiler\">\n<summary>lexer\/lexer.rs: Lexer<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"rust\">impl Lexer&lt;'_&gt; {    pub fn tokenize(&amp;mut self) -&gt; Vec&lt;Token&gt; {        while self.pos &lt; self.chars.len() {            let current = self.peek(0);            let line = self.line;            let offset = self.offset;            let pos = self.pos;            match current {                c if c.is_whitespace() =&gt; {                    if c == '\\n' {                        self.line += 1;                        self.offset = 0;                    } else {                        self.advance(1);                    }                }                '+' =&gt; {                    self.push(TKind::Plus, line, offset, 1, pos);                    self.advance(1);                }                '-' =&gt; {                    self.push(TKind::Plus, line, offset, 1, pos);                    self.advance(1);                }                '*' =&gt; {                    self.push(TKind::Plus, line, offset, 1, pos);                    self.advance(1);                }                '\/' =&gt; {                    self.push(TKind::Plus, line, offset, 1, pos);                    self.advance(1);                }                '(' =&gt; {                    self.push(TKind::LParen, line, offset, 1, pos);                    self.advance(1);                }                ')' =&gt; {                    self.push(TKind::RParen, line, offset, 1, pos);                    self.advance(1);                }                '{' =&gt; {                    self.push(TKind::LBrace, line, offset, 1, pos);                    self.advance(1);                }                '}' =&gt; {                    self.push(TKind::RBrace, line, offset, 1, pos);                    self.advance(1);                }                ',' =&gt; {                    self.push(TKind::Comma, line, offset, 1, pos);                    self.advance(1);                }                '=' =&gt; {                    self.push(TKind::Assign, line, offset, 1, pos);                    self.advance(1);                }                '!' =&gt; {                    self.push(TKind::Assign, line, offset, 1, pos);                    self.advance(1);                }                _ =&gt; panic!(\"{}\", self.error(\"Unknown char\", line, offset, 1)),            }        }        self.push(TKind::Eof, self.line, self.offset, 1, self.pos);        self.tokens.clone()    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0443\u0442 \u043f\u0435\u0440\u0435\u0431\u0435\u0440\u0430\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 self.pos \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c \u0434\u043b\u0438\u043d\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430. \u0412 \u0446\u0438\u043a\u043b\u0435 \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0435: <strong>self.line<\/strong>, <strong>self.offset<\/strong>, <strong>self.pos<\/strong> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b. \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0434\u043b\u0438\u043d\u043d\u0435\u0435 1, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <strong>\u00ab==\u00bb<\/strong>. <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u0432 match \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043d\u0430\u0448 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b. <\/p>\n<pre><code class=\"rust\">c if c.is_whitespace() =&gt; {    if c == '\\n' {        self.line += 1;        self.advance(1);        self.offset = 0;    } else {        self.advance(1);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u043c, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0440\u043e\u0431\u0435\u043b, \u0438 \u0435\u0449\u0435 \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0441\u0442\u0440\u043e\u043a\u0438, \u0442\u043e \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u043c 1 \u043a<strong> self.line<\/strong>, \u043f\u0440\u043e\u043f\u0446\u0441\u043a\u0430\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>self.advance(1)<\/code> \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c 0 \u043a <strong>self.offset<\/strong> (\u0422\u0430\u043a \u043a\u0430\u043a advance \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u0442 1 \u043a \u043e\u0444\u0444\u0441\u0435\u0442\u0443, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u043e \u0435\u0433\u043e \u043e\u0431\u043d\u0443\u043b\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u0442\u0440\u043e\u043a\u0438). \u0415\u0441\u043b\u0438 \u043c\u044b \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u0440\u043e\u0431\u0435\u043b\u0430, \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c <code>self.advance(1)<\/code>.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b. <\/p>\n<pre><code class=\"rust\">'+' =&gt; {    self.push(TKind::Plus, line, offset, 1, pos);    self.advance(1);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0438 \u044d\u0442\u043e\u0442 \u0441\u0438\u043c\u0432\u043e\u043b, \u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c self.push, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0447\u0442\u043e \u0437\u0430 \u0442\u043e\u043a\u0435\u043d \u043c\u044b \u043d\u0430\u0448\u043b\u0438, \u0438 \u043f\u0435\u043e\u0435\u0434\u0430\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 <strong>line<\/strong>, <strong>offset<\/strong> \u0438 <strong>pos<\/strong>. \u0412 <strong>len<\/strong> \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c 1, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u043b\u0438\u043d\u043d\u0430 1-\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430. \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b. \u041f\u043e \u0442\u0430\u043a\u043e\u043c\u0443-\u0436\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u043b\u0438 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0430\u043d\u0438\u043a\u0443\u0435\u043c.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0446\u0438\u043a\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043a\u0435\u043d <strong>TKind::Eof<\/strong>, \u044d\u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438, \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a <strong>\u00abEnd Of File\u00bb<\/strong>. \u041e\u043d \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u0435\u0441\u0442 \u0434\u043b\u044f \u043b\u0435\u043a\u0441\u0435\u0440\u0430. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 tests \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0438 \u0432 \u044d\u0442\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u0444\u0430\u0439\u043b \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c <strong>\u00ab.rs\u00bb<\/strong>, \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 <strong>\u00ablexert.rs\u00bb<\/strong>.<\/p>\n<details class=\"spoiler\">\n<summary>tests\/lexert.rs<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"rust\">use guidzy::lexer::Lexer;#[test]fn main() {    let tokens_str = \"+ - * \/ ! () {} , =\";    let tokens = Lexer::new(tokens_str).tokenize();    println!(\"Source: {}\\nTokens:\", tokens_str);    for tkn in tokens {        println!(\"{:?}\", tkn);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u0441\u0442 \u0432 \u0432\u0438\u0434\u0438\u043c\u044b\u043c \u0432\u044b\u0432\u043e\u0434\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u044d\u0442\u0443 \u043a\u043e\u043c\u043c\u0430\u043d\u0434\u0443 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435:<\/p>\n<pre><code class=\"bash\">cargo test -- --nocapture<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043d\u0430\u0439\u0434\u0435\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u043d\u0430\u043c \u0432\u044b\u0434\u0430\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0443\u0447\u0438\u043c \u043b\u0435\u043a\u0441\u0435\u0440 \u0442\u043e\u043a\u0435\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d\u044b \u0438\u0437 2-\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.<\/p>\n<pre><code class=\"rust\">'=' =&gt; {if self.pos + 1 &lt; chars_len &amp;&amp; self.peek(1) == '=' {    self.push(TKind::Eq, line, offset, 1, pos);    self.advance(2);    } else {        self.push(TKind::Assign, line, offset, 1, pos);        self.advance(1);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0431\u0443\u0434\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d <strong>\u00ab==\u00bb<\/strong>. \u0421\u043d\u0430\u0447\u0430\u043b\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f + 1 (\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b) \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0434\u043b\u0438\u043d\u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>self.peek(1)<\/code>, \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0442\u0430\u043a\u0436\u0435 <strong>\u00ab=\u00bb<\/strong>. \u0415\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u043f\u0443\u0448\u0438\u043c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u043a\u0435\u043d\u043e\u0432 <strong>TKind::Eq<\/strong>, \u0432 <strong>len<\/strong> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u043b\u0438\u043d\u043d\u0443 2, \u0438 \u0432 <code>self.advance<\/code> \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c 2 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u0430. \u041f\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043b\u043e\u0433\u0438\u043a\u0435 \u043f\u0430\u0440\u0441\u0438\u043c \u0442\u0430\u043a\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u044b \u043a\u0430\u043a <strong>\u00ab&lt;=\u00bb, \u00ab&gt;=\u00bb, \u00ab!=\u00bb<\/strong> \u0438 \u0442\u0434.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0435\u0439\u0441, \u043a\u043e\u0433\u0434\u0430 \u0441\u0438\u043c\u0432\u043e\u043b \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u043e\u0439\u043d\u044b\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 <strong>\u00ab&amp;&amp;\u00bb<\/strong><\/p>\n<pre><code class=\"rust\">'&amp;' =&gt; {    if self.pos + 1 &lt; chars_len &amp;&amp; self.peek(1) == '&amp;' {        self.push(TKind::And, line, offset, 2, pos);        self.advance(2);    } else {        panic!(\"{}\", self.error(\"Expected &amp;&amp;\", line, offset, 1));    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0443\u0442 \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u043d\u043e \u0442\u0443\u0442, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u044b\u043c, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e <strong>\u00ab&amp;\u00bb<\/strong>, \u0432\u044b\u0434\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443 <strong>\u00abExprected\u00bb<\/strong> (\u0421 \u0430\u043d\u0433\u043b. \u00ab\u041e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c\u00bb). \u0422\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043a \u00ab||\u00bb&gt;<\/p>\n<details class=\"spoiler\">\n<summary>lexer\/lexer.rs:Lexer (\u0432\u0435\u0441\u044c \u0431\u043b\u043e\u043a \u0441 tokenize)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"rust\">impl Lexer&lt;'_&gt; {    pub fn tokenize(&amp;mut self) -&gt; Vec&lt;Token&gt; {        let chars_len = self.chars.len();        while self.pos &lt; chars_len {            let current = self.peek(0);            let line = self.line;            let offset = self.offset;            let pos = self.pos;            match current {                c if c.is_whitespace() =&gt; {                    if c == '\\n' {                        self.line += 1;self.advance(1);self.offset = 0;                    } else {                        self.advance(1);                    }                }                '+' =&gt; {                    self.push(TKind::Plus, line, offset, 1, pos);                    self.advance(1);                }                '-' =&gt; {                    self.push(TKind::Minus, line, offset, 1, pos);                    self.advance(1);                }                '*' =&gt; {                    self.push(TKind::Star, line, offset, 1, pos);                    self.advance(1);                }                '\/' =&gt; {                    self.push(TKind::Slash, line, offset, 1, pos);                    self.advance(1);                }                '(' =&gt; {                    self.push(TKind::LParen, line, offset, 1, pos);                    self.advance(1);                }                ')' =&gt; {                    self.push(TKind::RParen, line, offset, 1, pos);                    self.advance(1);                }                '{' =&gt; {                    self.push(TKind::LBrace, line, offset, 1, pos);                    self.advance(1);                }                '}' =&gt; {                    self.push(TKind::RBrace, line, offset, 1, pos);                    self.advance(1);                }                ',' =&gt; {                    self.push(TKind::Comma, line, offset, 1, pos);                    self.advance(1);                }                '=' =&gt; {                    if self.pos + 1 &lt; chars_len &amp;&amp; self.peek(1) == '=' {                        self.push(TKind::Eq, line, offset, 2, pos);                        self.advance(2);                    } else {                        self.push(TKind::Assign, line, offset, 1, pos);                        self.advance(1);                    }                }                '!' =&gt; {                    if self.pos + 1 &lt; chars_len &amp;&amp; self.peek(1) == '=' {                        self.push(TKind::Ne, line, offset, 2, pos);                        self.advance(2);                    } else {                        self.push(TKind::Bang, line, offset, 1, pos);                        self.advance(1);                    }                }                '&gt;' =&gt; {                    if self.pos + 1 &lt; chars_len &amp;&amp; self.peek(1) == '=' {                        self.push(TKind::Ge, line, offset, 2, pos);                        self.advance(2);                    } else {                        self.push(TKind::Gt, line, offset, 1, pos);                        self.advance(1);                    }                }                '&lt;' =&gt; {                    if self.pos + 1 &lt; chars_len &amp;&amp; self.peek(1) == '=' {                        self.push(TKind::Le, line, offset, 2, pos);                        self.advance(2);                    } else {                        self.push(TKind::Lt, line, offset, 1, pos);                        self.advance(1);                    }                }                '&amp;' =&gt; {                    if self.pos + 1 &lt; chars_len &amp;&amp; self.peek(1) == '&amp;' {                        self.push(TKind::And, line, offset, 2, pos);                        self.advance(2);                    } else {                        panic!(\"{}\", self.error(\"Expected &amp;&amp;\", line, offset, 1));                    }                }                '|' =&gt; {                    if self.pos + 1 &lt; chars_len &amp;&amp; self.peek(1) == '|' {                        self.push(TKind::Or, line, offset, 2, pos);                        self.advance(2);                    } else {                        panic!(\"{}\", self.error(\"Expected ||\", line, offset, 1));                    }                }                _ =&gt; panic!(\"{}\", self.error(\"Unknown char\", line, offset, 1)),            }        }        self.push(TKind::Eof, self.line, self.offset, 1, self.pos);        self.tokens.clone()    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0442\u0435\u0441\u0442 tests\/lexert.rs<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"rust\">use guidzy::lexer::Lexer;#[test]fn main() {    let tokens_str = \"+ - * \/ ! () {} , = &amp;&amp; || &lt; &gt; &lt;= &gt;= == !=\";    let tokens = Lexer::new(tokens_str).tokenize();    println!(\"Source: {}\\nTokens:\", tokens_str);    for tkn in tokens {        println!(\"{:?}\", tkn);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<h2>\u0422\u043e\u043a\u0435\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u043b\u0430 \u0441\u0442\u0440\u043e\u043a\u0438<\/h2>\n<pre><code class=\"rust\">fn tokenize_string(&amp;mut self) {    let mut buffer = String::new();    let line = self.line;    let offset = self.offset;    let pos = self.pos;    self.advance(1);    loop {        let current = self.peek(0);        self.advance(1);        if current == '\"' {            break;        } else {            buffer.push(current);        }    }    self.push(        TKind::StrLit(buffer.clone()),        line,        offset,        buffer.len() + 2,        pos,    );}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u0443\u0444\u0444\u0435\u0440 \u0434\u043b\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0441\u0442\u0440\u043e\u043a\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043d\u043e\u043c\u0435\u0438 \u0441\u0442\u0440\u043e\u043a\u0438, \u043e\u0442\u0441\u0442\u0443\u043f \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e. \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u0443\u044e \u043a\u0430\u0432\u044b\u0447\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>self.advance(1)<\/code>.<\/p>\n<p>\u0412 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0431\u0435\u0440\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0443\u0441\u043a\u0430\u0435\u043c \u0435\u0433\u043e, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c: \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u0441\u0438\u043c\u0432\u043e\u043b \u043a\u0430\u0432\u044b\u0447\u043a\u0430, \u0442\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0446\u0438\u043a\u043b\u0430. \u041c\u044b \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0441\u0438\u043c\u0432\u043e\u043b, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u043a\u0430\u0432\u044b\u0447\u043a\u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u0430. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u0431\u0443\u0444\u0444\u0435\u0440.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u0432\u0441\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0443\u0448\u0438\u043c \u0435\u0435 \u043a\u0430\u043a \u043b\u0438\u0442\u0435\u0440\u0430\u043b \u0441\u0442\u0440\u043e\u043a\u0438. \u0412 \u0434\u043b\u0438\u043d\u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u043b\u0438\u043d\u043d\u0443 \u0431\u0443\u0444\u0444\u0435\u0440\u0430 + 2. \u0417\u0430\u0447\u0435\u043c \u0435\u0449\u0435 2? \u041f\u0440\u0438 \u0442\u043e\u043a\u0435\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u043a\u0438, \u043c\u044b \u043d\u0435 \u0431\u0435\u0440\u0435\u043c 2 \u043a\u0430\u0432\u044b\u0447\u043a\u0438 \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u043e \u0441\u0442\u0440\u043e\u043a\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u0438 \u043a\u0430\u0432\u044b\u0447\u043a\u0438 &#8212; \u044d\u0442\u043e 1 \u0442\u043e\u043a\u0435\u043d. \u042d\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0432 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u0432\u0435\u0441\u044c \u043b\u0438\u0442\u0435\u0440\u0430\u043b.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 match \u043d\u043e\u0432\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435:<\/p>\n<pre><code class=\"rust\">c if c == '\"' =&gt; self.tokenize_string(),<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0442\u0435\u0441\u0442 tests\/lexert.rs<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"rust\">use guidzy::lexer::Lexer;#[test]fn main() {    let tokens_str = \"+ - * \/ ! () {} , = &amp;&amp; || &lt; &gt; &lt;= &gt;= == !=\\\"my string\\\"\".trim();    let tokens = Lexer::new(tokens_str).tokenize();    println!(\"Source: {}\\nTokens:\", tokens_str);    for tkn in tokens {        println!(\"{:?}\", tkn);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<h2>\u0422\u043e\u043a\u0435\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u043a\u0435\u0439\u0432\u043e\u0440\u0434\u043e\u0432<\/h2>\n<details class=\"spoiler\">\n<summary>lexer\/lexer.rs: Lexer<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"rust\">fn tokenize_ident(&amp;mut self) {    let mut buffer = String::new();    let line = self.line;    let offset = self.offset;    let pos = self.pos;    loop {        if self.pos &gt;= self.chars.len() {            break;        }        let current = self.peek(0);        if current.is_alphabetic() || current.is_digit(10) || current == '_' {            buffer.push(current);            self.advance(1);        } else {            break;        }    }    let kind = match buffer.as_str() {        \"true\" =&gt; TKind::Bool(true),        \"false\" =&gt; TKind::Bool(false),        \"print\" =&gt; TKind::Print,        \"input\" =&gt; TKind::Print,        \"str\" =&gt; TKind::Str,        \"num\" =&gt; TKind::Num,        \"fn\" =&gt; TKind::Fn,        \"while\" =&gt; TKind::While,        \"break\" =&gt; TKind::Break,        \"continue\" =&gt; TKind::Continue,        \"if\" =&gt; TKind::If,        \"elif\" =&gt; TKind::Elif,        \"else\" =&gt; TKind::Else,        \"return\" =&gt; TKind::Return,        _ =&gt; TKind::Id(buffer.clone()),    };    self.push(kind, line, offset, buffer.len(), pos);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0442\u0440\u043e\u043a\u0438. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u0443\u0444\u0444\u0435\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e. <\/p>\n<p>\u0415\u043c\u043b\u0438 \u043d\u0435 \u0432\u044b\u0448\u043b\u0438, \u0442\u043e \u0431\u0435\u0440\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0438 \u043f\u0440\u043e\u0432\u0440\u044f\u0435\u043c. \u0412 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0435 \u0438\u043b\u0438 \u043a\u0435\u0439\u0432\u043e\u0440\u0434\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c: \u0431\u0443\u043a\u0432\u044b, \u0447\u0438\u0441\u043b\u0430 \u0438 \u0437\u043d\u0430\u043a <strong>\u00ab_\u00bb<\/strong>, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u0441\u0438\u043c\u0432\u043e\u043b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0443\u0435\u0442 \u044d\u0442\u043e\u043c\u0443, \u043f\u0443\u0448\u0438\u043c \u0435\u0433\u043e \u0432 \u0431\u0443\u0444\u0444\u0435\u0440 \u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c 1 \u0441\u0438\u043c\u0432\u043e\u043b, \u0438\u043d\u0430\u0447\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0446\u0438\u043a\u043b.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0431\u0443\u0444\u0444\u0435\u0440 \u043d\u0430 \u043a\u0435\u0439\u0432\u043e\u0440\u0434\u044b. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e true, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c <strong>TKind::Bool(true)<\/strong>, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043a\u0435\u0439\u0432\u043e\u0440\u0434 \u0438\u043b\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0442\u0438\u043f. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 <strong>true\/false<\/strong>, \u043d\u0435 \u043a\u0435\u0439\u0432\u043e\u0440\u0434, \u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u044d\u0442\u043e \u043a\u0430\u043a \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440.<\/p>\n<p>\u041f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0443\u0448\u0438\u043c \u0435\u0433\u043e \u0432 \u0442\u043e\u043a\u0435\u043d\u044b. \u0412 <strong>tokenize<\/strong> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435:<\/p>\n<pre><code class=\"rust\">c if c.is_alphabetic() =&gt; self.tokenize_ident(),<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041e\u0431\u043d\u043e\u0432\u0438\u043c \u0442\u0435\u0441\u0442 tests\/lexert.rs<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"rust\">use guidzy::lexer::Lexer;#[test]fn main() {    let tokens_str = \"+ - * \/ ! () {} , = &amp;&amp; || &lt; &gt; &lt;= &gt;= == !=\\\"my string\\\"my_ident12 true false print\"    .trim();    let tokens = Lexer::new(tokens_str).tokenize();    println!(\"Source: {}\\nTokens:\", tokens_str);    for tkn in tokens {        println!(\"{:?}\", tkn);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<h2>\u0422\u043e\u043a\u0435\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0438\u0441\u0435\u043b<\/h2>\n<details class=\"spoiler\">\n<summary>lexer\/lexer.rs: Lexer<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"rust\">fn tokenize_number(&amp;mut self) {    let mut buffer = String::new();    let line = self.line;    let offset = self.offset;    let pos = self.pos;    loop {        if self.pos &gt;= self.chars.len() {            break;        }        let current = self.peek(0);        if current.is_digit(10) || current == '.' {            buffer.push(current);            self.advance(1);        } else if current == '_' {            self.advance(1);        } else {            break;        }    }    self.push(        TKind::NumLit(buffer.parse::&lt;f64&gt;().expect(\"Failed parse number\")),        line,        offset,        buffer.len(),        pos,    );}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u0443\u0444\u0444\u0435\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e. \u0412 \u0446\u0438\u043a\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u043d\u0435 \u0432\u044b\u0448\u043b\u0438 \u043b\u0438 \u043c\u044b \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0446\u0438\u043a\u043b.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0446\u0438\u043a\u043b\u0430 \u043c\u044b \u043f\u0443\u0448\u0438\u043c \u0435\u0433\u043e \u0432 \u0442\u043e\u043a\u0435\u043d\u044b. \u041f\u0430\u0440\u0441\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0443 <strong>buffer<\/strong> \u043a\u0430\u043a <strong>f64<\/strong>, \u0438 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0431\u043d\u043e\u0432\u0438\u043c \u0442\u0435\u0441\u0442 tests\/lexert.rs<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"rust\">use guidzy::lexer::Lexer;#[test]fn main() {    let tokens_str = \"+ - * \/ ! () {} , = &amp;&amp; || &lt; &gt; &lt;= &gt;= == !=\\\"my string\\\"my_ident12 true false print3.14 45 100_000\"    .trim();    let tokens = Lexer::new(tokens_str).tokenize();    println!(\"Source: {}\\nTokens:\", tokens_str);    for tkn in tokens {        println!(\"{:?}\", tkn);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<h2>\u0418\u0442\u043e\u0433<\/h2>\n<p>\u042f \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u043b, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u0434\u043b\u0438\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u0441\u044f \ud83d\ude42 \u042f \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443, \u0447\u0442\u043e \u043f\u0438\u0441\u0430\u043b, \u0438 \u043e\u0431\u044c\u044f\u0441\u043d\u0438\u043b \u0440\u0430\u0431\u043e\u0442\u0443 \u043b\u0435\u043a\u0441\u0435\u0440\u0430.<\/p>\n<p>\u041d\u0430\u0448 \u043b\u0435\u043a\u0441\u0435\u0440 \u0443\u043c\u0435\u0435\u0442 \u0442\u043e\u043a\u0435\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u0430, \u043a\u0435\u0439\u0432\u043e\u0440\u0434\u044b, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b \u0441\u0442\u0440\u043e\u043a. \u0422\u0430\u043a\u0436\u0435 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<p>\u041a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442\u0435 \u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435 \u0432 <a href=\"https:\/\/github.com\/KiquarSL\/Gudzy\/tree\/4103e7ca55f9df485250c7de20b77e0e4b69ddc8\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>.<\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0430\u0440\u0441\u0435\u0440 \u0434\u043b\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u0412\u0441\u0435\u043c \u043f\u043e\u043a\u0430!<\/p>\n<\/div>\n<p>\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\/articles\/1044358\/\">https:\/\/habr.com\/ru\/articles\/1044358\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043d\u0443\u043b\u044f \u043d\u0430 Rust. \u041e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0441\u044c \u044f \u043d\u0430 \u0442\u0435\u0445, \u043a\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0438 \u044f\u0437\u044b\u043a\u0438 \u0438 \u0437\u043d\u0430\u0435\u0442 Rust, \u043d\u0443\u0436\u043d\u043e \u0443\u0436\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0432 \u043d\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f. \u042d\u0442\u043e\u0442 \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044f \u0432\u044b\u0431\u0440\u0430\u043b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043d\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u043e\u0432, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0433\u0438\u0431\u043a\u0438\u0439 \u043a\u043e\u0434, \u043d\u0443 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u043c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f)\u0422\u0430\u043a\u0436\u0435 \u044f \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u043e\u043c \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u044f\u0437\u044b\u043a\u043e\u0432, \u0438 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043c\u043e\u0433\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435 \u0441\u0430\u043c\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0443\u0433\u0443\u0431\u043e \u043c\u043e\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0411\u0443\u0434\u0443 \u0440\u0430\u0434, \u0435\u0441\u043b\u0438 \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u0435\u0441\u043b\u0438 \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0442\u0430\u043a\u043e\u0432\u044b\u0435.\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440, \u043d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u00ab\u041e \u043c\u043e\u0435\u043c \u043e\u043f\u044b\u0442\u0435\u00bb.\u0422\u0430\u043a\u0436\u0435 \u0435\u0449\u0435 \u043e\u0431\u0449\u0438\u0439 \u0441\u043e\u0432\u0435\u0442 \u0447\u0430\u0439\u043d\u0438\u043a\u0430\u043c: \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u043d\u0430 \u043b\u0435\u0442\u0443, \u043f\u044b\u0442\u0430\u0439\u0442\u0435\u0441\u044c \u0432\u043d\u0438\u043a\u043d\u0443\u0442\u044c. \u041f\u0440\u043e\u0441\u0442\u043e \u044f \u0440\u0430\u043d\u044c\u0448\u0435 \u0447\u0430\u0441\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043b, \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0431\u0438\u0432\u0430\u043b \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0438\u0437\u0443\u0447\u0430\u043b. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443 \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u0439\u043c\u0443. \u0418 \u043a\u0430\u043a \u043f\u043e &#8212; \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043d\u0430\u0434\u043e \u0431\u0440\u043e\u0441\u0430\u0442\u044c. \u041c\u043e\u0436\u043d\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0431\u0443\u043c\u0430\u0433\u0435 \u0438\u043b\u0438 \u0432 \u043f\u0435\u0438\u043d\u0442\u0435, \u043d\u043e \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043c\u043e\u0442\u0440\u044e \u043d\u0430 \u043a\u043e\u0434, \u0438 \u0432\u043d\u0438\u043a\u0430\u044e, \u0432\u0441\u043a\u043e\u0440\u0435 \u0432\u043f\u0430\u0434\u0430\u044e \u0432 \u00ab\u043f\u043e\u0442\u043e\u043a\u00bb, \u0438 \u0443\u0436\u0435 \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e.\u041e \u043c\u043e\u0435\u043c \u043e\u043f\u044b\u0442\u0435\u042f \u043e\u0434\u0438\u043d \u0438\u0437 \u0442\u0435\u0445 \u043b\u044e\u0434\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043b\u044e\u0431\u044f\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043d\u0438\u0433\u0438 \u0438 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043e\u0440\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0447\u0438\u043d\u0430\u043b \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u043e\u0432 \u0441 \u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e OwnLang \u043e\u0442 Animmon&#8217;\u0430, \u0430 \u043d\u0435 \u0441 \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043d\u0438\u0433 \u0438\u043b\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0442\u0430\u0442\u0435\u0439.\u0418 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c, \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043f\u043e\u043a\u0430 \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043c\u043e\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043d\u0435 \u0431\u044b\u043b \u0434\u043e\u0432\u0435\u0434\u0435\u043d \u0434\u043e \u0443\u043c\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u044f \u0443\u0437\u043d\u0430\u0432\u0430\u043b, \u0447\u0442\u043e \u043a\u043e\u0434 \u043c\u043e\u0433 \u0431\u044b\u0442\u044c \u043b\u0443\u0447\u0448\u0435, \u044f \u0448\u0435\u043b \u0438 \u043f\u0438\u0441\u0430\u043b \u044f\u0437\u044b\u043a \u0441 \u043d\u0443\u043b\u044f, \u0443\u0436\u0435 \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u043d\u0438\u044f\u043c\u0438.  \u0426\u0435\u043b\u044c\u0422\u0443\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043f\u043e \u043f\u0443\u0442\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430 \u0438 \u0435\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430.\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u044f\u0437\u044b\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 Python-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439. \u0422\u0430\u043a\u0436\u0435 \u044f\u0437\u044b\u043a, \u043a\u0430\u043a \u0443\u0436\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0438\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u043c. \u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0438\u0442\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 (AST). \u042f\u0437\u044b\u043a \u0431\u0443\u0434\u0435\u0442 \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u043b\u0430\u0431\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0435\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0438\u043f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0422\u0430\u043a\u0436\u0435 \u044f \u0434\u0443\u043c\u0430\u043b \u043d\u0430 \u0441\u0447\u0435\u0442 \u043e\u0448\u0438\u0431\u043e\u043a. \u0418 \u043f\u0440\u0438\u0448\u0435\u043b \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 \u0432\u044b\u0432\u043e\u0434\u0443, \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043c \u043e\u0448\u0438\u0431\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0438\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043b\u0438\u0448\u043d\u0438\u0439 \u0440\u0430\u0437 \u043d\u0435 \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0438\u0445 \u0438 \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u044f\u0437\u044b\u043a\u0430. \u0412 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043d\u0438 \u0432 \u043a\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u043a \u043d\u0435 \u0434\u0435\u043b\u0430\u0439\u0442\u0435! \u041b\u0443\u0447\u0448\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 Result, \u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0431\u0440\u043e\u0441\u043a\u0430 \u044f\u0437\u044b\u043a\u0430, \u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0433\u0430\u0439\u0434\u0430 \u0441\u043e\u0439\u0434\u0435\u0442.\u041d\u0443 \u0438 \u0441\u0430\u043c\u0438 \u0442\u0438\u043f\u044b, \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432: String, Boolean, Number. \u0412 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043f\u0438\u0441\u043a\u0438 \u0438 \u0442.\u0434., \u043d\u043e \u043f\u043e\u043a\u0430-\u0447\u0442\u043e \u043d\u0430\u043c \u0445\u0432\u0430\u0442\u0438\u0442 \u044d\u0442\u043e\u0433\u043e.\u041c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c if-elif-else, \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0446\u0438\u043a\u043b while, \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e \u0442\u0438\u043f\u0443 print \u0438 input. \u041a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:fn add(a, b) {    return a + b}n = num(input(&#171;Enter n: &#171;))a = add(num, 5 )if a &lt; 10 {    print(&#171;a &lt; 10&#187;)} elif a &gt; 10 {    print(&#171;a &gt; 10&#187;)} else {    print(&#171;a = 10&#187;)}\u0421\u0430\u043c \u043f\u0443\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0432\u044b\u043c:1) \u0422\u043e\u043a\u0435\u043d\u0438\u0437\u0430\u0446\u0438\u044f &#8212; \u0442\u0443\u0442 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u044b, \u0432 \u043e\u0431\u044c\u0435\u043a\u0442\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0439: \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438, \u043e\u0442\u0441\u0442\u0443\u043f \u043e\u0442 \u043d\u0430\u0441\u0430\u043b\u0430 \u0441\u0442\u0440\u043e\u043a\u0438, \u0434\u043b\u0438\u043d\u043d\u0443 \u0442\u043e\u043a\u0435\u043d\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u0442\u0435\u043a\u0441\u0442\u0435, \u044d\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u043a\u043e\u0434\u0435. \u0422\u0430\u043a\u0436\u0435 \u0432 \u0442\u043e\u043a\u0435\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0435\u0433\u043e \u0442\u0438\u043f, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Plus, Minus, \u0442\u0430\u043a \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u043a\u0430, \u0447\u0438\u0441\u043b\u043e \u0438\u043b\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e.2) \u041f\u0430\u0440\u0441\u0438\u043d\u0433 &#8212; \u0442\u0443\u0442, \u0434\u0443\u043c\u0430\u044e, \u0441\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u0434\u043b\u044f \u0447\u0430\u0439\u043d\u0438\u043a\u043e\u0432. \u0421\u043e\u0437\u0434\u0430\u0435\u043c AST (Abstract Syntax Tree). \u042f \u0441\u0430\u043c \u0434\u043e\u043b\u0433\u043e \u043d\u0435 \u043c\u043e\u0433 \u0437\u0430\u0448\u0430\u0440\u0438\u0442\u044c \u0437\u0430 \u044d\u0442\u043e (\u041f\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c), \u043d\u043e \u0435\u0441\u043b\u0438 \u043d\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c, \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0433\u043b\u044f\u043d\u044c\u0442\u0435 \u043a\u043d\u0438\u0433\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u00abEngeneering A Compiler\u00bb, \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0438\u0449\u0438\u0442\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443. \u042f \u0441\u0430\u043c \u043b\u0438\u0447\u043d\u043e \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u0430\u043c, \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u043e\u043f\u044b\u0442\u0435, \u043d\u043e \u0432\u0430\u043c \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0433\u0443\u0433\u043b\u0438\u0442\u044c) \u041d\u0443 \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e \u0441\u0430\u043c \u043f\u0430\u0440\u0441\u0438\u043d\u0433. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u043f\u0430\u0440\u0441\u0435\u0440 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f: \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (+-*\/), \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f (&lt;, &gt;, &gt;=, &lt;=, ==, !=) \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (&amp;&amp; (\u0438), || (\u0438\u043b\u0438)), \u0442\u0430\u043a\u0436\u0435 \u0441\u043a\u043e\u0431\u043a\u0438. \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u043c \u0441\u043f\u0443\u0441\u043a\u0435: primary &#8212; \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0442\u043e\u043a\u0435\u043d\u0430, \u0435\u0441\u043b\u0438 \u0442\u043e\u043a\u0435\u043d \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438, \u0442\u043e \u043f\u0430\u043d\u0438\u043a\u0443\u0435\u043cunary &#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0442\u0438\u043f\u0430 ! (\u043d\u0435) \u0438 &#8212; (\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435)multiplicative &#8212; \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0432\u0441\u0451 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0435additive &#8212; \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 (comparison) \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (logical) \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0437\u0436\u0435, \u043f\u043e\u043a\u0430-\u0447\u0442\u043e \u043d\u0430\u043c \u0445\u0432\u0430\u0442\u0438\u0442 \u044d\u0442\u043e\u0433\u043e. \u0422\u0430\u043a\u0436\u0435, \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 &#8212; \u044d\u0442\u043e if-elif-else, return (\u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u0439\u0442\u043c\u0435\u043d\u0442), \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0442.\u0434.. \u041f\u043e\u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0438\u0445 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0421\u0442\u0435\u0439\u0442\u043c\u0435\u043d\u0442\u0430\u043c\u0438 (Statement).3) \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0438\u0442\u0430\u0442\u043e\u0440\u0430! \u0423 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 &#8212; Stmt, \u0442\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432\u0441\u0435 \u0442\u0438\u043f\u044b \u0441\u0442\u0435\u0439\u0442\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0442\u0434. \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u0432\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 exec(&amp;self, rt: &amp;mut Runtime). \u0422\u0430\u043a\u0436\u0435, \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u043c\u044b \u043b\u0435\u0433\u043a\u043e \u0441\u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u0442\u043b\u044f\u0446\u0438\u044e \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u0438\u043b\u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u044f\u0437\u044b\u043a (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, QBE \u0438 LLVM).\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c!\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u0438 3 \u0444\u0430\u0439\u043b\u0430 \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 lexer: mod.rs, token.rs \u0438 lexer.rs.\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c token.rs.TokenKind &#8212; \u044d\u0442\u0438 \u0442\u0438\u043f \u0442\u043e\u043a\u0435\u043d\u0430, \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c, \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c \u0438\u043b\u0438 \u043b\u044e\u0431\u044b\u043c \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u044f\u0437\u044b\u043a\u0430. \u041d\u0438\u0436\u0435 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b enum \u0441 \u0432\u0441\u0435\u043c \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430, \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c TKind.\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b (\u0418\u043c\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0444\u0443\u043d\u043a\u0446\u0438\u0439) \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0438. \u0414\u043b\u044f \u0447\u0438\u0441\u0435\u043b \u0438 \u0441\u0442\u0440\u043e\u043a \u0432 enum, \u0435\u0441\u0442\u044c \u043f\u043e\u0441\u0442\u0444\u0438\u043a\u0441 \u00abLit\u00bb &#8212; Literal, \u0442\u043e \u0435\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e\u0435 \u043d\u0435\u043f\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432 \u043a\u043e\u0434\u0435, \u044d\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0447\u0438\u0441\u043b\u0430.\u041a\u0435\u0439\u0432\u043e\u0440\u0434\u044b, \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b, \u0432\u0441\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u043a\u0435\u043d\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: print, input, num, str. lexer\/token.rs: TokenKindpub type TKind = TokenKind;#[derive(Debug, Clone)]pub enum TokenKind {    Plus,  \/\/ +    Minus, \/\/ &#8212;    Slash, \/\/ \/    Star,  \/\/ *    LBrace, \/\/ {    RBrace, \/\/ }    LParen, \/\/ (    RParen, \/\/ )    Comma,  \/\/ ,    Assign, \/\/ =    Bang,   \/\/ !    Gt, \/\/ &gt;    Lt, \/\/ &lt;    Ge, \/\/ &gt;=    Le, \/\/ &lt;=    Eq, \/\/ ==    Ne, \/\/ !=    And, \/\/ &amp;&amp;    Or,  \/\/ ||    Id(String),    StrLit(String),    NumLit(f64),    Bool(bool),    \/\/ Keywords    Fn,    If,    Elif,    Else,    While,    Break,    Continue,    Return,    \/\/ Functions    Print,    Input,    Num,    Str,    Eof,}lexer\/token.rs: Token#[derive(Debug, Clone)]pub struct Token {    pub kind: TKind,    pub len: usize,    pub pos: usize,    pub line: usize,    pub offset: usize,}\u0412 \u0442\u043e\u043a\u0435\u043d\u0435, \u043a\u0430\u043a \u044f \u043f\u0438\u0441\u0430\u043b \u0440\u0430\u043d\u0435\u0435, \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0435\u0433\u043e \u0442\u0438\u043f, \u0438 2 \u0432\u0438\u0434\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435: \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0443\u044e (pos), \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u043e\u043a\u0438 (line, offset), \u0442\u0430\u043a\u0436\u0435 len \u0434\u043b\u044f \u043f\u043e\u043a\u0430\u0437\u0430 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a. line \u0438 offset \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u043a\u0430\u0437\u0430 \u043e\u0448\u0438\u0431\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u0437\u044f\u0442\u044c \u0432\u0441\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430, \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438, \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. pos \u0438 len \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u043f\u043e\u043a\u0430\u0437\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0443\u0436\u0435 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0438\u0442\u0430\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 \u0432 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0435 (\u0415\u0441\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u0440\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440)\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0448\u0438\u0431\u043a\u0438Error in 0:20 &#8212; Unknown char0 | + &#8212; * \/ ! () {} , = ;  |                     ^\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0447\u043d\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u0435\u043a\u0441\u0435\u0440. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 Lexer. \u0412 \u043d\u0435\u0439 \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c: pos, line, offset, lines, chars, tokens.pos \u0438 chars \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0431\u0435\u0440\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b.line \u0438 offset &#8212; \u0438\u0445 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0434\u043b\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u043a\u0435\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438 \u0441\u0432\u043e\u0438 \u043f\u043e\u043b\u0437\u0438\u0446\u0438\u0438.lines &#8212; \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043e\u0448\u0438\u0431\u043e\u043a, \u043e\u0442\u0441\u044e\u0434\u0430 \u0431\u0435\u0440\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443, \u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435 \u043a\u043e\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d.tokens &#8212; \u0441\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u043e\u043a\u0435\u043d\u044b, \u0441\u0434\u0435\u0441\u044c, \u043f\u043e\u0442\u043e\u043c\u0443-\u0447\u0442\u043e \u044f \u0432\u044b\u0434\u0435\u043b\u044e \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u043f\u043e\u0437\u0436\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443.lexer\/lexer.rs: Lexerpub struct Lexer&lt;&#8216;a&gt; {    pos: usize,    chars: Vec&lt;char&gt;,    lines: Vec&lt;&amp;&#8217;a str&gt;,    line: usize,    offset: usize,}impl&lt;&#8216;a&gt; Lexer&lt;&#8216;a&gt; {    pub fn new(source: &amp;&#8217;a str) -&gt; Self {        let lines = source.lines().collect();        let chars = source.chars().collect();        Self {            lines,            chars,            pos: 0,            line: 0,            offset: 0,        }    }}\u041f\u0438\u0448\u0435\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044berror(msg, line_num, offset, len) -&gt; String: \u043c\u0435\u0442\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u041f\u043e\u0437\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0430\u043d\u0438\u043a\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f\u0442\u0443 \u0441\u0442\u0440\u043e\u043a\u0443.fn error(&amp;self, msg: &amp;str, line_num: usize, offset: usize, len: usize) -&gt; String {    let line = self.lines[line_num];    let header = format!(&#171;Error in {line_num}:{offset} &#8212; {msg}&#187;);    let err_line = format!(&#171;{line_num} | {line}&#187;);    let point = format!(        &#171;{} | {}{}&#187;,        &#187; &#171;.repeat(line_num.to_string().len()),        &#187; &#171;.repeat(offset),        &#171;^&#187;.repeat(len),    );    format!(&#171;{header}\\n{err_line}\\n{point}\\n&#187;)}peek(offset) -&gt; char: \u0431\u0435\u0440\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b \u0438\u0437 self.chars \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c self.pos + offset, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 (\u041d\u0443 \u0438\u043b\u0438 \u0432\u044b\u0445\u043e\u0434 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0442\u0440\u043e\u043a\u0438) \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u043f\u0430\u043d\u0438\u043a\u0443, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0445\u0430 \u0432\u0435\u0440\u043d\u0435\u0442 char.fn peek(&amp;self, offset: i8) -&gt; char {    let idx = self.pos + offset as usize;    let c = self.chars.get(idx);    match c {        Some(ch) =&gt; *ch,        None =&gt; panic!(            &#171;{}&#187;,            self.error(&#171;Out of bounds index&#187;, self.line, self.offset, 1)        ),    }}advance(offset): \u041f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 offset \u043a self.offset \u0438 self.pos. \u0422\u043e\u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.fn advance(&amp;mut self, offset: u8) {    self.offset += offset as usize;    self.pos += offset as usize;}push(kind, line_num, offset, len, pos): \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u0432 self.tokensfn push(&amp;mut self, kind: TKind, line: usize, offset: usize, len: usize, pos: usize) {    self.tokens.push(Token {        kind,        line,        offset,        len,        pos,    });}\u0422\u043e\u043a\u0435\u043d\u0438\u0437\u0430\u0446\u0438\u044flexer\/lexer.rs: Lexerimpl Lexer&lt;&#8216;_&gt; {    pub fn tokenize(&amp;mut self) -&gt; Vec&lt;Token&gt; {        while self.pos &lt; self.chars.len() {            let current = self.peek(0);            let line = self.line;            let offset = self.offset;            let pos = self.pos;            match current {                c if c.is_whitespace() =&gt; {                    if c == &#8216;\\n&#8217; {                        self.line += 1;                        self.offset = 0;                    } else {                        self.advance(1);                    }                }                &#8216;+&#8217; =&gt; {                    self.push(TKind::Plus, line, offset, 1, pos);                    self.advance(1);                }                &#8216;-&#8216; =&gt; {                    self.push(TKind::Plus, line, offset, 1, pos);           &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-482623","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/482623","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=482623"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/482623\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=482623"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=482623"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=482623"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}