{"id":467851,"date":"2025-07-20T21:30:41","date_gmt":"2025-07-20T21:30:41","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=467851"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=467851","title":{"rendered":"<span>QapGen: \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043c\u043e\u0449\u043d\u044b\u0435 \u043f\u0430\u0440\u0441\u0435\u0440\u044b \u043d\u0430 C++<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><strong>QapDSLv2 <\/strong>\u2014 \u044d\u0442\u043e \u044f\u0437\u044b\u043a \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 C++ \u043a\u043e\u0434. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0438 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438\/\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0440\u0430\u0437\u0431\u043e\u0440\u0430, \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p><strong>QapGen <\/strong>\u2014 \u044d\u0442\u043e <strong>\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0434\u0435\u0440\u0435\u0432\u0430_\u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432<\/strong>\/\u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 <strong>QapDSLv2. <\/strong>\u0421\u0430\u043c\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430 <strong>QapDSLv2 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 QapDSLv2 \u043d\u0430 100%. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 QapGen \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0441\u0430\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0447\u0430\u0441\u0442\u044c \u0441\u0432\u043e\u0435\u0433\u043e \u043a\u043e\u0434\u0430(\u0432\u0435\u0441\u044c \u043f\u0430\u0440\u0441\u0435\u0440 QapDSLv2).<\/strong><\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0438\u0448\u043a\u0438 <strong>QapDSLv2 + QapGen<\/strong> \u2014 \u044d\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u0442\u0430\u043f\u0430 \u0442\u043e\u043a\u0435\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 <strong>\u0434\u0435\u0440\u0435\u0432\u043e \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043d\u0430 \u043b\u0435\u043a\u0441\u0435\u043c\u044b \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0438\u0445 \u0432 \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u044b\u0445 \u0421++ \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044f \u044d\u0442\u0430\u043f \u0442\u043e\u043a\u0435\u043d\u0438\u0437\u0430\u0446\u0438\u0438.<\/strong><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u043d\u043e\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043b\u0435\u043a\u0441\u0435\u043c(\u0434\u0430\u0436\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043f\u0440\u043e\u0431\u0435\u043b\u044b\/\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438) \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u0434\u0435\u0440\u0435\u0432\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c<\/strong> \u043a\u0430\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u0442\u0430\u043a \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 <strong>\u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043a\u043e\u0434\/\u0442\u0435\u043a\u0441\u0442 \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u0439\/\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432<\/strong>.<\/p>\n<\/li>\n<li>\n<p><strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f <strong>\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u0435\u0439<\/strong>(\u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f).<\/p>\n<\/li>\n<\/ul>\n<p> \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0430\u043c\u043e\u0439 \u0441\u043e\u0447\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438(\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0441\u0430\u043c\u043e\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043a\u043e\u0434): <\/p>\n<pre><code class=\"elixir\">t_target_struct:i_target_item{   t_keyword{     string kw=any_str_from_vec(split(\"struct,class\",\",\"));     \" \"? \/\/ optional separator   }   t_body_semicolon:i_struct_impl{\";\"}   t_body_impl:i_struct_impl{     \"{\" \/\/ \u0436\u0440\u0451\u043c \u0441\u043a\u043e\u0431\u043e\u0447\u043a\u0443     vector&lt;TAutoPtr&lt;i_target_item&gt;&gt; nested?; \/\/ \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e!     \" \"?     vector&lt;TAutoPtr&lt;i_struct_field&gt;&gt; arr?; \/\/ \u043f\u0430\u0440\u0441\u0438\u043c \u043f\u043e\u043b\u044f     \" \"?     TAutoPtr&lt;t_struct_cmds&gt; cmds?; \/\/ \u0423\u0413 \u0438\u0437 QapDSLv1     \" \"?     TAutoPtr&lt;t_cpp_code&gt; c?; \/\/ \u043d\u0430\u0433\u043b\u043e \u043f\u043e\u0436\u0438\u0440\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0421++ \u043a\u043e\u0434     \" \"?     \"}\"   }   t_parent{     string arrow_or_colon=any_str_from_vec(split(\"=&gt;,:\",\",\"));     \" \"?     t_name parent;   }   \/\/\u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043f\u0430\u0440\u0441\u0435\u0440:   TAutoPtr&lt;t_keyword&gt; kw?; \/\/ \u043f\u0430\u0440\u0441\u0438\u043c struct\/class   t_name name; \/\/\u043f\u0430\u0440\u0441\u0438\u043c \u0438\u043c\u044f   \" \"? \/\/ \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c   TAutoPtr&lt;t_parent&gt; parent?; \/\/ \u043f\u0430\u0440\u0441\u0438\u043c \u0438\u043c\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u044d\u0439\u0441\u0430 \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c   \" \"?   TAutoPtr&lt;i_struct_impl&gt; body; \/\/ \u043f\u0430\u0440\u0441\u0438\u043c \u0442\u0435\u043b\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438\u043b\u0438 \u0442\u043e\u0447\u043a\u0443 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439. }<\/code><\/pre>\n<h2>\u041f\u0440\u043e \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e<\/h2>\n<p>\u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e QapDSL(\u0438 \u043e\u0434\u043d\u0430 \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u043f\u0440\u043e QapGen), \u043d\u043e \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u0440\u043e QapDSLv1 \u044f \u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e, \u0442.\u043a \u043e\u043d\u0430 \u0431\u0435\u0437\u043d\u0430\u0434\u0451\u0436\u043d\u0430 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0430, \u043d\u043e \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u044f\u0437\u044b\u043a\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u043d\u0435 \u0437\u043d\u0430\u044e \u043a\u0430\u043a \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0432 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h2>\u041f\u0440\u043e \u0441\u043e\u0441\u0435\u0434\u043d\u044e\u044e \u0441\u0442\u0430\u0442\u044c\u044e<\/h2>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u0432\u044b\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0435 \u0441\u0442\u0430\u0442\u044c \u0432 \u043e\u0434\u043d\u043e \u0432\u0440\u0435\u043c\u044f. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430, \u0431\u0443\u0434\u0435\u0442 \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441 \u0441\u0430\u043c\u043e\u0439 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0436\u0435\u0441\u0442\u044c\u044e \u043f\u0440\u043e QapGen, \u0430 \u0432 \u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 JSON, \u043f\u0440\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/922128\/\" rel=\"noopener noreferrer nofollow\">\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 QapDSLv2 \u0438 \u0433\u0440\u043e\u043c\u043a\u0430\u044f \u0445\u0432\u0430\u043b\u0430 \u0435\u0433\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430<\/a>.<\/p>\n<h3>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0446\u0435\u043b\u0438 \u0438 \u043c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f QapDSLv2<\/h3>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/09b\/ede\/092\/09bede092b7c809900799056540dc53b.png\" width=\"762\" height=\"454\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/09b\/ede\/092\/09bede092b7c809900799056540dc53b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/09b\/ede\/092\/09bede092b7c809900799056540dc53b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043a \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043e\u0442\u043c\u0435\u0447\u0430\u043b\u0430\u0441\u044c \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0438\u0437\u043b\u0438\u0448\u043d\u0438\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438, \u0447\u0442\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u043b\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043a\u043e\u0434\u0430. \u0412\u0442\u043e\u0440\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f QapDSL \u0431\u044b\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u0441 \u0446\u0435\u043b\u044c\u044e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0438 \u0443\u043a\u043e\u0440\u043e\u0442\u0438\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 C++.<\/p>\n<h3>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f QapDSLv2<\/h3>\n<p><strong>\u041d\u043e\u0432\u044b\u0439 \u0443\u043a\u043e\u0440\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441<\/strong><\/p>\n<p>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0441\u0442\u0430\u043b \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u043c \u0438 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043c\u0435\u0441\u0442\u043e<\/p>\n<pre><code class=\"erlang\">t_num_with_sep{t_num num;t_sep sep;{go_auto(num);go_auto(sep);}}<\/code><\/pre>\n<p>\u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c<\/p>\n<pre><code class=\"css\">t_num_with_sep{t_num num;\" \"} \/\/ \u043a\u043e\u0434 \u0441 go_auto \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \/\/ \" \" - \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043d\u0430 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0439 t_sep \/\/ \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430 \u043a\u043e\u0433\u0434\u0430 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e using \" \" as t_sep;<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043a\u043e\u0434\u0430 QapGen<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"elixir\">\/\/ legacy lexer \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 \u0438\u0437 QapDSLv1 t_struct_cmd{ \/\/ \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u0438\u0434\u044b 'O+=go_minor&lt;major&gt;(minor);'   TAutoPtr&lt;i_struct_cmd_xxxx&gt; mode?; \/\/ \u043f\u0430\u0440\u0441\u0438\u0442 'O+='   t_name func; \/\/ \u043f\u0430\u0440\u0441\u0438\u0442 \u0438\u043c\u044f go_* \u043c\u0435\u0442\u043e\u0434\u0430   \" \"? \/\/ \" \" - \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043d\u0430 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0439 t_sep, \u0432\u043e\u043f\u0440\u043e\u0441\u0438\u043a - \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c.   string templ_params=str&lt;TAutoPtr&lt;t_templ_params&gt;&gt;()?; \/\/ \u043f\u0430\u0440\u0441\u0438\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u044b   \"(\" \/\/ \u043f\u043e\u0436\u0438\u0440\u0430\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0443\u044e\u0441\u044f \u0441\u043a\u043e\u0431\u043e\u0447\u043a\u0443   t_cmd_params params; \/\/\u043f\u0430\u0440\u0441\u0438\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0437 \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430   \")\" \/\/ \u043f\u043e\u0436\u0438\u0440\u0430\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0443\u044e\u0441\u044f \u0441\u043a\u043e\u0431\u043e\u0447\u043a\u0443   \" \"?   TAutoPtr&lt;i_struct_cmd_so&gt; cmdso?; \/\/ \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430 \u0444\u0438\u0433\u043d\u044f, \u043d\u0430\u0434\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c.   \" \"?   \";\" \/\/ \u043f\u043e\u0436\u0438\u0440\u0430\u0435\u0442 \u0442\u043e\u0447\u043a\u0443 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439. }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0435\u0439<\/strong><\/p>\n<p>\u041d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0444\u0443 \u043e \u043f\u043e\u043b\u044f\u0445 \u0438\u0437 QapDSLv2 \u0432 \u0421++ \u043a\u043e\u0434 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u0434\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u044f\u0449\u0438\u043c AST. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0442\u044d\u0433-\u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0445\u0430\u0442\u044c js-\u043a\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u043e\u043b\u044f\/\u043d\u043e\u0434\u044b. \u0418\u043b\u0438 \u044d\u0442\u043e \u043f\u043b\u043e\u0445\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440?<\/p>\n<pre><code class=\"elixir\">t_test20250618_atrr{   t_foo{{}[::]} \/\/ \u0442\u0435\u0441\u0442 \u0431\u0430\u044f\u043d\u0430.   t_foo foo; [skip] \/\/\u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0437\u0430\u0447\u0435\u043c-\u0442\u043e \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c   t_sep sep; [optimize,\"sep\",(\"sep\"),sep[x]] \/\/ \u0432\u043e\u0442 \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c }<\/code><\/pre>\n<p><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c C++ \u043a\u043e\u0434 \u0432 QapDSL \u0431\u0435\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f \u2014 \u00ab\u0431\u0430\u044f\u043d\u00bb [::]<\/strong><\/p>\n<p>\u042d\u0442\u043e \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 C++ \u043a\u043e\u0434 \u0432 QapDSLv2 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0438(<strong>[::]<\/strong>), \u0447\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043a\u043e\u0434\u043e\u043c \u0438 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c.<\/p>\n<h3>\u041a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f QapGen <\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c <strong>QapGen(\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432) <\/strong>\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f <strong>g++\/clang\/cl.exe<\/strong>, \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0438\u043c \u043a\u043e\u0434 \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434 <strong>linux\/windows<\/strong>, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f3\/62f\/99b\/7f362f99b12cca81b754f09cdbba4ee9.png\" alt=\"111\" title=\"111\" width=\"728\" height=\"722\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7f3\/62f\/99b\/7f362f99b12cca81b754f09cdbba4ee9.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f3\/62f\/99b\/7f362f99b12cca81b754f09cdbba4ee9.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>111<\/figcaption><\/div>\n<\/figure>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0434\u043b\u044f \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u043d\u0430 QapDSLv2<\/h3>\n<pre><code class=\"php\">t_simple_calc{   \/\/\u043e\u0431\u044c\u044f\u0432\u043b\u044f\u0435\u043c\u044b \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432 t_simple_calc \u043b\u0435\u043a\u0441\u0435\u0440\u044b   t_term{     TAutoPtr&lt;i_term&gt; value; \/\/ \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0439 \u043d\u043e\u0434\u044b\/\u043b\u0435\u043a\u0441\u0435\u0440\u0430.   }   t_number:i_term{     t_ext{       \".\" \/\/ \u0436\u0440\u0451\u043c \u0442\u043e\u0447\u0435\u0447\u043a\u0443.       string v=any(gen_dips(\"09\")); \/\/ \u0436\u0440\u0451\u043c \u0432\u0441\u0451 \u043e\u0442 0 \u0434\u043e 9 \u043f\u043e\u043a\u0430 \u043e\u043d\u043e \u0435\u0441\u0442\u044c.     }     t_impl{       string bef=any(gen_dips(\"09\"));       TAutoPtr&lt;t_ext&gt; ext?; \/\/ \u043f\u0430\u0440\u0441\u0438\u043c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 t_ext     }     string value=str&lt;t_impl&gt;(); \/\/ \u043f\u0430\u0440\u0441\u0438\u043c t_impl \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u0441\u0442\u0440\u043e\u043a\u0443.   }   t_divmul{     t_elem{       string oper=any_str_from_vec(split(\"\/,*\",\",\")); \/\/ \u0441\u0436\u0438\u0440\u0430\u0435\u043c \/ \u0438\u043b\u0438 *       t_term expr; \/\/ \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0441\u0442\u044c \u0441\u043a\u043e\u0431\u043a\u0438 \u0438 \u0447\u0438\u0441\u043b\u0430     }     t_term first;     vector&lt;t_elem&gt; arr?; \/\/ \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 t_elem   }   t_addsub{     t_elem{       string oper=any_str_from_vec(split(\"+,-\",\",\")); \/\/ \u0441\u0436\u0438\u0440\u0430\u0435\u043c + \u0438\u043b\u0438 -       t_divmul expr;     }     t_divmul first; \/\/ \u043f\u0430\u0440\u0441\u0438\u043c t_divmul, \u0442.\u043a \u0443 \u043d\u0435\u0433\u043e \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043e\u0440\u0435\u0442\u0435\u0442     vector&lt;t_elem&gt; arr?; \/\/ \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435   }   t_scope:i_term{     \"(\" \/\/ \u0435\u0434\u0438\u043c \u0441\u043a\u043e\u0431\u043a\u0443     t_addsub value; \/\/ \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 + \u0438\u043b\u0438 -,\u0442.\u043a \u0443 \u043d\u0438\u0445 \u043d\u0438\u0437\u043a\u0438\u0439 \u043f\u0440\u0438\u043e\u0440\u0442\u0435\u0442     \")\" \/\/ \u0435\u0449\u0451 \u0441\u043a\u043e\u0431\u043e\u0447\u043a\u0443   }   \/\/ \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430:   t_addsub value; \/\/ \u043f\u0430\u0440\u0441\u0438\u043c t_addsub }<\/code><\/pre>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 QapDSLv2<\/h3>\n<details class=\"spoiler\">\n<summary>\u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u043e\u0440, \u0430 \u043f\u043e\u0442\u043e\u043c \u044d\u0442\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">struct t_simple_calc_evalutor:t_simple_calc{   typedef t_simple_calc t_ast;   struct t_go:i_term_visitor{     void Do(t_number*ptr){Do(*ptr);}     void Do(t_scope*ptr){Do(*ptr);}     template&lt;class TYPE&gt;void Do(vector&lt;TYPE&gt;&amp;arr){for(auto&amp;ex:arr)Do(ex);}     void Do(t_term&amp;ref){       auto*ptr=ref.value.get();       ptr-&gt;Use(*this);     }     void Do(t_number&amp;ref){       rv=t_rv{\"imm\",ref.value};       v=std::stod(ref.value);     }     void Do(t_scope&amp;ref){       Do(ref.value);     }     void Do(t_divmul&amp;ref){       Do(ref.first);       auto cur_rv=rv;       auto cur=v;       for(auto&amp;ex:ref.arr){         Do(ex.expr);         if(\"\/\"==ex.oper)cur\/=v;         if(\"*\"==ex.oper)cur*=v;         if(\"\/\"==ex.oper)cur_rv=div(cur_rv,rv);         if(\"*\"==ex.oper)cur_rv=mul(cur_rv,rv);       }       v=cur;       rv=cur_rv;     }     void Do(t_addsub&amp;ref){       Do(ref.first);       auto cur_rv=rv;       auto cur=v;       for(auto&amp;ex:ref.arr){         Do(ex.expr);         if(\"+\"==ex.oper)cur+=v;         if(\"-\"==ex.oper)cur-=v;         if(\"+\"==ex.oper)cur_rv=add(cur_rv,rv);         if(\"-\"==ex.oper)cur_rv=sub(cur_rv,rv);       }       v=cur;       rv=cur_rv;     }     struct t_rv{       string type;       string value;       string get_reg()const{         auto t=split(value,\"\\n\");         if(t.back().empty())t.pop_back();         auto b=t.back();         return split(b,\"=\")[0];       }       int get_reg_id()const{         return std::stoi(split(get_reg(),\"\\2\")[0].substr(1));       }     };     t_rv rv_do(string cmd,t_rv a,t_rv b){       int reg_id=0;       auto reg=[](int reg_id){return \"\\1\"+std::to_string(reg_id)+\"\\2\";};       auto alloc_reg=[&amp;](){return reg(reg_id++);};       auto foo=[&amp;](const t_rv&amp;a){         if(a.type!=\"imm\")return a;         auto reg=alloc_reg();         return t_rv{\"asm\",reg+\"=\"+a.value};       };       auto fix=[&amp;](const t_rv&amp;a,int bef,int aft){         return t_rv{\"asm\",join(split(a.value,reg(bef)),reg(aft))};       };       string out;       auto ra=foo(a);auto a_id=ra.get_reg_id();reg_id=a_id+1;       auto rb=foo(b);auto b_id=rb.get_reg_id();reg_id=std::max(a_id+1,b_id+1);       for(int i=0;i&lt;=b_id;i++)if(i&lt;=a_id)if(rb.value.find(reg(i))!=std::string::npos)rb=fix(rb,i,reg_id++);       out+=ra.value+\"\\n\";       out+=rb.value+\"\\n\";       out+=alloc_reg()+\"=\"+cmd+\"(\"+ra.get_reg()+\",\"+rb.get_reg()+\")\\n\";       return t_rv{\"asm\",out};     }     t_rv div(t_rv a,t_rv b){       return rv_do(\"div\",a,b);     }     t_rv mul(t_rv a,t_rv b){       return rv_do(\"mul\",a,b);     }     t_rv add(t_rv a,t_rv b){       return rv_do(\"add\",a,b);     }     t_rv sub(t_rv a,t_rv b){       return rv_do(\"sub\",a,b);     }     real v=0;     t_rv rv;   }; };  void main_2021(IEnvRTTI&amp;Env){   \/\/{Sys$$&lt;t_simple_calc&gt;::GetRTTI(Env);};   t_simple_calc::t_addsub ast;   string inp;   std::cin&gt;&gt;inp;   string input=inp;\/\/\"100+2*(10+1*2)+30\/2-15-16-3\/1+3.14\/2.5*1-1000\";   auto ok=load_obj(Env,ast,input);   int gg=1;   t_simple_calc_evalutor::t_go go;   go.Do(ast);   std::cout&lt;&lt;\"Result: \"&lt;&lt;go.v&lt;&lt;std::endl&lt;&lt;std::endl;   string output=join(split(join(split(go.rv.value,\"\\1\"),\"r\"),\"\\2\"),\"\");   std::cout&lt;&lt;output&lt;&lt;std::endl;   int gg2=2; }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041a\u043e\u0434 \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u2014 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439 \u0438 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 (\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e).<\/p>\n<h3>\u0420\u0430\u0437\u0431\u043e\u0440 \u043a\u043e\u0434\u0430 \u043e\u0431\u0445\u043e\u0434\u0430 AST \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430<\/h3>\n<h3>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 t_simple_calc_evalutor<\/h3>\n<p>\u0420\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 <code>t_simple_calc<\/code>, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">struct t_simple_calc_evalutor : t_simple_calc {   typedef t_simple_calc t_ast;   struct t_go : i_term_visitor {     \/\/ \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 AST   }; }; <\/code><\/pre>\n<ul>\n<li>\n<p><code>t_go<\/code> \u2014 \u044d\u0442\u043e \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044c, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u0431\u0445\u043e\u0434\u0430<\/h3>\n<ul>\n<li>\n<p><strong>\u041e\u0431\u0445\u043e\u0434 \u0442\u0435\u0440\u043c\u043e\u0432 \u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432<\/strong><\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"cpp\">void Do(t_term&amp; ref) {   auto* ptr = ref.value.get();   ptr-&gt;Use(*this); } <\/code><\/pre>\n<p>\u0412\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u043c \u043c\u0435\u0442\u043e\u0434 <code>Use<\/code> \u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0443\u0437\u043b\u0430, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c.<\/p>\n<ul>\n<li>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0447\u0438\u0441\u0435\u043b<\/strong><\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"cpp\">void Do(t_number&amp; ref) {   rv = t_rv{\"imm\", ref.value};   v = std::stod(ref.value); } <\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0430\u0440\u0441\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 <code>double<\/code> \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0435 \u0435\u0433\u043e.<\/p>\n<ul>\n<li>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043a\u043e\u0431\u043e\u043a<\/strong><\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"cpp\">void Do(t_scope&amp; ref) {   Do(ref.value); } <\/code><\/pre>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043a\u043e\u0431\u043e\u043a.<\/p>\n<ul>\n<li>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u044f<\/strong><\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"cpp\">void Do(t_divmul&amp; ref) {   Do(ref.first);   auto cur_rv = rv;   auto cur = v;   for (auto&amp; ex : ref.arr) {     Do(ex.expr);     if (\"\/\" == ex.oper) cur \/= v;     if (\"*\" == ex.oper) cur *= v;     cur_rv = (\"\/\" == ex.oper) ? div(cur_rv, rv) : mul(cur_rv, rv);   }   v = cur;   rv = cur_rv; } <\/code><\/pre>\n<ul>\n<li>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u043d\u0434, \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>arr<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 <code>rv<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u044f<\/strong><\/p>\n<\/li>\n<\/ul>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043d\u043e \u0441 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 <code>+<\/code> \u0438 <code>-<\/code>.<\/p>\n<h3>\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u043a\u043e\u0434 (\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 t_rv \u0438 \u043c\u0435\u0442\u043e\u0434\u044b add, sub, mul, div)<\/h3>\n<ul>\n<li>\n<p><code>t_rv<\/code> \u0445\u0440\u0430\u043d\u0438\u0442 \u0442\u0438\u043f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 (<code>imm<\/code> \u2014 immediate, <code>asm<\/code> \u2014 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043a\u043e\u0434) \u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434\u044b <code>add<\/code>, <code>sub<\/code>, <code>mul<\/code>, <code>div<\/code> \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u043a\u043e\u0434 \u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0435, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u043e \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u043a\u043e\u0434 \u2014 \u0432\u0430\u0436\u043d\u044b\u0439 \u044d\u0442\u0430\u043f \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432.<\/p>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0437 main_2021<\/h3>\n<pre><code class=\"cpp\">t_simple_calc::t_addsub ast; string input; std::cin &gt;&gt; input; auto ok = load_obj(Env, ast, input);  t_simple_calc_evalutor::t_go go; go.Do(ast);  std::cout&lt;&lt;\"Result: \"&lt;&lt;go.v &lt;&lt; std::endl; std::cout&lt;&lt;join(split(join(split(go.rv.value,\"\\1\"),\"r\"),\"\\2\"),\"\")&lt;&lt;std::endl; <\/code><\/pre>\n<ul>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c AST \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u0431\u0445\u043e\u0434 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<\/li>\n<\/ul>\n<h2>\u041a\u0430\u043a \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432?<\/h2>\n<p>\u0414\u0430 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435! \u041f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0435\u0449\u0451 \u043a\u0443\u0447\u0443 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0438 \u043f\u043e\u0448\u043b\u043e \u043f\u043e\u0435\u0445\u0430\u043b\u043e. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f \u0438 \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0448\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 js \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043b\u0435\u043a\u0441\u0435\u0440\u044b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0437\u0430 \u043d\u0430\u0441:<\/p>\n<pre><code class=\"javascript\">var pad2=num=&gt;(num&lt;10?\"0\"+num:\"\"+num); return( `+,-,!,~ *,\/,% +,- &lt;&lt;,&gt;&gt; &lt;,&lt;=,&gt;,&gt;= ==,!= &amp; ^ | &amp;&amp; ||`.split(\"\\r\").join(\"\").split(\"\\n\").map((ops,i)=&gt;{   var e=\"t_lev\"+pad2(i==1?3:i+3);   var n=\"t_lev\"+pad2(i+4);   if(!i){     return `t_lev03{   string oper=any_str_from_vec(split(`+JSON.stringify(ops)+`,\",\"))?;   TAutoPtr&lt;i_expr&gt; expr; }`;   }   var oa=ops.split(\",\");   if(oa.length==1){     return n+`{   t_oper{\"`+oa[0]+`\" inline static const string value=\"`+oa[0]+`\";}   t_item{t_oper oper; `+e+` expr;}   `+e+` expr;   vector&lt;t_item&gt; arr?; }`;   }   return n+`{   t_oper{string value=any_str_from_vec(split(\"`+ops+`\",\",\"));}   t_item{t_oper oper;`+e+` expr;}   `+e+` expr;   vector&lt;t_item&gt; arr?; }`; }).join(\"\\n\"));<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435:<\/p>\n<pre><code class=\"cpp\">t_lev03{   string oper=any_str_from_vec(split(\"+,-,!,~\",\",\"))?;   TAutoPtr&lt;i_expr&gt; expr; } t_lev05{   t_oper{string value=any_str_from_vec(split(\"*,\/,%\",\",\"));}   t_item{t_oper oper;t_lev03 expr;}   t_lev03 expr;   vector&lt;t_item&gt; arr?; } t_lev06{   t_oper{string value=any_str_from_vec(split(\"+,-\",\",\"));}   t_item{t_oper oper;t_lev05 expr;}   t_lev05 expr;   vector&lt;t_item&gt; arr?; } t_lev07{   t_oper{string value=any_str_from_vec(split(\"&lt;&lt;,&gt;&gt;\",\",\"));}   t_item{t_oper oper;t_lev06 expr;}   t_lev06 expr;   vector&lt;t_item&gt; arr?; } t_lev08{   t_oper{string value=any_str_from_vec(split(\"&lt;,&lt;=,&gt;,&gt;=\",\",\"));}   t_item{t_oper oper;t_lev07 expr;}   t_lev07 expr;   vector&lt;t_item&gt; arr?; } t_lev09{   t_oper{string value=any_str_from_vec(split(\"==,!=\",\",\"));}   t_item{t_oper oper;t_lev08 expr;}   t_lev08 expr;   vector&lt;t_item&gt; arr?; } t_lev10{   t_oper{\"&amp;\" inline static const string value=\"&amp;\";}   t_item{t_oper oper; t_lev09 expr;}   t_lev09 expr;   vector&lt;t_item&gt; arr?; } t_lev11{   t_oper{\"^\" inline static const string value=\"^\";}   t_item{t_oper oper; t_lev10 expr;}   t_lev10 expr;   vector&lt;t_item&gt; arr?; } t_lev12{   t_oper{\"|\" inline static const string value=\"|\";}   t_item{t_oper oper; t_lev11 expr;}   t_lev11 expr;   vector&lt;t_item&gt; arr?; } t_lev13{   t_oper{\"&amp;&amp;\" inline static const string value=\"&amp;&amp;\";}   t_item{t_oper oper; t_lev12 expr;}   t_lev12 expr;   vector&lt;t_item&gt; arr?; } t_lev14{   t_oper{\"||\" inline static const string value=\"||\";}   t_item{t_oper oper; t_lev13 expr;}   t_lev13 expr;   vector&lt;t_item&gt; arr?; }<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0421++ \u043a\u043e\u0434 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0438\u043d\u043b\u0430\u0439\u043d\u0435\u043d\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0438 \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043a\u043e\u0433\u0434\u0430 \u044f \u043e\u0434\u043e\u0431\u0440\u044f\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0443 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0421++ \u043a\u043e\u0434\u0430 \u0432 \u043b\u0435\u043a\u0441\u0435\u0440\u044b. \u0422\u0430\u043a \u0442\u043e \u044d\u0442\u043e \u0443\u0436\u0430\u0441\u043d\u043e \u043f\u043b\u043e\u0445\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u0438\u0448\u0435\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0432 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0435\/\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0442\u043e\u0440\u0435\/\u043e\u0431\u0445\u043e\u0434\u0447\u0438\u043a\u0435 \u0438 \u0443 \u043d\u0430\u0441 \u0432\u0441\u0451 \u0447\u0451\u0442\u043a\u043e &#8212; \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c(\u043d\u0430\u0447\u0438\u043d\u0430\u0439\u0442\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441 DoLevel):<\/p>\n<pre><code class=\"cpp\">template&lt;class TYPE&gt; void exprUse(TYPE&amp;expr){   Do(&amp;expr); } \/\/template&lt;class TYPE&gt; void exprUse(TAutoPtr&lt;t_simple_stat_lex::i_expr&gt;&amp;expr){   QapAssert(expr);   expr-&gt;Use(*this); } void call_anyoper(vector&lt;t_expr_value&gt;&amp;values,const string&amp;oper){   auto params=get_types_from_values(values);   t_cmd_dev&lt;t_oper_stat&gt; cmddev(values,params,oper);   bool ok=cmddev.main(dev);   if(ok)return;   dev.push_frame();   weak_call_xxxx&lt;t_oper&gt;(dev,values,oper);   QapAssert(dev.isRet());   dev.pop_frame(); } void call_binoper(const string&amp;oper,t_expr_value&amp;&amp;bef,t_expr_value&amp;&amp;aft){   dev.push();   vector&lt;t_expr_value&gt; values;   values.push_back(std::move(bef));   values.push_back(std::move(aft));   call_anyoper(values,oper);   dev.pop(); } void call_oneoper(const string&amp;oper,t_expr_value&amp;&amp;value){   dev.push();   vector&lt;t_expr_value&gt; values;   values.push_back(std::move(value));   call_anyoper(values,oper);   dev.pop(); } template&lt;class TYPE&gt; void DoLevel(TYPE*p) {   exprUse(p-&gt;expr);   if(dev.isErr())return;   auto&amp;arr=p-&gt;arr;   if(arr.empty())return;   t_expr_value buff=std::move(dev.expr_buff);   for(int i=0;i&lt;arr.size();i++)   {     auto&amp;ex=arr[i];     exprUse(ex.expr);     if(dev.isErr())return;     const string&amp;oper=ex.oper.value;     call_binoper(oper,std::move(buff),std::move(dev.expr_buff));     if(dev.isErr())return;     buff=std::move(dev.expr_buff);     dev.expr_buff.value=nullptr;   }   dev.expr_buff=std::move(buff); } void Do(t_lev03*p){   exprUse(p-&gt;expr);   if(dev.isErr())return;   const auto&amp;oper=p-&gt;oper;   if(oper.empty())return;   call_oneoper(oper,std::move(dev.expr_buff)); } void Do(t_lev05*p){DoLevel(p);} void Do(t_lev06*p){DoLevel(p);} void Do(t_lev07*p){DoLevel(p);} void Do(t_lev08*p){DoLevel(p);} void Do(t_lev09*p){DoLevel(p);} void Do(t_lev10*p){DoLevel(p);} void Do(t_lev11*p){DoLevel(p);} void Do(t_lev12*p){DoLevel(p);} void Do(t_lev13*p){DoLevel(p);} void Do(t_lev14*p){DoLevel(p);}<\/code><\/pre>\n<p> \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043e\u0431\u0445\u043e\u0434 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0435\u0434\u0438\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>DoLevel<\/code>, \u0447\u0442\u043e \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <code>call_binoper<\/code> \u0438 <code>call_oneoper<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0442\u0435\u043a\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 <code>dev<\/code>. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u043d\u043e\u0432\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u0438 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0437\u0430 \u0441\u0447\u0451\u0442 \u0447\u0451\u0442\u043a\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u0445\u043e\u0434\u043e\u043c AST \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434. \u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c \u0447\u0438\u0441\u0442\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0438 \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0432 \u043f\u0430\u0440\u0441\u0435\u0440. <\/p>\n<h2>\u041f\u043e\u043b\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043d\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0445 go_*\u00a0\u043c\u0435\u0442\u043e\u0434\u043e\u0432<\/h2>\n<p>&#171;go_*\u00a0\u043c\u0435\u0442\u043e\u0434\u044b&#187; &#8212; \u044d\u0442\u043e \u0442\u043e \u0432\u043e \u0447\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0434 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"php\">t_some_lexer field=minor&lt;t_major&gt;(); \/\/ \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 dev.go_minor&lt;t_major&gt;(field); \/\/ \u0438\u043b\u0438 string var=str&lt;t_some_lexer&gt;(); \/\/ \u044d\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 dev.go_str&lt;t_some_lexer&gt;(var); \/\/ \u0438\u043b\u0438 string var=any(\"?*\"); \/\/ \u044d\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 dev.go_any(var,\"?*\");<\/code><\/pre>\n<p> <code>go_minor&lt;t_major&gt;(t_minor&amp;)<\/code> &#8212; \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u0438\u0436\u0430\u0442\u044c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043c\u0438\u043d\u043e\u0440\u0430 \u0438 \u0434\u0430\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043c\u0430\u0436\u043e\u0440\u0443 \u043f\u0435\u0440\u0432\u044b\u043c \u0432 \u0432\u044b\u0448\u0435\u0441\u0442\u043e\u044f\u0449\u0435\u043c \u043b\u0435\u043a\u0441\u0435\u0440\u0435.<\/p>\n<p><code>go_str&lt;t_lexer&gt;(string&amp;)<\/code> &#8212; \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043d\u0443\u0436\u0435\u043d \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u043c <code>t_lexer<\/code> \u043b\u0435\u043a\u0441\u0435\u043c\u0443, \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0451 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u043e\u0439, \u0430 \u043d\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u043e\u0439\/\u043b\u0438\u0441\u0442\u043e\u043c.<\/p>\n<p><code>go_without&lt;t_lexer&gt;(string&amp;)<\/code> &#8212; \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043d\u0443\u0436\u0435\u043d \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0451 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u043a\u0430 <code>t_lexer<\/code> \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c\/\u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c. \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<p><code>go_vec(vector&lt;t_lexer&gt;&amp;arr,const string&amp;sep)<\/code> &#8212; \u0423\u0413. \u043d\u0435 \u043d\u0443\u0436\u0435\u043d. \u0441\u0430\u043c\u0438 \u0438\u0437\u0443\u0447\u0430\u0439\u0442\u0435 \u0435\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<\/p>\n<p><code>go_auto(t_lexer&amp;)<\/code> &#8212; \u0422\u041e\u041f1 \u043c\u0435\u0442\u043e\u0434, \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0443\u0442 \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u0435\u0439 \u0431\u0435\u0437 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<h2>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435\/\u0437\u0430\u043f\u0443\u0441\u043a\u0443\/\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e<\/h2>\n<p><a class=\"anchor\" name=\"setup_run_use\" id=\"setup_run_use\"><\/a><\/p>\n<h3>\u041a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\/\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c QapGen?<\/h3>\n<pre><code class=\"elixir\">git clone https:\/\/github.com\/adler3d\/QapGen cd QapGen\/stable chmod +x build.sh .\/build.sh cd Release .\/QapGen.elf your_grammar_file.qapdsl.hpp dontoptimize_polymorphs &gt; output.inl<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0435 <code>output.inl<\/code>  \u043a \u0441\u0432\u043e\u0435\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443.<\/p>\n<p>\u0421\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443:<\/p>\n<pre><code class=\"elixir\">https:\/\/github.com\/adler3d\/QapGen\/tree\/master\/src\/SimpleCalc<\/code><\/pre>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b:<\/p>\n<p><code>QapGen\/src\/SimpleCalc\/SimpleCalc\/SimpleCalc.cpp<\/code><\/p>\n<p>\u0418 \u0432 \u043d\u0451\u043c \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c<code> #include \"t_simple_calc.inl\"<\/code> \u043d\u0430 <code>#include \"output.inl\"<\/code><\/p>\n<p><code>output.inl<\/code> \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0440\u044f\u0434\u043e\u043c \u0441 <code>SimpleCalc.cpp<\/code><\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u0434\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441 <code>t_simple_calc_evalutor<\/code> \u0438 \u0432 <code>main_2021<\/code> \u0434\u043e\u0432\u0435\u0441\u0442\u0438 \u043a\u043e\u0434 \u0434\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u043e\u0442\u0442\u0443\u0434\u0430 \u0432\u0441\u0451 \u0443\u0431\u0440\u0430\u0442\u044c \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cpp\">string input=\"your_script_or_code_or_text\"; t_your_root_lexer root_lexer; auto ok=load_obj(root_lexer,input); if(!ok)return; \/\/ \u0434\u0430\u043b\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u0435\u0439 \u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0434\u0435\u0440\u0435\u0432\u043e \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0435\u0441\u044f \u0432 root_lexer<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u0434\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c\/\u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>SimpleCalc.cpp<\/code> \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0443:<\/p>\n<pre><code class=\"elixir\">g++ -O2 -std=c++17 SimpleCalc.cpp -o SimpleCalc.elf .\/SimpleCalc.elf<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0442\u0435\u0445 \u043a\u0442\u043e \u043f\u043e\u0434 <code>Windows<\/code> \u0435\u0441\u0442\u044c <code>SimpleCalc.sln<\/code> \u0434\u043b\u044f <code>MSVS2017<\/code> \u0438 <code>build.bat<\/code> \u0432      <code>QapGen\/src\/SimpleCalc<\/code><\/p>\n<h2>\u0420\u0430\u0437\u0431\u043e\u0440 t_poly_tool \u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u0443 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432<\/h2>\n<h3>\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/h3>\n<p><code> t_poly_tool<\/code> \u2014 \u044d\u0442\u043e \u043c\u043e\u0449\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430\u043c\u0438 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u0432 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432. \u041e\u043d \u0441\u0442\u0440\u043e\u0438\u0442 \u0433\u0440\u0430\u0444 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0442\u0438\u043f\u0430\u043c\u0438, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0446\u0438\u043a\u043b\u043e\u0432 \u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0434\u0451\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u0432 \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435. \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c <code>go_poly<\/code> \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043e\u0431\u0445\u043e\u0434\u0430, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u0425\u043e\u0442\u0435\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439<\/summary>\n<div class=\"spoiler__content\">\n<h3>\u041e\u0431\u0449\u0430\u044f \u0438\u0434\u0435\u044f<\/h3>\n<p><code> t_poly_tool<\/code> \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 (\u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430\u043c\u0438) \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432. \u041e\u043d:<\/p>\n<ul>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 <code>config.cfg<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0425\u0440\u0430\u043d\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u0438\u043f\u0430\u0445, \u0438\u0445 \u0441\u0432\u044f\u0437\u044f\u0445 \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>&#8230;<\/p>\n<\/li>\n<li>\n<p>&#8230;<\/p>\n<\/li>\n<\/ul>\n<h3>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b<\/h3>\n<h3>1. \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/h3>\n<ul>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>get()<\/code> \u2014 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430, \u043b\u0438\u0431\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u044b\u0439, \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>save_doc()<\/code> \u2014 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0444\u0430\u0439\u043b.<\/p>\n<\/li>\n<\/ul>\n<h3>2. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0442\u0438\u043f\u043e\u0432 \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/h3>\n<ul>\n<li>\n<p><code>find()<\/code> \u2014 \u043f\u043e\u0438\u0441\u043a \u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0442\u0438\u043f\u0430.<\/p>\n<\/li>\n<li>\n<p><code>get_base_arr()<\/code> \u2014 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0432\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p><code>get_mass()<\/code> \u2014 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0442\u0438\u043f\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.<\/p>\n<\/li>\n<\/ul>\n<h3>3. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0446\u0438\u043a\u043b\u043e\u0432<\/h3>\n<ul>\n<li>\n<p><code>t_point<\/code> \u2014 \u0443\u0437\u0435\u043b \u0433\u0440\u0430\u0444\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0441 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0438 \u0438 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0438 \u0440\u0451\u0431\u0440\u0430\u043c\u0438, \u0444\u043b\u0430\u0433\u043e\u043c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u0433\u0440\u0443\u043f\u043f\u043e\u0439.<\/p>\n<\/li>\n<li>\n<p><code>t_points<\/code> \u2014 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u0442\u043e\u0447\u0435\u043a \u0441 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p><code>load_points()<\/code> \u2014 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u043e\u0447\u0435\u043a \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u0438\u043c\u0451\u043d \u0442\u0438\u043f\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><code>load_edges_from_events()<\/code> \u2014 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0440\u0451\u0431\u0435\u0440 \u0433\u0440\u0430\u0444\u0430 \u0438\u0437 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p><code>isCyclical()<\/code> \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0446\u0438\u043a\u043b\u043e\u0432 \u0432 \u0433\u0440\u0430\u0444\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443.<\/p>\n<\/li>\n<li>\n<p><code>toList()<\/code> \u2014 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u043e\u0431\u0445\u043e\u0434\u0430 \u0442\u043e\u0447\u0435\u043a \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>4. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438 \u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0430<\/h3>\n<ul>\n<li>\n<p><code>list_apply_events()<\/code> \u2014 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432 \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0446\u0438\u043a\u043b\u044b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p><code>remake()<\/code> \u2014 \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0442\u0438\u043f\u043e\u0432 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e.<\/p>\n<\/li>\n<\/ul>\n<h3>5. \u0428\u0430\u0431\u043b\u043e\u043d go_poly \u2014 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439<\/h3>\n<ul>\n<li>\n<p>\u0425\u0440\u0430\u043d\u0438\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043e\u0431\u0445\u043e\u0434\u0430 (<code>out_arr<\/code>), \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <code>dev<\/code> (\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\/\u043f\u0430\u0440\u0441\u0435\u0440\u0430), \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <code>ref<\/code> \u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>go_for&lt;T&gt;()<\/code> \u2014 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <code>T<\/code>, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>main()<\/code> \u2014 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043e\u0431\u0445\u043e\u0434\u0430 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 (<code>t_poly_tool<\/code>), \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u043e \u00ab\u043c\u0430\u0441\u0441\u0435\u00bb (\u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0443) \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 <code>ref<\/code>.<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u0411\u043e\u043b\u044c\u0448\u0435 \u0442\u0435\u0445\u043d\u043e-\u0436\u0435\u0441\u0442\u0438!!! \u0410 \u043d\u0443 \u043f\u043e\u043a\u0430\u0436\u0438 \u043a\u043e\u0434!<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">struct t_poly_tool:public t_config_2013{   \/\/struct t_lex{   \/\/  std::function&lt;void(t_poly_tool*)&gt; func;   \/\/  CharMask m;   \/\/};   t_doc doc;   static t_poly_tool&amp;get(\/*IEnvRTTI&amp;Env*\/){     static const string fn=\"config.cfg\";     static t_poly_tool tool;     static t_doc&amp;doc=tool.doc;     static QapClock clock;     static bool first=true;     if(first){clock.Start();\/*doc.lines.reserve(2048);*\/}     if(clock.MS()&lt;360*1000)if(!first)return tool;     first=false;     clock.Stop();clock.Start();     CrutchIO IO;     bool ok=IO.LoadFile(fn);     if(ok){t_doc tmp;doc=std::move(tmp);\/*doc.lines.reserve(2048);*\/}     if(!ok){       IO.mem.clear();       QapAssert(save_obj(\/*Env,*\/doc,IO.mem));       IO.SaveFile(fn);       return tool;     }     clock.Stop();clock.Start();     QapAssert(load_obj(\/*Env,*\/doc,IO.mem));clock.Stop();clock.Start();     real time=clock.MS();     clock.Stop();clock.Start();     \/\/doc.lines.reserve(2048);     return tool;   }   void save_doc(\/*IEnvRTTI&amp;Env,*\/const string&amp;fn){     CrutchIO IO;     QapAssert(save_obj(\/*Env,*\/this-&gt;doc,IO.mem));     IO.SaveFile(fn);   } public:   t_line&amp;find(const string&amp;type){     auto&amp;arr=doc.lines;     for(int i=0;i&lt;arr.size();i++)     {       auto&amp;ex=arr[i];       if(ex.head==type)return ex;     }     arr.push_back(t_line());     auto&amp;back=arr.back();     back.head=type;     return back;   }   template&lt;class TYPE&gt;   vector&lt;t_item&gt;&amp;get_base_arr(\/*IEnvRTTI&amp;Env,*\/const string&amp;basetype,vector&lt;TYPE&gt;&amp;inp,const vector&lt;string&gt;&amp;types){     auto&amp;base=find(basetype);     auto&amp;arr=base.arr;     if(arr.size()==inp.size())return arr;     if(arr.size()){       if(arr.size()!=types.size())QapNoWay();       for(auto&amp;ex:arr){         QapAssert(qap_includes(types,ex.type));       }       return arr;     }     QapAssert(base.arr.empty());     arr.resize(inp.size());     for(int i=0;i&lt;arr.size();i++){       auto&amp;ex=arr[i];       ex.type=inp[i].info;     }     save_doc(\/*Env,*\/\"config.cfg\");     return arr;   }   static int get_mass(const vector&lt;t_item&gt;&amp;arr,const string&amp;type){     for(int i=0;i&lt;arr.size();i++){       auto&amp;ex=arr[i];       if(ex.type==type)return i;     }     QapAssert(false);     return -1;   } public:   struct t_point{     int id;     string name;     vector&lt;int&gt; inp;     vector&lt;int&gt; out;     bool passed;     int group;   }; public:   template&lt;class TYPE&gt;   struct t_out_rec{     const char*info;     TAutoPtr&lt;TYPE&gt; object;     int pos;     int mass;     t_out_rec(){pos=-1;mass=-1;}     t_out_rec(t_out_rec&amp;&amp;ref){info=std::move(ref.info);object=std::move(ref.object);pos=ref.pos;mass=ref.mass;}   }; public:   struct t_points{     vector&lt;t_point&gt; arr;     t_point&amp;find(const string&amp;name){       for(int i=0;i&lt;arr.size();i++){         auto&amp;ex=arr[i];         if(name==ex.name)return ex;       }       QapAssert(false);       return *(t_point*)nullptr;     }     void set_passed(bool value){       for(int i=0;i&lt;arr.size();i++){         auto&amp;ex=arr[i];         ex.passed=value;       }     }     void load_points(const vector&lt;string&gt;&amp;inp){       arr.resize(inp.size());       for(int i=0;i&lt;inp.size();i++){         auto&amp;ex=inp[i];         auto&amp;p=arr[i];         p.name=ex;         p.id=i;         p.passed=false;         p.group=-1;       }     }     void load_edges_from_events(const vector&lt;t_event&gt;&amp;events){       for(int i=0;i&lt;events.size();i++){         auto&amp;ex=events[i];         auto&amp;pa=find(ex.A.type);         auto&amp;pb=find(ex.B.type);         pa.inp.push_back(pb.id);         pb.out.push_back(pa.id);       }     }     struct t_wave{       t_points&amp;points;       vector&lt;int&gt; prev;       vector&lt;int&gt; next;       int first_id;       int group;       bool result;       void update(int id)       {         auto&amp;ex=points.arr[id];         ex.group=group;         ex.passed=true;         auto&amp;arr=ex.out;         for(int i=0;i&lt;arr.size();i++){           auto&amp;id=arr[i];           auto&amp;ex=points.arr[id];           QapAssert(id!=first_id);           if(first_id==id)result=true;           next.push_back(ex.id);         }       }       void run()       {         points.set_passed(false);         next.push_back(first_id);         for(int iter=0;!next.empty();iter++)         {           prev=std::move(next);           for(int i=0;i&lt;prev.size();i++){             auto&amp;id=prev[i];             auto&amp;ex=points.arr[id];             if(ex.passed)continue;             update(ex.id);           }         }       }     };     bool isCyclical(){       t_wave wave={*this};       wave.result=false;       string view;view.resize(arr.size());       for(int i=0;i&lt;arr.size();i++){         auto&amp;ex=arr[i];         for(int i=0;i&lt;arr.size();i++){view[i]=arr[i].group&lt;0?'N':'0'+arr[i].group;}         if(ex.group&gt;=0)continue;         wave.first_id=ex.id;         wave.group=ex.id;         wave.run();       }       return wave.result;     }     vector&lt;string&gt; toList(){       vector&lt;string&gt; out;       set_passed(false);       vector&lt;int&gt; heads;       for(int i=0;i&lt;arr.size();i++){         auto&amp;ex=arr[i];         if(!ex.out.empty())continue;         heads.push_back(ex.id);       }       vector&lt;int&gt; next;       for(int iter=0;!heads.empty();iter++)       {         vector&lt;int&gt; next_heads;         for(int i=0;i&lt;heads.size();i++){           auto&amp;id=heads[i];           auto&amp;ex=arr[id];           auto&amp;inp=ex.inp;           for(int i=0;i&lt;inp.size();i++){             auto&amp;id=inp[i];             auto&amp;ex=arr[id];             if(ex.passed)continue;             bool found=false;             for(int i=0;i&lt;next_heads.size();i++)if(next_heads[i]==ex.id)found=true;             if(found)continue;             next_heads.push_back(ex.id);           }         }         for(int i=0;i&lt;next_heads.size();i++){           auto&amp;id=next_heads[i];           auto&amp;ex=arr[id];           auto&amp;out=ex.out;           bool ok=true;           for(int i=0;i&lt;out.size();i++){             auto&amp;id=out[i];             for(int i=0;i&lt;next_heads.size();i++){               if(next_heads[i]==id)ok=false;             }           }           if(!ok)continue;           next.push_back(ex.id);         }         for(int i=0;i&lt;next.size();i++){           auto&amp;id=next[i];           auto&amp;ex=arr[id];           ex.passed=true;         }         std::sort(heads.begin(),heads.end());         for(int i=0;i&lt;heads.size();i++){           auto&amp;id=heads[i];           auto&amp;ex=arr[id];           out.push_back(ex.name);         }         heads=std::move(next);       }       return out;     }   }; public:   typedef t_config_2013::t_event t_event;   typedef t_config_2013::t_item t_item;   static vector&lt;string&gt; list_apply_events(const vector&lt;string&gt;&amp;arr,vector&lt;t_event&gt;&amp;events){     t_points points;     points.load_points(arr);     points.load_edges_from_events(events);     bool ok=!points.isCyclical();     QapAssert(ok);     auto list=points.toList();     return list;   }   void remake(vector&lt;t_item&gt;&amp;points,vector&lt;t_event&gt;&amp;events){     vector&lt;string&gt; arr;     arr.resize(points.size());     for(int i=0;i&lt;arr.size();i++){       arr[i]=points[i].type;     }     auto out=list_apply_events(arr,events);     QapAssert(out.size()==points.size());     for(int i=0;i&lt;arr.size();i++){       points[i].type=out[i];     }   } public:   template&lt;class TYPE&gt;   struct go_poly{     vector&lt;t_out_rec&lt;TYPE&gt;&gt;&amp;out_arr;     i_dev&amp;dev;     TAutoPtr&lt;TYPE&gt;&amp;ref;     t_fallback&amp;scope;     int&amp;count;     int&amp;first_id;     const string&amp;strbasetype;     \/\/IEnvRTTI&amp;Env;     struct t_lex{       const char*pname=nullptr;       std::function&lt;void(typename TYPE::t_poly_impl*)&gt; func;       CharMask m;     };     template&lt;class T&gt;     void go_for(){       t_fallback scope(dev,__FUNCTION__);       T tmp;       scope.ok=tmp.go(dev);       t_out_rec&lt;TYPE&gt; rec;       static const string strtype=T::ProxySys$$::GetFullName();       rec.info=strtype.c_str();       if(scope.ok)       {         rec.object=make_unique&lt;T&gt;(std::move(tmp));         \/\/auto*p=rec.object.get();         \/\/*p=std::move(tmp);         if(!count)first_id=out_arr.size();         count++;       }       dev.getPos(rec.pos);       out_arr.push_back(std::move(rec));       scope.ok=false;     }     template&lt;size_t N=0&gt;     void main(array&lt;t_lex,N&gt;*plexs=nullptr)     {       typedef t_poly_tool::t_out_rec&lt;TYPE&gt; t_out_rec;       if(!count){scope.ok=false;return;}       auto use=[this](t_out_rec&amp;ex){         QapAssert(ex.object);         ref=std::move(ex.object);         dev.setPos(ex.pos);         scope.ok=true;       };       if(count==1)       {         auto&amp;ex=out_arr[first_id];         use(ex);         return;       }       #ifndef QAP_POLY_TOOL_DEBUG       auto id=QAP_MINVAL_ID_OF_VEC(out_arr,-ex.pos);       use(out_arr[id]);       return;       #endif       auto&amp;tool=t_poly_tool::get(\/*Env*\/);       static vector&lt;string&gt; types;       if(types.empty()&amp;&amp;plexs){         for(auto&amp;ex:*plexs)types.push_back(ex.pname);       }       auto&amp;arr=tool.get_base_arr(\/*Env,*\/strbasetype,out_arr,types);       vector&lt;t_out_rec&gt; out;       auto update_mass=[&amp;](){         for(int i=0;i&lt;out.size();i++){           auto&amp;ex=out[i];           ex.mass=t_poly_tool::get_mass(arr,ex.info);         }       };       for(int i=0;i&lt;out_arr.size();i++){         auto&amp;ex=out_arr[i];         if(!ex.object)continue;         out.push_back(std::move(ex));       }       update_mass();       vector&lt;int&gt; idarr;idarr.resize(out.size());       for(int i=0;i&lt;out.size();i++){idarr[i]=i;}       if(true)       {         auto comp_pos=[&amp;out](const int&amp;a,const int&amp;b)-&gt;bool{return out[a].pos&gt;out[b].pos;};         std::sort(std::begin(idarr),std::end(idarr),comp_pos);         QapAssert(out[idarr[0]].pos&gt;out[idarr[1]].pos);         int fix_count=0;         for(int i=1;i&lt;out.size();i++){           auto&amp;pa=idarr[i-1];           auto&amp;pb=idarr[i-0];           auto&amp;a=out[pa];           auto&amp;b=out[pb];           \/\/if(a.mass&lt;b.mass)continue;           auto&amp;base=tool.find(strbasetype);           auto&amp;events=base.events;           auto find_event=[&amp;events](const string&amp;a,const string&amp;b)-&gt;bool{             for(int i=0;i&lt;events.size();i++){               if(events[i].A.type!=a)continue;               if(events[i].B.type!=b)continue;               return true;             }             return false;           };           bool flag_ab=find_event(a.info,b.info);           bool flag_ba=find_event(b.info,a.info);           QapAssert(!flag_ba);           if(flag_ab)continue;           events.push_back(t_config_2013::t_event());           auto&amp;back=events.back();           back.time=cur_date_str();           back.A.pos=IToS(a.pos);           back.A.type=a.info;           back.B.pos=IToS(b.pos);           back.B.type=b.info;           fix_count++;         }         if(fix_count){           auto&amp;base=tool.find(strbasetype);           auto&amp;events=base.events;           tool.remake(base.arr,events);           tool.save_doc(\/*Env,*\/\"config.cfg\");           update_mass();         }       }       auto comp_func=[&amp;out](const int&amp;a,const int&amp;b)-&gt;bool{return out[a].mass&lt;out[b].mass;};       std::sort(std::begin(idarr),std::end(idarr),comp_func);       QapAssert(out[idarr[0]].mass&lt;out[idarr[1]].mass);       for(int i=1;i&lt;out.size();i++){         auto&amp;pa=idarr[i-1];         auto&amp;pb=idarr[i-0];         auto&amp;a=out[pa];         auto&amp;b=out[pb];         if(a.pos&gt;b.pos)continue;         string msg=\"wrong mass for:\\n\";         msg+=\"a.info = \"+string(a.info)+\"\\n\";         msg+=\"a.pos = \"+IToS(a.pos)+\"\\n\";         msg+=\"b.info = \"+string(b.info)+\"\\n\";         msg+=\"b.pos = \"+IToS(b.pos)+\"\\n\";         QapDebugMsg(msg);       }       use(out[idarr[0]]);     }   }; };<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/details>\n<h2>\u0420\u0430\u0437\u0431\u043e\u0440 \u043a\u043e\u0434\u0430, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0434 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432<\/h2>\n<h2>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 lexer2vecofchar<\/h2>\n<h3>\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>lexer2vecofchar<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (<code>string<\/code>), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 <strong>\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/strong> \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043b\u0435\u043a\u0441\u0435\u0440\u0430. \u042d\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u2014 \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435.<\/p>\n<h3>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430<\/h3>\n<ol>\n<li>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u044b\u0445 \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432<\/strong><\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cpp\">if(lexer.is_interface){   return polylexer2vecofchar(lexer); }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043b\u0435\u043a\u0441\u0435\u0440 \u2014 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043d\u044b\u0439 (\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0439), \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>polylexer2vecofchar<\/code>.<\/p>\n<ol start=\"2\">\n<li>\n<p><strong>\u041e\u0431\u0445\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434 \u043b\u0435\u043a\u0441\u0435\u0440\u0430<\/strong><\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"cpp\">for(auto&amp; c : lexer.cmds){   auto&amp; fields = lexer.farr;   t_struct_cmd cmd;   QapAssert(load_obj(cmd, c));   ... } <\/code><\/pre>\n<ul>\n<li>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043b\u0435\u043a\u0441\u0435\u0440\u0430 (<code>cmd<\/code>) \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>cmd.func.value<\/code> \u2014 \u0438\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430 <code>go_*<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u0440\u0430\u0437\u0431\u043e\u0440\u0430.<\/p>\n<\/li>\n<\/ul>\n<ol start=\"3\">\n<li>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 <\/strong><code><strong>go_*<\/strong><\/code><strong> \u043c\u0435\u0442\u043e\u0434\u043e\u0432<\/strong><\/p>\n<\/li>\n<\/ol>\n<ul>\n<li>\n<p><code><strong>go_const<\/strong><\/code> \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0435\u043a\u0441\u0435\u0440 \u043e\u0436\u0438\u0434\u0430\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p><code><strong>go_any<\/strong><\/code><strong> \/ <\/strong><code><strong>go_any_char<\/strong><\/code> \u2014 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u0435\u043a\u0441\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u044f\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>collect_expected_chars<\/code>.<\/p>\n<\/li>\n<li>\n<p><code><strong>go_any_str_from_vec<\/strong><\/code> \u2014 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043d\u043e \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p><code><strong>go_auto<\/strong><\/code> \u2014 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043b\u0435\u043a\u0441\u0435\u0440\u044b, \u0432\u044b\u0434\u0438\u0440\u0430\u044f \u0438\u0445 \u0442\u0438\u043f\u044b \u0438\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439. \u0413\u0440\u0430\u043c\u043e\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0438 \u0441 (<code>TAutoPtr<\/code>, <code>vector<\/code>).<\/p>\n<\/li>\n<li>\n<p><code><strong>go_str<\/strong><\/code><strong> \/ <\/strong><code><strong>go_vec<\/strong><\/code> \u2014 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043b\u0435\u043a\u0441\u0435\u0440\u044b \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044f \u0438\u0445 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><code><strong>go_minor<\/strong><\/code> \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u043e\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439. <em>\/\/ \u043f\u043e\u043a\u0430 \u0431\u0435\u0437 \u0443\u0447\u0451\u0442\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0438\u0431\u043e \u0441\u043b\u043e\u0436\u043d\u043e.<\/em><\/p>\n<\/li>\n<\/ul>\n<ol start=\"4\">\n<li>\n<p><strong>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/strong><\/p>\n<\/li>\n<\/ol>\n<ul>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (<code>string out<\/code>), \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 \u0438\u0437 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u0430\u0441\u0441\u0435\u0440\u0442\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0438\u043f\u043e\u0432 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440.<\/p>\n<\/li>\n<\/ul>\n<ol start=\"5\">\n<li>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/strong><\/p>\n<\/li>\n<\/ol>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 <code>go_*<\/code> \u043c\u0435\u0442\u043e\u0434 \u2014 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 lexer2vecofchar<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">string lexer2vecofchar(const t_lexer&amp;lexer)const{   if(lexer.is_interface){     return polylexer2vecofchar(lexer);   }   string out;   for(auto&amp;c:lexer.cmds){     auto&amp;fields=lexer.farr;     t_struct_cmd cmd;     QapAssert(load_obj(cmd,c));     auto*p=t_struct_cmd_mode::UberCast(cmd.mode.get());     \/\/QapAssert(p);     bool opt=p?p-&gt;body=='O':false;     auto fn=cmd.func.value;     if(fn==\"go_const\"){       QapAssert(cmd.params.arr.size()==1);       auto s=cmd.params.arr[0].body;       QapAssert(s.size()&gt;2);       \/\/TAutoPtr&lt;vector&lt;i_str_item&gt;&gt; si;\/\/load_obj(si,s);       auto bs=BinString::fullCppStr2RawStr(s);       out.push_back(bs[0]);       QapAssert(!opt);       return out;       int gg=1;     }     auto bad_type_checker=[](auto&amp;lex,const string&amp;type){       string s=lex2str(*lex.get());       return s.substr(0,type.size())==type;     };     if(fn==\"go_any\"||fn==\"go_any_char\"){       QapAssert(cmd.params.arr.size()==2);       auto&amp;cpa0b=cmd.params.arr[0].body;       auto&amp;f=find_field(lexer,cpa0b);       if(fn==\"go_any\")QapAssert(bad_type_checker(f.type,\"string\"));       if(fn==\"go_any_char\")QapAssert(bad_type_checker(f.type,\"char\"));       auto p0=cmd.params.arr[0].body;       auto p1=cmd.params.arr[1].body;\/\/ \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 gen_dips(\"09\")+\"str\"+\"other_str\"       t_cmd_param p1p;       QapAssert(load_obj(p1p,p1));       collect_expected_chars(p1p,out);       if(opt)continue;       return out;     }     if(fn==\"go_any_str_from_vec\"){       QapAssert(cmd.params.arr.size()==2);       auto&amp;cpa0b=cmd.params.arr[0].body;       auto&amp;f=find_field(lexer,cpa0b);       QapAssert(bad_type_checker(f.type,\"string\"));       auto p0=cmd.params.arr[0].body;       auto p1=cmd.params.arr[1].body;\/\/ \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 split(\"0,9\",\",\")       t_cmd_param p1p;       QapAssert(load_obj(p1p,p1));       collect_expected_chars(p1p,out,true);       if(opt)continue;       return out;     }     if(fn==\"go_end\"){       QapAssert(cmd.params.arr.size()==1);       auto&amp;cpa0b=cmd.params.arr[0].body;       auto&amp;f=find_field(lexer,cpa0b);       auto p0=cmd.params.arr[0].body;       auto p1=cmd.params.arr[1].body;       auto p1s=BinString::fullCppStr2RawStr(p1);       if(p1s.size()==1)QapDebugMsg(\"use go_any(dip_inv(\"+p1+\")) instead of go_end(\"+p1+\")\");       QapDebugMsg(\"go_end with str - under construction\");     }     typedef t_cppcore::t_varcall_expr::t_var t_var;     auto tp2var=[](const auto&amp;tp,t_var&amp;out){       auto*ptp=t_cppcore::t_varcall_expr::t_template_part::UberCast(tp.get());       string s;save_obj(ptp-&gt;expr,s);       QapAssert(load_obj(out,s));     };     struct t_for_autoptr_r{       bool con=false;       bool ret=false;     };     auto for_autoptr=[&amp;](const t_var&amp;var,const string&amp;tpn)-&gt;t_for_autoptr_r{       if(tpn!=\"TAutoPtr\")return {};       t_var inner_param;       tp2var(var.tp,inner_param);       auto inner_pn=inner_param.name.value;       vector&lt;string&gt; ftn;       if(inner_param.tp){         auto*p=t_cppcore::t_varcall_expr::t_dd_part::UberCast(inner_param.tp.get());         QapAssert(p);         auto&amp;arr=p-&gt;arr;         for(auto&amp;ex:arr){           ftn.push_back(ex.name.value);         }       }       string ln=inner_pn+(ftn.size()?\"::\":\"\")+join(ftn,\"::\");       auto*pl_inner=find_lexer_by_name_but_relative(ln,lexer);       QapAssert(pl_inner);       auto nested_chars=lexer2vecofchar(*pl_inner);       QapAssert(!nested_chars.empty());       out+=nested_chars;       if(!opt)return {false,true};       return {true,false};     };     if(fn==\"go_auto\"){       QapAssert(cmd.params.arr.size()==1);       auto&amp;cpa0b=cmd.params.arr[0].body;       auto&amp;f=find_field(lexer,cpa0b);       auto*pvc=t_cppcore::t_varcall_expr::UberCast(f.type.get());       QapAssert(pvc);       auto&amp;v=pvc-&gt;var;       if(v.name.value==\"TAutoPtr\"){         auto r=for_autoptr(v,v.name.value);         if(r.ret)return out;         if(r.con)continue;       }       if(v.name.value==\"vector\"){         QapAssert(v.tp);         t_var template_param;         tp2var(v.tp,template_param);         auto tpn=template_param.name.value;         QapAssert(tpn!=\"vector\");         auto r=for_autoptr(template_param,tpn);         if(r.ret)return out;         if(r.con)continue;         auto*pl=find_lexer_by_name_but_relative(tpn,lexer);         QapAssert(pl);         out+=lexer2vecofchar(*pl);         if(!opt)return out;         continue;       }       auto*pl=find_lexer_by_name_but_relative(v.name.value,lexer);       QapAssert(pl);       out+=lexer2vecofchar(*pl);       if(!opt)return out;       continue;     }     if(fn==\"go_str\"||fn==\"go_vec\"){       QapAssert(cmd.params.arr.size()==1);       auto&amp;cpa0b=cmd.params.arr[0].body;       auto&amp;f=find_field(lexer,cpa0b);       auto*pvc=t_cppcore::t_varcall_expr::UberCast(f.type.get());       QapAssert(pvc);       auto&amp;v=pvc-&gt;var;       if(fn==\"go_str\"&amp;&amp;v.name.value!=\"string\")QapDebugMsg(\"go_str support only string type of field\");       QapAssert(cmd.templ_params.size());       TAutoPtr&lt;t_templ_params&gt; tp;       QapAssert(load_obj(tp,cmd.templ_params));       QapAssert(tp-&gt;body.size());       TAutoPtr&lt;t_type_templ_params&gt; ttp;       QapAssert(load_obj(ttp,tp-&gt;body));       QapAssert(ttp);       QapAssert(ttp-&gt;first.body);       auto*ptit=t_meta_lexer::t_type_item_type::UberCast(ttp-&gt;first.body.get());       QapAssert(ptit);       if(ptit-&gt;type.value==\"vector\"||ptit-&gt;type.value==\"TAutoPtr\"){         QapAssert(ptit-&gt;param);         auto*ptta=t_meta_lexer::t_type_templ_angle::UberCast(ptit-&gt;param-&gt;body.get());         QapAssert(ptta);         QapAssert(ptta-&gt;params);         QapAssert(ptta-&gt;params-&gt;first.body);         auto*ptit2=t_type_item_type::UberCast(ptta-&gt;params-&gt;first.body.get());         QapAssert(ptit2);         if(ptit2-&gt;param){           QapAssert(ptit2-&gt;type.value==\"TAutoPtr\");           auto*ptta=t_meta_lexer::t_type_templ_angle::UberCast(ptit2-&gt;param-&gt;body.get());           QapAssert(ptta);           QapAssert(ptta-&gt;params);           QapAssert(ptta-&gt;params-&gt;first.body);           auto*ptit3=t_type_item_type::UberCast(ptta-&gt;params-&gt;first.body.get());           if(ptit3-&gt;param)QapDebugMsg(\"unexpected param:\"+lex2str(ptit3-&gt;param)+\"\\nin:\"+cmd.templ_params);           QapAssert(!ptit3-&gt;param);           auto*pl=find_lexer_by_name_but_relative(ptit3-&gt;type.value,lexer);           QapAssert(pl);           out+=lexer2vecofchar(*pl);           if(opt)continue;           return out;         }         auto*pl=find_lexer_by_name_but_relative(ptit2-&gt;type.value,lexer);         QapAssert(pl);         out+=lexer2vecofchar(*pl);         if(opt)continue;         return out;       }       QapAssert(!ptit-&gt;param);       auto*pl=find_lexer_by_name_but_relative(ptit-&gt;type.value,lexer);       QapAssert(pl);       out+=lexer2vecofchar(*pl);       if(opt)continue;       return out;     }     if(fn==\"go_minor\"){       QapAssert(cmd.params.arr.size()==1);       auto&amp;cpa0b=cmd.params.arr[0].body;       auto&amp;f=find_field(lexer,cpa0b);       auto*pvc=t_cppcore::t_varcall_expr::UberCast(f.type.get());       QapAssert(pvc);       auto&amp;v=pvc-&gt;var;       if(v.name.value==\"string\")QapDebugMsg(\"go_diff dont support string type of field\");       struct t_for_autoptr_r2{         bool con=false;         bool ret=false;         bool pass()const{return !con&amp;&amp;!ret;}         string out;       };       auto for_autoptr2=[&amp;](const t_var&amp;var,const string&amp;tpn)-&gt;t_for_autoptr_r2{         if(tpn!=\"TAutoPtr\")return {};         t_var inner_param;         tp2var(var.tp,inner_param);         auto inner_pn=inner_param.name.value;         auto*pl_inner=find_lexer_by_name_but_relative(inner_pn,lexer);         QapAssert(pl_inner);         auto nested_chars=lexer2vecofchar(*pl_inner);         QapAssert(!nested_chars.empty());         if(!opt)return {false,true,nested_chars};         return {true,false,nested_chars};       };       string our;bool template_lexer=false;       if(v.name.value==\"TAutoPtr\"){         auto r=for_autoptr2(v,v.name.value);         our+=r.out;         template_lexer=true;         \/\/if(r.ret)return out;         \/\/if(r.con)continue;       }       if(v.name.value==\"vector\"){         template_lexer=true;         QapAssert(v.tp);         t_var template_param;         tp2var(v.tp,template_param);         auto tpn=template_param.name.value;         QapAssert(tpn!=\"vector\");         auto r=for_autoptr2(template_param,tpn);         our+=r.out;         if(r.pass()){           auto*pl=find_lexer_by_name_but_relative(tpn,lexer);           QapAssert(pl);           our+=lexer2vecofchar(*pl);           \/\/if(!opt)return out;           \/\/continue;         }       }       if(!template_lexer){         auto*pl=find_lexer_by_name_but_relative(v.name.value,lexer);         QapAssert(pl);         our+=lexer2vecofchar(*pl);       }       out+=our;       if(opt)continue;       return out;       \/\/ unreachable code now because of wrong hi-level semantic logic. minus is not acceptable in most complex cases       auto minus=[](const string&amp;our,const string&amp;major){         auto m=CharMask::fromStr(our,true);         auto e=CharMask::fromStr(major,true);         string out;         for(size_t i=0;i&lt;256;i++)if(!e.mask[i]&amp;&amp;m.mask[i])out.push_back(static_cast&lt;char&gt;(i));         return out;       };       string major;       \/\/---       QapAssert(cmd.templ_params.size());       TAutoPtr&lt;t_templ_params&gt; tp;       QapAssert(load_obj(tp,cmd.templ_params));       QapAssert(tp-&gt;body.size());       TAutoPtr&lt;t_type_templ_params&gt; ttp;       QapAssert(load_obj(ttp,tp-&gt;body));       QapAssert(ttp);       QapAssert(ttp-&gt;first.body);       auto*ptit=t_meta_lexer::t_type_item_type::UberCast(ttp-&gt;first.body.get());       QapAssert(ptit);       if(ptit-&gt;type.value==\"vector\"||ptit-&gt;type.value==\"TAutoPtr\"){         QapAssert(ptit-&gt;param);         auto*ptta=t_meta_lexer::t_type_templ_angle::UberCast(ptit-&gt;param-&gt;body.get());         QapAssert(ptta);         QapAssert(ptta-&gt;params);         QapAssert(ptta-&gt;params-&gt;first.body);         auto*ptit2=t_type_item_type::UberCast(ptta-&gt;params-&gt;first.body.get());         QapAssert(ptit2);         if(ptit2-&gt;param){           QapAssert(ptit2-&gt;type.value==\"TAutoPtr\");           auto*ptta=t_meta_lexer::t_type_templ_angle::UberCast(ptit-&gt;param-&gt;body.get());           QapAssert(ptta);           QapAssert(ptta-&gt;params);           QapAssert(ptta-&gt;params-&gt;first.body);           auto*ptit3=t_type_item_type::UberCast(ptta-&gt;params-&gt;first.body.get());           QapAssert(!ptit3-&gt;param);           auto*pl=find_lexer_by_name_but_relative(ptit3-&gt;type.value,lexer);           QapAssert(pl);           major+=lexer2vecofchar(*pl);           out+=minus(our,major);           if(opt)continue;           return out;         }         auto*pl=find_lexer_by_name_but_relative(ptit2-&gt;type.value,lexer);         QapAssert(pl);         major+=lexer2vecofchar(*pl);         out+=minus(our,major);         if(opt)continue;         return out;       }       QapAssert(!ptit-&gt;param);       auto*pl=find_lexer_by_name_but_relative(ptit-&gt;type.value,lexer);       QapAssert(pl);       major+=lexer2vecofchar(*pl);       out+=minus(our,major);       if(opt)continue;       return out;     }     QapDebugMsg(\"unsupported go_* method: \"+fn);     int gg_cmds=1;   }   return out; }<\/code><\/pre>\n<\/div>\n<\/details>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043a\u0440\u0443\u0442\u043e \u0438 \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438<\/h3>\n<ul>\n<li>\n<p><strong>\u0413\u043b\u0443\u0431\u043e\u043a\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0442\u0438\u043f\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439<\/strong> \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0442\u0438\u043f\u044b (<code>TAutoPtr<\/code>, <code>vector<\/code>), \u0447\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0449\u044c \u0438 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430<\/strong> \u2014 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043f\u0430\u0440\u0441\u0438\u043d\u0433, \u0438\u0437\u0431\u0435\u0433\u0430\u044f \u043b\u0438\u0448\u043d\u0438\u0445 \u043f\u043e\u043f\u044b\u0442\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434<\/strong> \u2014 \u043b\u0435\u043a\u0441\u0435\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043b\u0435\u043a\u0441\u0435\u0440\u044b, \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u043c\u0435\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>\u0427\u0451\u0442\u043a\u0430\u044f \u0438 \u0441\u0442\u0440\u043e\u0433\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438<\/strong> \u2014 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e <code>QapAssert<\/code> \u0438 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u044b\u044f\u0432\u043b\u044f\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u0440\u0435\u0437\u044e\u043c\u0435<\/h3>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>lexer2vecofchar<\/code> \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0440\u043e\u0438\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043b\u0435\u043a\u0441\u0435\u0440\u0430, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u0442\u0438\u043f\u044b. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0440\u0430\u043d\u043d\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0437\u0431\u043e\u0440\u0430, \u043f\u043e\u0432\u044b\u0448\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u0440\u0441\u0435\u0440\u0430. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u0442\u0440\u043e\u0433\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044e \u0442\u0438\u043f\u043e\u0432 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0430\u0436\u0435 \u0441 \u0441\u0430\u043c\u044b\u043c\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430\u043c\u0438.<\/p>\n<h3>\u0421\u043e\u0432\u0435\u0442\u044b \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438 \u043f\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044e \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a<\/h3>\n<p>&#171;\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c&#187; \u043a\u0430\u043a \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u043b\u0435\u043a\u0441\u0435\u0440, \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u043a\u0438\u0445-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0440\u0443\u0433\u0438\u0445<br \/> \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u043e\u043b\u0435\u0439 \u0432\u044b\u0448\u0435\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u043b\u0435\u043a\u0441\u0435\u0440\u0430, \u0430 \u043d\u0435 \u0432\u043f\u0435\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445, \u0442.\u043a \u0442\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b\u0448\u0435\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043b\u0435\u043a\u0441\u0435\u0440 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0439. \u042d\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e &#171;\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f&#187;, \u0430 \u0432\u0441\u0435\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432.<br \/> \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0432 \u0434\u0432\u0443\u0445 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u0449\u0438\u0439 \u0434\u043b\u044f \u043d\u0438\u0445 \u0432\u0441\u0435\u0445 \u043b\u0435\u043a\u0441\u0435\u0440\/go_*\u043c\u0435\u0442\u043e\u0434.<\/p>\n<h3>\u0420\u0430\u0437\u0431\u043e\u0440 \u043a\u043e\u0434\u0430 t_class_def_fixer<\/h3>\n<h3>\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p><code> t_class_def_fixer<\/code> \u2014 \u044d\u0442\u043e \u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044c (visitor), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0443 QapDSL, \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0434\u0432\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438:<\/p>\n<ol>\n<li>\n<p><strong>\u0417\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b <\/strong><code><strong>=&gt;<\/strong><\/code><strong> (\u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0443) \u043d\u0430 <\/strong><code><strong>:<\/strong><\/code><strong> (\u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u0435) \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432.<\/strong><br \/> \u042d\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0438 \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u0434\u0435\u043b\u0430\u044f \u0435\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c \u0438 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 C++ \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0434\u0451\u0442 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432, \u0435\u0441\u043b\u0438 \u043e\u043d \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/strong><br \/> \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432 \u043e\u0442 \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u043a\u043e\u0434\u0430, \u0435\u0441\u043b\u0438 \u043e\u043d \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u0438 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432.<\/p>\n<\/li>\n<\/ol>\n<h3>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438 \u043c\u0435\u0442\u043e\u0434\u044b<\/h3>\n<h3>\u041d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u044b<\/h3>\n<pre><code class=\"cpp\">struct t_class_def_fixer:   t_templ_sys_v04,   t_meta_lexer::i_target_item_visitor,   t_meta_lexer::t_target_struct::i_struct_impl::i_visitor {   #define ADD(F)typedef t_meta_lexer::F F;     ADD(t_target_semicolon)     ADD(t_target_sep)     ADD(t_target_struct)     ADD(t_target_using)     ADD(t_target_typedef)     ADD(i_target_item)   #undef ADD   ... }; <\/code><\/pre>\n<ul>\n<li>\n<p>\u041a\u043b\u0430\u0441\u0441 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0434\u0435\u0440\u0435\u0432\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0440\u043e\u0441 <code>ADD<\/code> \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043c\u0451\u043d <code>t_meta_lexer<\/code>, \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u0431\u0445\u043e\u0434\u0430<\/h3>\n<pre><code class=\"cpp\">template&lt;class TYPE&gt; void Do(TYPE*p){if(p)Do(*p);} template&lt;class TYPE&gt; void Do(TYPE&amp;r){r.Use(*this);} template&lt;class TYPE&gt; void Do(vector&lt;TYPE&gt;&amp;arr){for(auto&amp;ex:arr)Do(&amp;ex);} template&lt;class TYPE&gt; void Do(vector&lt;TAutoPtr&lt;TYPE&gt;&gt;&amp;arr){for(auto&amp;ex:arr)if(ex)Do(*ex.get());} template&lt;class TYPE&gt; void Do(TAutoPtr&lt;TYPE&gt;&amp;r){if(r)Do(*r.get());} <\/code><\/pre>\n<ul>\n<li>\n<p>\u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b <code>Do<\/code> \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0443\u0437\u043b\u043e\u0432 \u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u0443\u0437\u043b\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u042d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u0451\u043c \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0431\u0435\u0437 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0442\u0435\u043b\u0430 \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 (t_body_impl)<\/h3>\n<pre><code class=\"cpp\">void Do(t_body_impl&amp;r)override{   if(cppcode_killer){     if(lex2str(r.c).find(\"inline static const string value=\\\"\")==string::npos){       r.c=nullptr; \/\/ \u0443\u0431\u0438\u0432\u0430\u0435\u043c C++ \u043a\u043e\u0434 \u0438\u0434\u0443\u0449\u0438\u0439 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f lexer`\u0430     }   }   Do(r.nested); } <\/code><\/pre>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0451\u043d \u0444\u043b\u0430\u0433 <code>cppcode_killer<\/code>, \u0438 \u0432 \u043a\u043e\u0434\u0435 <code>r.c<\/code> \u043d\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 <code>\"inline static const string value=\\\"\"<\/code>, \u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 <code>r.c<\/code> \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u00ab\u043b\u0438\u0448\u043d\u0438\u0439\u00bb C++ \u043a\u043e\u0434, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0442\u0435\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043b\u0435\u043a\u0441\u0435\u0440\u044b<code>r.nested<\/code>.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0417\u0430\u043c\u0435\u043d\u0430 \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438 \u043d\u0430 \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u0435<\/h3>\n<pre><code class=\"cpp\">void Do(t_target_struct::t_parent&amp;r){   if(r.arrow_or_colon.size()) r.arrow_or_colon=\":\"; } <\/code><\/pre>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f (<code>t_parent<\/code>) \u0435\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b <code>arrow_or_colon<\/code> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <code>=&gt;<\/code> \u0438\u043b\u0438 <code>:<\/code>), \u043e\u043d \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u0435 <code>:<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043d\u0430 \u0421++ \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u0442\u0443 \u0434\u043e\u0441\u0430\u0434\u043d\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 \u0438\u0437 QapDSLv1<\/p>\n<\/li>\n<\/ul>\n<h3>\u041e\u0431\u0445\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u0445 \u0443\u0437\u043b\u043e\u0432<\/h3>\n<pre><code class=\"cpp\">void Do(t_target_struct&amp;r)override{   Do(r.parent);   Do(r.body); } void Do(t_target_semicolon&amp;r)override{} void Do(t_target_sep&amp;r)override{} void Do(t_target_using&amp;r)override{} void Do(t_target_typedef&amp;r)override{} <\/code><\/pre>\n<ul>\n<li>\n<p>\u0414\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0445\u043e\u0434 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0438 \u0442\u0435\u043b\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u2014 \u043f\u0443\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430<\/h3>\n<pre><code class=\"cpp\">string main(const string&amp;data){   t_target tar;   auto fs=load_obj_full(tar,data);   if(!fs.ok){cerr&lt;&lt;fs.msg&lt;&lt;endl;return \"fail\";}   if(tar.arr.empty()){return \"!target\\n\\n\"+fs.msg;}   for(auto&amp;ex:tar.arr){     auto*p=ex.get();     p-&gt;Use(*this);   }   string out;   save_obj(tar,out);   return out; } <\/code><\/pre>\n<ul>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 QapDSL-\u043a\u043e\u0434 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 <code>tar<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0435 \u0443\u0434\u0430\u043b\u0430\u0441\u044c \u0438\u043b\u0438 \u043f\u0443\u0441\u0442\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043a \u043d\u0438\u043c \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044f (<code>Use(*this)<\/code>), \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0418\u0442\u043e\u0433<\/h3>\n<p><code> t_class_def_fixer<\/code> \u2014 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0439 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 QapDSL-\u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u0423\u043d\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043c\u0435\u043d\u0443 \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u0435\u043a \u043d\u0430 \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0447\u0438\u0441\u0442\u043a\u0443 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432 \u043e\u0442 \u043b\u0438\u0448\u043d\u0435\u0433\u043e C++ \u043a\u043e\u0434\u0430, \u0447\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0448\u0443\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0413\u0438\u0431\u043a\u0438\u0439 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u0432\u0435\u0441\u044c \u043a\u043e\u0434 t_class_def_fixer<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">struct t_class_def_fixer:   t_templ_sys_v04,   t_meta_lexer::i_target_item_visitor,   t_meta_lexer::t_target_struct::i_struct_impl::i_visitor {   #define ADD(F)typedef t_meta_lexer::F F;     ADD(t_target_semicolon)\\     ADD(t_target_sep)\\     ADD(t_target_struct)\\     ADD(t_target_using)\\     ADD(t_target_typedef)\\     ADD(i_target_item)\\       \/\/   #undef ADD   template&lt;class TYPE&gt;   void Do(TYPE*p){if(p)Do(*p);}   template&lt;class TYPE&gt;   void Do(TYPE&amp;r){r.Use(*this);}   template&lt;class TYPE&gt;   void Do(vector&lt;TYPE&gt;&amp;arr){for(auto&amp;ex:arr)Do(&amp;ex);}   template&lt;class TYPE&gt;   void Do(vector&lt;TAutoPtr&lt;TYPE&gt;&gt;&amp;arr){for(auto&amp;ex:arr)if(ex)Do(*ex.get());}   template&lt;class TYPE&gt;   void Do(TAutoPtr&lt;TYPE&gt;&amp;r){if(r)Do(*r.get());}   template&lt;class TYPE&gt;   bool is_empty(TYPE&amp;r){     string out;     save_obj(r,out);     if(drop_empty_lines(out).empty())return true;     return false;   }   void Do(t_body_semicolon&amp;r)override{}   void Do(t_body_impl&amp;r)override{     if(cppcode_killer){       if(lex2str(r.c).find(\"inline static const string value=\\\"\")==string::npos){         r.c=nullptr;       }     }     Do(r.nested);   }   void Do(t_target_semicolon&amp;r)override{}   void Do(t_target_sep&amp;r)override{}   void Do(t_target_struct::t_parent&amp;r){if(r.arrow_or_colon.size())r.arrow_or_colon=\":\";}   void Do(t_target_struct&amp;r)override{Do(r.parent);Do(r.body);}   void Do(t_target_using&amp;r)override{}   void Do(t_target_typedef&amp;r)override{}   bool cppcode_killer=true;   string main(const string&amp;data){     t_target tar;     auto fs=load_obj_full(\/*Env,*\/tar,data);     if(!fs.ok){cerr&lt;&lt;fs.msg&lt;&lt;endl;return \"fail\";}     if(tar.arr.empty()){return \"!target\\n\\n\"+fs.msg;}     for(auto&amp;ex:tar.arr){       auto*p=ex.get();       p-&gt;Use(*this);     }     string out;     save_obj(tar,out);     return out;   } };<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b t_qapdls_v1_to_v2, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 \u043a\u043e\u0434\u0430 QapDSL \u0432 QapDSLv2.<\/h2>\n<h3>\u041e\u0431\u0449\u0435\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/h3>\n<ul>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u0441\u0442\u0430\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432 \u043d\u043e\u0432\u0443\u044e, \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0438 \u0443\u0434\u043e\u0431\u043d\u0443\u044e.<\/p>\n<\/li>\n<li>\n<p>&#8230;<\/p>\n<\/li>\n<li>\n<p><code>Profit!<\/code><\/p>\n<\/li>\n<\/ul>\n<h3>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u0438 \u043c\u0435\u0442\u043e\u0434\u044b<\/h3>\n<h3>\u041d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u044b<\/h3>\n<pre><code class=\"cpp\">struct t_qapdls_v1_to_v2:   t_templ_sys_v04,   t_meta_lexer::i_target_item_visitor,   t_meta_lexer::t_target_struct::i_struct_impl::i_visitor,   t_meta_lexer::i_struct_cmd_xxxx::i_visitor {   #define ADD(F)typedef t_meta_lexer::F F;     ADD(t_target_semicolon)     ADD(t_target_sep)     ADD(t_target_struct)     ADD(t_target_using)     ADD(t_target_typedef)     ADD(i_target_item)     ADD(t_struct_cmd_mode)     ADD(t_struct_cmd_anno)   #undef ADD   ... }; <\/code><\/pre>\n<p>&#8230;<\/p>\n<h3>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 \u043b\u0435\u043a\u0441\u0435\u0440\u0430 (t_body_impl)<\/h3>\n<pre><code class=\"cpp\">void Do(t_body_impl&amp;r)override{   Do(r.nested);   if(!r.cmds)return;   auto&amp;arr=r.cmds-&gt;arr;   vector&lt;string&gt; fields;   for(auto&amp;ex:arr){     opt=false;     if(ex.body.mode)Do(ex.body.mode.get());     auto&amp;f=ex.body.func.value;     QapAssert(f.size()&gt;3&amp;&amp;f.substr(0,3)==\"go_\");     auto res=f.substr(3);     auto&amp;params=ex.body.params.arr;     QapAssert(params.size());     string pad;     string pad2;     for(int i=0;i&lt;lexers.size();i++)pad+=\"  \";     for(int i=1;i&lt;lexers.size();i++)pad2+=\"  \";          if(res==\"const\"){       fields.push_back(\"\\n\"+pad+params[0].body+\"\\n\"+pad2);       continue;     }          auto&amp;src=find_field(r.arr,params[0].body);          if(res==\"auto\"){       src.qst=nullptr;       if(opt)load_obj(src.qst,\"?\");       fields.push_back(\"\\n\"+pad+lex2str(src)+\"\\n\"+pad2);       continue;     }          vector&lt;string&gt; sparams;     for(int i=1;i&lt;params.size();i++){       sparams.push_back(params[i].body);     }          fields.push_back(\"\\n\"+pad+lex2str(src.type)+\"\"+src.name.value+\"=\"+res+ex.body.templ_params+\"(\"+join(sparams,\",\")+\")\"+string(opt?\"?\":\"\")+\";\\n\"+pad2);   }   r.arr.clear();   auto mem=join(fields,\"\");   t_load_dev dev(mem);   bool ok=dev.go_auto(r.arr);   QapAssert(ok);   r.cmds=nullptr; } <\/code><\/pre>\n<pre><code><\/code><\/pre>\n<ul>\n<li>\n<p>\u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>go_*<\/code> \u0432 \u0442\u0435\u043b\u0435 \u043b\u0435\u043a\u0441\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<ul>\n<li>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0440\u0435\u0436\u0438\u043c <code>opt<\/code> (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c).<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0438\u043c\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0435\u0437 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 <code>go_<\/code> (<code>field<\/code>).<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043f\u043e\u043b\u0435 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 QapDSLv2.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0443, \u0437\u0430\u0442\u0435\u043c \u043f\u0430\u0440\u0441\u0438\u0442 \u0435\u0451 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>r.arr<\/code>. <strong>\/\/ \u0432\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u044d\u0442\u0443 \u043d\u0430\u0433\u043b\u0443\u044e \u0432\u043e\u043b\u044c\u043d\u043e\u0441\u0442\u044c! \u0416\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0434\u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b!<\/strong><\/p>\n<\/li>\n<li>\n<p>\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>r.cmds<\/code>.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b<\/h3>\n<pre><code class=\"cpp\">bool opt=false;  void Do(t_struct_cmd_mode&amp;r){opt=r.body=='O';} void Do(t_struct_cmd_anno&amp;r){opt=r.mode[0]=='o';if(r.mode.size()&gt;1)opt=r.mode[1]=='o';}  t_struct_field&amp; find_field(const vector&lt;TAutoPtr&lt;i_struct_field&gt;&gt;&amp;arr,const std::string&amp;name) const {   for(auto&amp;ex:arr){     auto*pf=t_struct_field::UberCast(ex.get());     QapAssert(pf);     if(pf-&gt;name.value==name) return *pf;   }   QapDebugMsg(\"can't find field '\"+name+\"' inside lexer '\"+lexers.back()+\"'\");   static t_struct_field tmp;   return tmp; } <\/code><\/pre>\n<ul>\n<li>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>opt<\/code> \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434\u044b <code>Do<\/code> \u0434\u043b\u044f <code>t_struct_cmd_mode<\/code> \u0438 <code>t_struct_cmd_anno<\/code> \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442 <code>opt<\/code> \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>find_field<\/code> \u0438\u0449\u0435\u0442 \u043f\u043e\u043b\u0435 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043f\u043e\u043b\u0435\u0439, \u0441 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041e\u0431\u0445\u043e\u0434 \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432 \u0441 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438.<\/h3>\n<pre><code class=\"cpp\">vector&lt;string&gt; lexers; void Do(t_target_struct&amp;r){   lexers.push_back(r.name.value);   Do(r.parent);   Do(r.body);   lexers.pop_back(); } <\/code><\/pre>\n<ul>\n<li>\n<p>\u0412\u0435\u0434\u0451\u0442 \u0441\u0442\u0435\u043a \u0438\u043c\u0451\u043d \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u043f\u043e\u043b\u0435\u0439.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430<\/h3>\n<pre><code class=\"cpp\">string main(const string&amp;data){   t_target tar;   auto fs=load_obj_full(tar,data);   if(!fs.ok){cerr&lt;&lt;fs.msg&lt;&lt;endl;return \"fail\";}   if(tar.arr.empty()){return \"!target\\n\\n\"+fs.msg;}   for(auto&amp;ex:tar.arr){     auto*p=ex.get();     p-&gt;Use(*this);   }   string out;   save_obj(tar,out);   return out; } <\/code><\/pre>\n<h3>\u0418\u0442\u043e\u0433<\/h3>\n<p><code> t_qapdls_v1_to_v2<\/code> \u2014 \u044d\u0442\u043e \u043c\u043e\u0449\u043d\u044b\u0439 \u0438 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439:<\/p>\n<ul>\n<li>\n<p>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0441\u0442\u0430\u0440\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 QapDSLv1 \u0432 \u043d\u043e\u0432\u0443\u044e, \u0431\u043e\u043b\u0435\u0435 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u0443\u044e \u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e QapDSLv2.<\/p>\n<\/li>\n<li>\n<p>\u0423\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432, \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u043f\u043e\u043b\u0435\u0439, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u043c\u0438\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0430\u0434\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e \u0434\u043b\u044f \u0435\u0433\u043e \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438! \u042d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u043b\u0443\u0447\u0448\u0438\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u043a!<\/strong><\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0446\u0435\u043b\u0438\u043a\u043e\u043c<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">struct t_qapdls_v1_to_v2:   t_templ_sys_v04,   t_meta_lexer::i_target_item_visitor,   t_meta_lexer::t_target_struct::i_struct_impl::i_visitor,   t_meta_lexer::i_struct_cmd_xxxx::i_visitor {   #define ADD(F)typedef t_meta_lexer::F F;     ADD(t_target_semicolon)\\     ADD(t_target_sep)\\     ADD(t_target_struct)\\     ADD(t_target_using)\\     ADD(t_target_typedef)\\     ADD(i_target_item)\\     ADD(t_struct_cmd_mode)\\     ADD(t_struct_cmd_anno)\\       \/\/   #undef ADD   template&lt;class TYPE&gt;   void Do(TYPE*p){if(p)Do(*p);}   template&lt;class TYPE&gt;   void Do(TYPE&amp;r){r.Use(*this);}   template&lt;class TYPE&gt;   void Do(vector&lt;TYPE&gt;&amp;arr){for(auto&amp;ex:arr)Do(&amp;ex);}   template&lt;class TYPE&gt;   void Do(vector&lt;TAutoPtr&lt;TYPE&gt;&gt;&amp;arr){for(auto&amp;ex:arr)if(ex)Do(*ex.get());}   template&lt;class TYPE&gt;   void Do(TAutoPtr&lt;TYPE&gt;&amp;r){if(r)Do(*r.get());}   \/\/template&lt;class TYPE&gt;   void Do(t_body_semicolon&amp;r)override{}   bool opt=false;   void Do(t_struct_cmd_mode&amp;r){opt=r.body=='O';}   void Do(t_struct_cmd_anno&amp;r){opt=r.mode[0]=='o';if(r.mode.size()&gt;1)opt=r.mode[1]=='o';}   t_struct_field&amp;find_field(const vector&lt;TAutoPtr&lt;i_struct_field&gt;&gt;&amp;arr,const std::string&amp;name)const{     for(auto&amp;ex:arr){       auto*pf=t_struct_field::UberCast(ex.get());       QapAssert(pf);       if(pf-&gt;name.value==name)return *pf;     }     QapDebugMsg(\"can't find field '\"+name+\"' inside lexer '\"+lexers.back()+\"'\");     static t_struct_field tmp;     return tmp;   }   void Do(t_body_impl&amp;r)override{     Do(r.nested);     if(!r.cmds)return;     auto&amp;arr=r.cmds-&gt;arr;     vector&lt;string&gt; fields;     for(auto&amp;ex:arr){       opt=false;       if(ex.body.mode)Do(ex.body.mode.get());       auto&amp;f=ex.body.func.value;       QapAssert(f.size()&gt;3&amp;&amp;f.substr(0,3)==\"go_\");       auto res=f.substr(3);       auto&amp;params=ex.body.params.arr;       QapAssert(params.size());       string pad;       string pad2;       for(int i=0;i&lt;lexers.size();i++)pad+=\"  \";       for(int i=1;i&lt;lexers.size();i++)pad2+=\"  \";       if(res==\"const\"){         fields.push_back(\"\\n\"+pad+params[0].body+\"\\n\"+pad2);         continue;       }       auto&amp;src=find_field(r.arr,params[0].body);       if(res==\"auto\"){         src.qst=nullptr;         if(opt)load_obj(src.qst,\"?\");         fields.push_back(\"\\n\"+pad+lex2str(src)+\"\\n\"+pad2);         continue;       }       vector&lt;string&gt; sparams;       for(int i=1;i&lt;params.size();i++){         sparams.push_back(params[i].body);       }       fields.push_back(\"\\n\"+pad+lex2str(src.type)+\"\"+src.name.value+\"=\"+res+ex.body.templ_params+\"(\"+join(sparams,\",\")+\")\"+string(opt?\"?\":\"\")+\";\\n\"+pad2);     }     r.arr.clear();     auto mem=join(fields,\"\");     t_load_dev dev(mem);     bool ok=dev.go_auto(r.arr);     QapAssert(ok);     r.cmds=nullptr;   }   void Do(t_target_semicolon&amp;r)override{}   void Do(t_target_sep&amp;r)override{}   void Do(t_target_struct::t_parent&amp;r){if(r.arrow_or_colon.size())r.arrow_or_colon=\":\";}   vector&lt;string&gt; lexers;   void Do(t_target_struct&amp;r)override{lexers.push_back(r.name.value);Do(r.parent);Do(r.body);lexers.pop_back();}   void Do(t_target_using&amp;r)override{}   void Do(t_target_typedef&amp;r)override{}   string main(const string&amp;data){     t_target tar;     auto fs=load_obj_full(\/*Env,*\/tar,data);     if(!fs.ok){cerr&lt;&lt;fs.msg&lt;&lt;endl;return \"fail\";}     if(tar.arr.empty()){return \"!target\\n\\n\"+fs.msg;}     for(auto&amp;ex:tar.arr){       auto*p=ex.get();       p-&gt;Use(*this);     }     string out;     save_obj(tar,out);     return out;   } };<\/code><\/pre>\n<\/div>\n<\/details>\n<h4>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b<\/h4>\n<ul>\n<li>\n<p>\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 <a href=\"https:\/\/github.com\/adler3d\/QapGen\" rel=\"noopener noreferrer nofollow\">QapGen<\/a><\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a <a href=\"https:\/\/github.com\/adler3d\/QapGen\/blob\/master\/src\/QapGenV2025\/Release\/t_xml.qapdsv2.hpp\" rel=\"noopener noreferrer nofollow\">XML<\/a> \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0437 \u043d\u0435\u0433\u043e <a href=\"https:\/\/github.com\/adler3d\/QapGen\/blob\/master\/src\/QapGenV2025\/Release\/t_xml.hpp\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u0434\u0430<\/a>.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/925420\/\"> https:\/\/habr.com\/ru\/articles\/925420\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><strong>QapDSLv2 <\/strong>\u2014 \u044d\u0442\u043e \u044f\u0437\u044b\u043a \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 C++ \u043a\u043e\u0434. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0438 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438\/\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0440\u0430\u0437\u0431\u043e\u0440\u0430, \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p><strong>QapGen <\/strong>\u2014 \u044d\u0442\u043e <strong>\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0434\u0435\u0440\u0435\u0432\u0430_\u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432<\/strong>\/\u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 <strong>QapDSLv2. <\/strong>\u0421\u0430\u043c\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430 <strong>QapDSLv2 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 QapDSLv2 \u043d\u0430 100%. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 QapGen \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0441\u0430\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0447\u0430\u0441\u0442\u044c \u0441\u0432\u043e\u0435\u0433\u043e \u043a\u043e\u0434\u0430(\u0432\u0435\u0441\u044c \u043f\u0430\u0440\u0441\u0435\u0440 QapDSLv2).<\/strong><\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0438\u0448\u043a\u0438 <strong>QapDSLv2 + QapGen<\/strong> \u2014 \u044d\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u0442\u0430\u043f\u0430 \u0442\u043e\u043a\u0435\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 <strong>\u0434\u0435\u0440\u0435\u0432\u043e \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043d\u0430 \u043b\u0435\u043a\u0441\u0435\u043c\u044b \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0438\u0445 \u0432 \u0441\u0442\u0440\u043e\u0433\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u044b\u0445 \u0421++ \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044f \u044d\u0442\u0430\u043f \u0442\u043e\u043a\u0435\u043d\u0438\u0437\u0430\u0446\u0438\u0438.<\/strong><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u043d\u043e\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043b\u0435\u043a\u0441\u0435\u043c(\u0434\u0430\u0436\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043f\u0440\u043e\u0431\u0435\u043b\u044b\/\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438) \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u0434\u0435\u0440\u0435\u0432\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c<\/strong> \u043a\u0430\u043a \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u0442\u0430\u043a \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 <strong>\u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043a\u043e\u0434\/\u0442\u0435\u043a\u0441\u0442 \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u0439\/\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432<\/strong>.<\/p>\n<\/li>\n<li>\n<p><strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0445 \u043b\u0435\u043a\u0441\u0435\u0440\u043e\u0432<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f <strong>\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u0435\u0439<\/strong>(\u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f).<\/p>\n<\/li>\n<\/ul>\n<p> \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0430\u043c\u043e\u0439 \u0441\u043e\u0447\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438(\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0441\u0430\u043c\u043e\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043a\u043e\u0434): <\/p>\n<pre><code class=\"elixir\">t_target_struct:i_target_item{   t_keyword{     string kw=any_str_from_vec(split(\"struct,class\",\",\"));     \" \"? \/\/ optional separator   }   t_body_semicolon:i_struct_impl{\";\"}   t_body_impl:i_struct_impl{     \"{\" \/\/ \u0436\u0440\u0451\u043c \u0441\u043a\u043e\u0431\u043e\u0447\u043a\u0443     vector&lt;TAutoPtr&lt;i_target_item&gt;&gt; nested?; \/\/ \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e!     \" \"?     vector&lt;TAutoPtr&lt;i_struct_field&gt;&gt; arr?; \/\/ \u043f\u0430\u0440\u0441\u0438\u043c \u043f\u043e\u043b\u044f     \" \"?     TAutoPtr&lt;t_struct_cmds&gt; cmds?; \/\/ \u0423\u0413 \u0438\u0437 QapDSLv1     \" \"?     TAutoPtr&lt;t_cpp_code&gt; c?; \/\/ \u043d\u0430\u0433\u043b\u043e \u043f\u043e\u0436\u0438\u0440\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0421++ \u043a\u043e\u0434     \" \"?     \"}\"   }   t_parent{     string arrow_or_colon=any_str_from_vec(split(\"=&gt;,:\",\",\"));     \" \"?     t_name parent;   }   \/\/\u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043f\u0430\u0440\u0441\u0435\u0440:   TAutoPtr&lt;t_keyword&gt; kw?; \/\/ \u043f\u0430\u0440\u0441\u0438\u043c struct\/class   t_name name; \/\/\u043f\u0430\u0440\u0441\u0438\u043c \u0438\u043c\u044f   \" \"? \/\/ \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c   TAutoPtr&lt;t_parent&gt; parent?; \/\/ \u043f\u0430\u0440\u0441\u0438\u043c \u0438\u043c\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u044d\u0439\u0441\u0430 \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c   \" \"?   TAutoPtr&lt;i_struct_impl&gt; body; \/\/ \u043f\u0430\u0440\u0441\u0438\u043c \u0442\u0435\u043b\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438\u043b\u0438 \u0442\u043e\u0447\u043a\u0443 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439. }<\/code><\/pre>\n<h2>\u041f\u0440\u043e \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e<\/h2>\n<p>\u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e QapDSL(\u0438 \u043e\u0434\u043d\u0430 \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u043f\u0440\u043e QapGen), \u043d\u043e \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u0440\u043e QapDSLv1 \u044f \u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e, \u0442.\u043a \u043e\u043d\u0430 \u0431\u0435\u0437\u043d\u0430\u0434\u0451\u0436\u043d\u0430 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0430, \u043d\u043e \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u044f\u0437\u044b\u043a\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u043d\u0435 \u0437\u043d\u0430\u044e \u043a\u0430\u043a \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0432 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h2>\u041f\u0440\u043e \u0441\u043e\u0441\u0435\u0434\u043d\u044e\u044e \u0441\u0442\u0430\u0442\u044c\u044e<\/h2>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u0432\u044b\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0435 \u0441\u0442\u0430\u0442\u044c \u0432 \u043e\u0434\u043d\u043e \u0432\u0440\u0435\u043c\u044f. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430, \u0431\u0443\u0434\u0435\u0442 \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441 \u0441\u0430\u043c\u043e\u0439 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0436\u0435\u0441\u0442\u044c\u044e \u043f\u0440\u043e QapGen, \u0430 \u0432 \u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 JSON, \u043f\u0440\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/922128\/\" rel=\"noopener noreferrer nofollow\">\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 QapDSLv2 \u0438 \u0433\u0440\u043e\u043c\u043a\u0430\u044f \u0445\u0432\u0430\u043b\u0430 \u0435\u0433\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430<\/a>.<\/p>\n<h3>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0446\u0435\u043b\u0438 \u0438 \u043c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f QapDSLv2<\/h3>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043a \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043e\u0442\u043c\u0435\u0447\u0430\u043b\u0430\u0441\u044c \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0438\u0437\u043b\u0438\u0448\u043d\u0438\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438, \u0447\u0442\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u043b\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043a\u043e\u0434\u0430. \u0412\u0442\u043e\u0440\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f QapDSL \u0431\u044b\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u0441 \u0446\u0435\u043b\u044c\u044e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0438 \u0443\u043a\u043e\u0440\u043e\u0442\u0438\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 C++.<\/p>\n<h3>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f QapDSLv2<\/h3>\n<p><strong>\u041d\u043e\u0432\u044b\u0439 \u0443\u043a\u043e\u0440\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441<\/strong><\/p>\n<p>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0441\u0442\u0430\u043b \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u043c \u0438 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043c\u0435\u0441\u0442\u043e<\/p>\n<pre><code class=\"erlang\">t_num_with_sep{t_num num;t_sep sep;{go_auto(num);go_auto(sep);}}<\/code><\/pre>\n<p>\u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c<\/p>\n<pre><code class=\"css\">t_num_with_sep{t_num num;\" \"} \/\/ \u043a\u043e\u0434 \u0441 go_auto \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \/\/ \" \" - \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043d\u0430 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0439 t_sep \/\/ \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430 \u043a\u043e\u0433\u0434\u0430 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e using \" \" as t_sep;<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043a\u043e\u0434\u0430 QapGen<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"elixir\">\/\/ legacy lexer \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043a\u043e\u043c\u0430\u043d\u0434 \u0438\u0437 QapDSLv1 t_struct_cmd{ \/\/ \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u0438\u0434\u044b 'O+=go_minor&lt;major&gt;(minor);'   TAutoPtr&lt;i_struct_cmd_xxxx&gt; mode?; \/\/ \u043f\u0430\u0440\u0441\u0438\u0442 'O+='   t_name func; \/\/ \u043f\u0430\u0440\u0441\u0438\u0442 \u0438\u043c\u044f go_* \u043c\u0435\u0442\u043e\u0434\u0430   \" \"? \/\/ \" \" - \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043d\u0430 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0439 t_sep, \u0432\u043e\u043f\u0440\u043e\u0441\u0438\u043a - \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c.   string templ_params=str&lt;TAutoPtr&lt;t_templ_params&gt;&gt;()?; \/\/ \u043f\u0430\u0440\u0441\u0438\u0442 \u0448\u0430\u0431\u043b\u043e\u043d\u044b   \"(\" \/\/ \u043f\u043e\u0436\u0438\u0440\u0430\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0443\u044e\u0441\u044f \u0441\u043a\u043e\u0431\u043e\u0447\u043a\u0443   t_cmd_params params; \/\/\u043f\u0430\u0440\u0441\u0438\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0437 \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430   \")\" \/\/ \u043f\u043e\u0436\u0438\u0440\u0430\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0443\u044e\u0441\u044f \u0441\u043a\u043e\u0431\u043e\u0447\u043a\u0443   \" \"?   TAutoPtr&lt;i_struct_cmd_so&gt; cmdso?; \/\/ \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430 \u0444\u0438\u0433\u043d\u044f, \u043d\u0430\u0434\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c.   \" \"?   \";\" \/\/ \u043f\u043e\u0436\u0438\u0440\u0430\u0435\u0442 \u0442\u043e\u0447\u043a\u0443 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439. }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0435\u0439<\/strong><\/p>\n<p>\u041d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0444\u0443 \u043e \u043f\u043e\u043b\u044f\u0445 \u0438\u0437 QapDSLv2 \u0432 \u0421++ \u043a\u043e\u0434 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u0434\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u044f\u0449\u0438\u043c AST. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0442\u044d\u0433-\u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0445\u0430\u0442\u044c js-\u043a\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u043e\u043b\u044f\/\u043d\u043e\u0434\u044b. \u0418\u043b\u0438 \u044d\u0442\u043e \u043f\u043b\u043e\u0445\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440?<\/p>\n<pre><code class=\"elixir\">t_test20250618_atrr{   t_foo{{}[::]} \/\/ \u0442\u0435\u0441\u0442 \u0431\u0430\u044f\u043d\u0430.   t_foo foo; [skip] \/\/\u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0437\u0430\u0447\u0435\u043c-\u0442\u043e \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c   t_sep sep; [optimize,\"sep\",(\"sep\"),sep[x]] \/\/ \u0432\u043e\u0442 \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c }<\/code><\/pre>\n<p><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c C++ \u043a\u043e\u0434 \u0432 QapDSL \u0431\u0435\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f \u2014 \u00ab\u0431\u0430\u044f\u043d\u00bb [::]<\/strong><\/p>\n<p>\u042d\u0442\u043e \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 C++ \u043a\u043e\u0434 \u0432 QapDSLv2 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0438(<strong>[::]<\/strong>), \u0447\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043a\u043e\u0434\u043e\u043c \u0438 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c.<\/p>\n<h3>\u041a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f QapGen <\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c <strong>QapGen(\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432) <\/strong>\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f <strong>g++\/clang\/cl.exe<\/strong>, \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0438\u043c \u043a\u043e\u0434 \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434 <strong>linux\/windows<\/strong>, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>111<\/figcaption><\/div>\n<\/figure>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0434\u043b\u044f \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u043d\u0430 QapDSLv2<\/h3>\n<pre><code class=\"php\">t_simple_calc{   \/\/\u043e\u0431\u044c\u044f\u0432\u043b\u044f\u0435\u043c\u044b \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432 t_simple_calc \u043b\u0435\u043a\u0441\u0435\u0440\u044b   t_term{     TAutoPtr&lt;i_term&gt; value; \/\/ \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0439 \u043d\u043e\u0434\u044b\/\u043b\u0435\u043a\u0441\u0435\u0440\u0430.   }   t_number:i_term{     t_ext{       \".\" \/\/ \u0436\u0440\u0451\u043c \u0442\u043e\u0447\u0435\u0447\u043a\u0443.       string v=any(gen_dips(\"09\")); \/\/ \u0436\u0440\u0451\u043c \u0432\u0441\u0451 \u043e\u0442 0 \u0434\u043e 9 \u043f\u043e\u043a\u0430 \u043e\u043d\u043e \u0435\u0441\u0442\u044c.     }     t_impl{       string bef=any(gen_dips(\"09\"));       TAutoPtr&lt;t_ext&gt; ext?; \/\/ \u043f\u0430\u0440\u0441\u0438\u043c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 t_ext     }     string value=str&lt;t_impl&gt;(); \/\/ \u043f\u0430\u0440\u0441\u0438\u043c t_impl \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u0441\u0442\u0440\u043e\u043a\u0443.   }   t_divmul{     t_elem{       string oper=any_str_from_vec(split(\"\/,*\",\",\")); \/\/ \u0441\u0436\u0438\u0440\u0430\u0435\u043c \/ \u0438\u043b\u0438 *       t_term expr; \/\/ \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0441\u0442\u044c \u0441\u043a\u043e\u0431\u043a\u0438 \u0438 \u0447\u0438\u0441\u043b\u0430     }     t_term first;     vector&lt;t_elem&gt; arr?; \/\/ \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 t_elem   }   t_addsub{     t_elem{       string oper=any_str_from_vec(split(\"+,-\",\",\")); \/\/ \u0441\u0436\u0438\u0440\u0430\u0435\u043c + \u0438\u043b\u0438 -       t_divmul expr;     }     t_divmul first; \/\/ \u043f\u0430\u0440\u0441\u0438\u043c t_divmul, \u0442.\u043a \u0443 \u043d\u0435\u0433\u043e \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043e\u0440\u0435\u0442\u0435\u0442     vector&lt;t_elem&gt; arr?; \/\/ \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435   }   t_scope:i_term{     \"(\" \/\/ \u0435\u0434\u0438\u043c \u0441\u043a\u043e\u0431\u043a\u0443     t_addsub value; \/\/ \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 + \u0438\u043b\u0438 -,\u0442.\u043a \u0443 \u043d\u0438\u0445 \u043d\u0438\u0437\u043a\u0438\u0439 \u043f\u0440\u0438\u043e\u0440\u0442\u0435\u0442     \")\" \/\/ \u0435\u0449\u0451 \u0441\u043a\u043e\u0431\u043e\u0447\u043a\u0443   }   \/\/ \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430:   t_addsub value; \/\/ \u043f\u0430\u0440\u0441\u0438\u043c t_addsub }<\/code><\/pre>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 QapDSLv2<\/h3>\n<details class=\"spoiler\">\n<summary>\u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u043e\u0440, \u0430 \u043f\u043e\u0442\u043e\u043c \u044d\u0442\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">struct t_simple_calc_evalutor:t_simple_calc{   typedef t_simple_calc t_ast;   struct t_go:i_term_visitor{     void Do(t_number*ptr){Do(*ptr);}     void Do(t_scope*ptr){Do(*ptr);}     template&lt;class TYPE&gt;void Do(vector&lt;TYPE&gt;&amp;arr){for(auto&amp;ex:arr)Do(ex);}     void Do(t_term&amp;ref){       auto*ptr=ref.value.get();       ptr-&gt;Use(*this);     }     void Do(t_number&amp;ref){       rv=t_rv{\"imm\",ref.value};       v=std::stod(ref.value);     }     void Do(t_scope&amp;ref){       Do(ref.value);     }     void Do(t_divmul&amp;ref){       Do(ref.first);       auto cur_rv=rv;       auto cur=v;       for(auto&amp;ex:ref.arr){         Do(ex.expr);         if(\"\/\"==ex.oper)cur\/=v;         if(\"*\"==ex.oper)cur*=v;         if(\"\/\"==ex.oper)cur_rv=div(cur_rv,rv);         if(\"*\"==ex.oper)cur_rv=mul(cur_rv,rv);       }       v=cur;       rv=cur_rv;     }     void Do(t_addsub&amp;ref){       Do(ref.first);       auto cur_rv=rv;       auto cur=v;       for(auto&amp;ex:ref.arr){         Do(ex.expr);         if(\"+\"==ex.oper)cur+=v;         if(\"-\"==ex.oper)cur-=v;         if(\"+\"==ex.oper)cur_rv=add(cur_rv,rv);         if(\"-\"==ex.oper)cur_rv=sub(cur_rv,rv);       }       v=cur;       rv=cur_rv;     }     struct t_rv{       string type;       string value;       string get_reg()const{         auto t=split(value,\"\\n\");         if(t.back().empty())t.pop_back();         auto b=t.back();         return split(b,\"=\")[0];       }       int get_reg_id()const{         return std::stoi(split(get_reg(),\"\\2\")[0].substr(1));       }     };     t_rv rv_do(string cmd,t_rv a,t_rv b){       int reg_id=0;       auto reg=[](int reg_id){return \"\\1\"+std::to_string(reg_id)+\"\\2\";};       auto alloc_reg=[&amp;](){return reg(reg_id++);};       auto foo=[&amp;](const t_rv&amp;a){         if(a.type!=\"imm\")return a;         auto reg=alloc_reg();         return t_rv{\"asm\",reg+\"=\"+a.value};       };       auto fix=[&amp;](const t_rv&amp;a,int bef,int aft){         return t_rv{\"asm\",join(split(a.value,reg(bef)),reg(aft))};       };       string out;       auto ra=foo(a);auto a_id=ra.get_reg_id();reg_id=a_id+1;       auto rb=foo(b);auto b_id=rb.get_reg_id();reg_id=std::max(a_id+1,b_id+1);       for(int i=0;i&lt;=b_id;i++)if(i&lt;=a_id)if(rb.value.find(reg(i))!=std::string::npos)rb=fix(rb,i,reg_id++);       out+=ra.value+\"\\n\";       out+=rb.value+\"\\n\";       out+=alloc_reg()+\"=\"+cmd+\"(\"+ra.get_reg()+\",\"+rb.get_reg()+\")\\n\";       return t_rv{\"asm\",out};     }     t_rv div(t_rv a,t_rv b){       return rv_do(\"div\",a,b);     }     t_rv mul(t_rv a,t_rv b){       return rv_do(\"mul\",a,b);     }     t_rv add(t_rv a,t_rv b){       return rv_do(\"add\",a,b);     }     t_rv sub(t_rv a,t_rv b){       return rv_do(\"sub\",a,b);     }     real v=0;     t_rv rv;   }; };  void main_2021(IEnvRTTI&amp;Env){   \/\/{Sys$$&lt;t_simple_calc&gt;::GetRTTI(Env);};   t_simple_calc::t_addsub ast;   string inp;   std::cin&gt;&gt;inp;   string input=inp;\/\/\"100+2*(10+1*2)+30\/2-15-16-3\/1+3.14\/2.5*1-1000\";   auto ok=load_obj(Env,ast,input);   int gg=1;   t_simple_calc_evalutor::t_go go;   go.Do(ast);   std::cout&lt;&lt;\"Result: \"&lt;&lt;go.v&lt;&lt;std::endl&lt;&lt;std::endl;   string output=join(split(join(split(go.rv.value,\"\\1\"),\"r\"),\"\\2\"),\"\");   std::cout&lt;&lt;output&lt;&lt;std::endl;   int gg2=2; }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041a\u043e\u0434 \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u2014 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439 \u0438 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 (\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e).<\/p>\n<h3>\u0420\u0430\u0437\u0431\u043e\u0440 \u043a\u043e\u0434\u0430 \u043e\u0431\u0445\u043e\u0434\u0430 AST \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430<\/h3>\n<h3>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 t_simple_calc_evalutor<\/h3>\n<p>\u0420\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 <code>t_simple_calc<\/code>, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">struct t_simple_calc_evalutor : t_simple_calc {  <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-467851","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467851","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=467851"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467851\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=467851"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=467851"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=467851"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}