{"id":496280,"date":"2026-09-27T22:05:28","date_gmt":"2026-09-27T22:05:28","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=496280"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=496280","title":{"rendered":"\u041a\u0430\u043a \u044f \u043f\u0435\u0440\u0435\u043d\u0451\u0441 \u0441\u0431\u043e\u0440\u043a\u0443 \u043b\u0435\u043a\u0441\u0435\u0440\u0430 \u0432 compile-time"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/84\/d7\/5a\/84d75a36e1ace9da0871231d4c0da68b.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/84\/d7\/5a\/84d75a36e1ace9da0871231d4c0da68b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/84\/d7\/5a\/84d75a36e1ace9da0871231d4c0da68b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b <code>source generator<\/code> \u0434\u043b\u044f \u043b\u0435\u043a\u0441\u0435\u0440\u0430 <a href=\"https:\/\/github.com\/Stepami\/hydrascript\" rel=\"noopener nofollow\">HydraScript<\/a>. \u041e\u043d \u0441\u043e\u0431\u0438\u0440\u0430\u043b \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443 \u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0451 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u0430\u0439\u043b.<\/p>\n<p>\u0414\u0430\u0436\u0435 \u0442\u0435\u0441\u0442 \u043d\u0430 \u0437\u0430\u0431\u044b\u0442\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0437\u0430\u0432\u0435\u0441\u0442\u0438. \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0443\u0441\u0438\u043b\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438.<\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0435\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u2014 \u0442\u043e\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c <code>[GeneratedRegex]<\/code> \u0432 .NET. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u043f\u043e\u0440\u0443\u0447\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0431\u043e\u0440\u043a\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 Roslyn \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b.<\/p>\n<h3>\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 HydraScript<\/h3>\n<p>\u041c\u043e\u0439 \u043b\u0435\u043a\u0441\u0435\u0440 \u043d\u0430\u0440\u0435\u0437\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043b\u0435\u0436\u0430\u0442 \u0432 <a href=\"https:\/\/github.com\/Stepami\/hydrascript\/blob\/704cb76b3708a64d789c1f24ff8cab3bb977894d\/src\/Domain\/HydraScript.Domain.Constants\/TokenTypes.cs\" rel=\"noopener nofollow\"><code>TokenTypes.Stream<\/code><\/a>:<\/p>\n<pre><code class=\"cs\">public record struct Dto(    string Tag,    string Pattern,    int Priority,    bool CanIgnore = false);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e\u043c \u043f\u043e\u043b\u0435\u0439 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442. \u0410 \u0432\u043e\u0442 \u0437\u0430 <code>Priority<\/code> \u043f\u0440\u044f\u0447\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u044f\u0437\u044b\u043a \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u0435\u0437\u043e\u0431\u0438\u0434\u043d\u044b\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0442\u0430\u043a\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443:<\/p>\n<pre><code>let x = 12.5x += 1&gt;&gt;&gt; x &gt;= 13<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430\u0447\u0430\u043b\u043e <code>12.5<\/code> \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u043a \u043f\u043e\u0434 \u0447\u0438\u0441\u043b\u043e \u0441 \u0434\u0440\u043e\u0431\u044c\u044e, \u0442\u0430\u043a \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u201c\u0446\u0435\u043b\u043e\u0435-\u0442\u043e\u0447\u043a\u0430-\u0446\u0435\u043b\u043e\u0435\u201d. \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430, \u043b\u0435\u043a\u0441\u0435\u0440 \u0437\u0430\u0431\u0435\u0440\u0451\u0442 <code>12<\/code> \u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u043e\u0447\u043a\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0442\u043e\u043a\u0435\u043d\u0443. \u041f\u043e \u0442\u043e\u0439 \u0436\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 <code>+=<\/code> \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u0432\u044b\u0432\u043e\u0434\u0430 <code>&gt;&gt;&gt;<\/code> \u0434\u0430\u0442\u044c \u0448\u0430\u043d\u0441 \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0431\u0435\u0440\u0451\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 <code>&gt;<\/code>.<\/p>\n<p>\u0427\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">yield return new(    Tag: \"IntegerLiteral\",    Pattern: \"[0-9]+\",    Priority: 3);yield return new(    Tag: \"FloatLiteral\",    Pattern: \"[0-9]+[.][0-9]+\",    Priority: 2);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0440\u043e\u0431\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0437\u0436\u0435 \u0432 \u0444\u0430\u0439\u043b\u0435, \u043d\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u0432 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0435. \u042f \u0445\u0440\u0430\u043d\u044e \u044d\u0442\u043e\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0440\u044f\u0434\u043e\u043c \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u043c\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u044f\u0437\u044b\u043a\u0430: \u043f\u0430\u0442\u0442\u0435\u0440\u043d <code>[0-9]+<\/code> \u0441\u0430\u043c \u043d\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e <code>12.5<\/code> \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043f\u043e\u043a\u043e\u0435.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 maximal munch, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0430\u043c\u043e\u0435 \u0434\u043b\u0438\u043d\u043d\u043e\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435, \u043d\u0435\u0442. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u044b.<\/p>\n<h3>\u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041d\u0430\u0439\u0442\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0442\u0435\u043a\u0441\u0442\u0430 \u2014 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0434\u0435\u043b\u0430. \u041f\u0430\u0440\u0441\u0435\u0440\u0443 \u0435\u0449\u0451 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u043c\u0443 \u0434\u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c: \u0447\u0438\u0441\u043b\u043e, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f. \u0418\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043d\u0435 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u043d\u043e\u0432\u043e.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/Stepami\/hydrascript\/blob\/704cb76b3708a64d789c1f24ff8cab3bb977894d\/src\/Infrastructure\/HydraScript.Infrastructure.LexerRegexGenerator\/PatternGenerator.cs\" rel=\"noopener nofollow\"><code>PatternGenerator<\/code><\/a>  \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">var tokenTypes = Provider.TokenTypesStream    .OrderBy(x =&gt; x.Priority)    .Concat([new TokenTypes.Dto(\"ERROR\", @\"\\S+\", int.MaxValue)]);var pattern = string.Join(    \"|\",    tokenTypes.Select(t =&gt; $\"(?&lt;{t.Tag}&gt;{t.Pattern})\"));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0434\u0432\u0443\u0445 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f:<\/p>\n<pre><code>(?&lt;FloatLiteral&gt;[0-9]+[.][0-9]+)|(?&lt;IntegerLiteral&gt;[0-9]+)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0435\u0449\u0451 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438 \u043f\u0443\u043d\u043a\u0442\u0443\u0430\u0446\u0438\u044e. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0433\u0440\u0443\u043f\u043f\u0430 <code>ERROR<\/code> \u043d\u0443\u0436\u043d\u0430 \u043f\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435: \u043d\u0435\u043f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043f\u043e\u0434\u043e\u0448\u0451\u043b \u043d\u0438 \u043f\u043e\u0434 \u043e\u0434\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0442\u0430\u0442\u044c \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438. \u041f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u043e\u0439 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u043b\u0447\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u043d\u0435 \u0443\u0437\u043d\u0430\u043b\u0430.<\/p>\n<p>\u0423 \u0440\u0430\u0437\u043d\u044b\u0445 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0442\u0435\u0433\u0438. \u0418 <code>=<\/code>, \u0438 <code>+=<\/code> \u2014 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f, \u0445\u043e\u0442\u044f \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u044b \u0443 \u043d\u0438\u0445 \u0440\u0430\u0437\u043d\u044b\u0435. \u041e\u0431\u0449\u0438\u0439 \u0442\u0435\u0433 <code>Assign<\/code> \u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442: \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u0442\u043e\u043a\u0435\u043d\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0441\u0442\u0440\u043e\u043a\u0430. \u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0435\u0451 \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442, \u043d\u0443\u0436\u043d\u0430 C#-\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u044b\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b <code>PatternContainer.g.cs<\/code> \u0441 <code>PatternContainer.Value<\/code> \u0432\u043d\u0443\u0442\u0440\u0438.<\/p>\n<h3>\u041e\u0434\u043d\u043e\u043c\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u043d\u0443\u0436\u0435\u043d \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e<\/h3>\n<p>\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/Stepami\/hydrascript\/blob\/704cb76b3708a64d789c1f24ff8cab3bb977894d\/src\/Infrastructure\/HydraScript.Infrastructure\/GeneratedRegexContainer.cs\" rel=\"noopener nofollow\"><code>GeneratedRegexContainer<\/code><\/a>:<\/p>\n<pre><code class=\"cs\">using System.Text.RegularExpressions;using HydraScript.Domain.FrontEnd.Lexer;namespace HydraScript.Infrastructure;public sealed partial class GeneratedRegexContainer : IGeneratedRegexContainer{    [GeneratedRegex(        PatternContainer.Value,        options: RegexOptions.Compiled | RegexOptions.ExplicitCapture)]    public static partial Regex Regex { get; }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u043e\u0442 \u043d\u0430 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u043e \u0440\u0443\u0447\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0435 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0445\u043e\u0434\u043e\u043c \u0432\u0442\u043e\u0440\u043e\u0433\u043e. \u0415\u0441\u043b\u0438 \u0432\u044b\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>RegisterSourceOutput<\/code>, \u0434\u0440\u0443\u0433\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0432 \u0442\u043e\u043c \u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0435\u0451 \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u0442.<\/p>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c <strong>post-initialization output<\/strong>. \u042d\u0442\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 Roslyn \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u0434\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432. \u041c\u043e\u044e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0430\u0442\u044c \u0432 \u044d\u0442\u043e\u0439 \u0444\u0430\u0437\u0435:<\/p>\n<pre><code class=\"cs\">context.RegisterPostInitializationOutput(ctx =&gt; ctx.AddSource(    \"PatternContainer.g.cs\",    SourceText.From(code, Encoding.UTF8)));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>PatternContainer.Value<\/code>, \u043a\u043e\u0433\u0434\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442, \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e partial-\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u0420\u0430\u0437\u043d\u0438\u0446\u0443 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0444\u0430\u0437\u0430\u043c\u0438 \u0432\u044b\u0434\u0430\u0447\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/dotnet\/roslyn\/blob\/main\/docs\/features\/incremental-generators.md#outputting-values\" rel=\"noopener nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Roslyn<\/a>.<\/p>\n<p>\u0414\u043e \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u044d\u0442\u043e\u0442 Roslyn \u043f\u043b\u0430\u0433\u0438\u043d \u043a\u043e\u0434 \u0431\u044b\u043b \u0435\u0449\u0451 \u0445\u0443\u0436\u0435. \u0422\u043e\u0433\u0434\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0435\u0449\u0451 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0441\u044c \u0432 JSON \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u0432 \u043b\u0435\u043a\u0441\u0435\u0440 \u0447\u0435\u0440\u0435\u0437 runtime. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u0438\u0445 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 C#, \u043d\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u0435\u043c \u0436\u0435.<\/p>\n<p>\u0423 \u0440\u0430\u043d\u043d\u0435\u0439 \u0444\u0430\u0437\u044b \u0435\u0441\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435: \u0435\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430-\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f. \u0415\u0441\u043b\u0438 \u0431\u044b \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0437\u0430\u0432\u0438\u0441\u0435\u043b \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438\u043b\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u0434\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u044d\u0442\u0443 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 callback \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0431\u044b. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0441\u0430\u043c\u043e\u043c\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443.<\/p>\n<p>\u0417\u0430\u043e\u0434\u043d\u043e \u0437\u0430\u043c\u0435\u0447\u0443 \u043e\u0434\u043d\u0443 \u0434\u0435\u0442\u0430\u043b\u044c \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435: <code>RegexOptions.Compiled<\/code> \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u0430\u0451\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u044d\u0442\u043e\u0442 \u043a\u0435\u0439\u0441 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b <a href=\"https:\/\/github.com\/dotnet\/runtime\/issues\/80317#issuecomment-1374228699\" rel=\"noopener nofollow\">\u0421\u0442\u0438\u0432\u0435\u043d \u0422\u043e\u0443\u0431 \u043d\u0430 github<\/a>. \u0423 \u043c\u0435\u043d\u044f \u0432 hydrascript \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0442\u0430\u043a\u0430\u044f \u0444\u0430\u043a\u0442\u0443\u0440\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\"><strong>Method<\/strong><\/p>\n<\/th>\n<th>\n<p align=\"left\"><strong>Mean<\/strong><\/p>\n<\/th>\n<th>\n<p align=\"left\"><strong>Error<\/strong><\/p>\n<\/th>\n<th>\n<p align=\"left\"><strong>StdDev<\/strong><\/p>\n<\/th>\n<th>\n<p align=\"left\"><strong>Allocated<\/strong><\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Compiled<\/p>\n<\/td>\n<td>\n<p align=\"left\">275.9 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">5.27 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">12.21 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Generated<\/p>\n<\/td>\n<td>\n<p align=\"left\">158.8 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.72 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.52 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GeneratedCompiled<\/p>\n<\/td>\n<td>\n<p align=\"left\">155.5 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.31 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.05 us<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u041f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f, \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u2014 \u043d\u0435\u0442<\/h3>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 <code>ProjectReference<\/code> \u043d\u0430 <code>HydraScript.Domain.Constants<\/code>. HydraScript \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0441\u044f \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b. \u0410 \u043f\u043e\u0442\u043e\u043c \u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b BenchmarkDotNet, \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0443\u043f\u0430\u043b \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u0435\u0449\u0451 \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0437\u0430\u043c\u0435\u0440\u0430: <code>CS8032<\/code>, \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>PatternGenerator<\/code>. \u042f <a href=\"https:\/\/github.com\/dotnet\/BenchmarkDotNet\/issues\/2889\" rel=\"noopener nofollow\">\u043f\u0440\u0438\u0448\u0451\u043b \u0441 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 BenchmarkDotNet<\/a>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u0442\u043e\u0442 \u0436\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u043b.<\/p>\n<p>\u0422\u0438\u043c \u041a\u0430\u0441\u0441\u0435\u043b\u043b <a href=\"https:\/\/github.com\/dotnet\/BenchmarkDotNet\/issues\/2889#issuecomment-4276937971\" rel=\"noopener nofollow\">\u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0451\u043b \u043e\u0448\u0438\u0431\u043a\u0443 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 BenchmarkDotNet<\/a>:<\/p>\n<pre><code class=\"powershell\">dotnet build \/p:UseSharedCompilation=false<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c BenchmarkDotNet \u0441\u043e\u0431\u0438\u0440\u0430\u043b \u0441\u0432\u043e\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f shared compilation \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0435\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430.<\/p>\n<p>\u0422\u0438\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430: \u0443\u0431\u0440\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043f\u043e\u043c\u0435\u0442\u0438\u043b <code>OutputItemType=\"Analyzer\"<\/code>, \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 <code>Compile<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u0432 \u0441\u0431\u043e\u0440\u043a\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"xml\">&lt;PropertyGroup&gt;    &lt;EnforceExtendedAnalyzerRules&gt;true&lt;\/EnforceExtendedAnalyzerRules&gt;    &lt;IsRoslynComponent&gt;true&lt;\/IsRoslynComponent&gt;    &lt;TargetFramework&gt;netstandard2.0&lt;\/TargetFramework&gt;    &lt;IsAotCompatible&gt;false&lt;\/IsAotCompatible&gt;&lt;\/PropertyGroup&gt;&lt;ItemGroup&gt;    &lt;Compile Include=\"..\\..\\Domain\\HydraScript.Domain.Constants\\*.cs\"             LinkBase=\"_Constants\"\/&gt;&lt;\/ItemGroup&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0441\u0432\u043e\u044e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439, \u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u044e \u044f \u0438\u0445 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432 \u0435\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u041f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u043f\u043e\u043f\u0430\u043b\u043e \u0432 \u043d\u043e\u0432\u0443\u044e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443.<\/p>\n<p>\u0423 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0435\u0441\u0442\u044c \u0446\u0435\u043d\u0430: \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u0434 <code>netstandard2.0<\/code>, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0446\u0435\u043b\u0435\u043d \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440. \u0414\u043b\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u044d\u0442\u043e \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>Infrastructure \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043a\u0430\u043a analyzer:<\/p>\n<pre><code class=\"xml\">&lt;ProjectReference    Include=\"..\\HydraScript.Infrastructure.LexerRegexGenerator\\HydraScript.Infrastructure.LexerRegexGenerator.csproj\"    OutputItemType=\"Analyzer\"    ReferenceOutputAssembly=\"false\"    PrivateAssets=\"all\" \/&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 <code>IIncrementalGenerator<\/code>, \u0445\u043e\u0442\u044f pipeline \u0441 syntax provider \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d. \u041e\u043d \u0433\u043e\u0442\u043e\u0432\u0438\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439, \u0443\u0436\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u0435\u0433\u043e \u0441\u0431\u043e\u0440\u043a\u0443, \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 post-initialization output. \u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0435\u043c\u0443 \u043d\u0435\u0437\u0430\u0447\u0435\u043c.<\/p>\n<h3>\u041b\u0435\u043a\u0441\u0435\u0440\u0443 \u043d\u0435\u0437\u0430\u0447\u0435\u043c \u0437\u043d\u0430\u0442\u044c \u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0435<\/h3>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 HydraScript \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0427\u0438\u0441\u0442\u043e\u0439 \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u041b\u0435\u043a\u0441\u0435\u0440 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 Domain, \u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438 \u2014 \u0432 Infrastructure. \u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043b\u043e\u0451\u0432 \u0440\u0430\u0434\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438 \u043c\u043d\u0435 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0412\u043e\u0442 \u0433\u0434\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0447\u043b\u0435\u043d \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. Domain \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442 <a href=\"https:\/\/github.com\/Stepami\/hydrascript\/blob\/704cb76b3708a64d789c1f24ff8cab3bb977894d\/src\/Domain\/HydraScript.Domain.FrontEnd\/Lexer\/IGeneratedRegexContainer.cs\" rel=\"noopener nofollow\">\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442<\/a>:<\/p>\n<pre><code class=\"cs\">using System.Text.RegularExpressions;namespace HydraScript.Domain.FrontEnd.Lexer;public interface IGeneratedRegexContainer{    public static abstract Regex Regex { get; }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043d \u0447\u0435\u0440\u0435\u0437 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 <a href=\"https:\/\/github.com\/Stepami\/hydrascript\/blob\/704cb76b3708a64d789c1f24ff8cab3bb977894d\/src\/Domain\/HydraScript.Domain.FrontEnd\/Lexer\/Impl\/Structure.cs\" rel=\"noopener nofollow\"><code>Structure&lt;TContainer&gt;<\/code><\/a> \u0438 \u0435\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 <code>TContainer : IGeneratedRegexContainer<\/code>. \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a \u0432\u044b\u0437\u043e\u0432 <code>TContainer.Regex<\/code>. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 DI composition root:<\/p>\n<pre><code class=\"cs\">services.AddSingleton&lt;IStructure, Structure&lt;GeneratedRegexContainer&gt;&gt;();services.AddSingleton&lt;ILexer, RegexLexer&gt;();<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0434\u0435\u043b\u043e\u043c Infrastructure. Domain \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0430\u043c\u043e\u0439 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438, \u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u0451\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443 \u0431\u0435\u0437 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442.<\/p>\n<p>\u0426\u0435\u043b\u0438\u043a\u043e\u043c \u0441\u0445\u0435\u043c\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/10\/3f\/48\/103f4885666d49954bcf5e6000ed4d8a.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/10\/3f\/48\/103f4885666d49954bcf5e6000ed4d8a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/10\/3f\/48\/103f4885666d49954bcf5e6000ed4d8a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0421\u0430\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/Stepami\/hydrascript\/blob\/704cb76b3708a64d789c1f24ff8cab3bb977894d\/src\/Domain\/HydraScript.Domain.FrontEnd\/Lexer\/Impl\/RegexLexer.cs\" rel=\"noopener nofollow\"><code>RegexLexer.GetTokens<\/code><\/a> \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u041f\u043e\u0438\u0441\u043a \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439, \u043f\u0440\u043e\u043f\u0443\u0441\u043a \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0442\u043e\u0433\u0434\u0430 \u0436\u0435. \u041a\u0430\u043a \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 frozen-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432.<\/p>\n<h3>\u0418\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043b\u0435\u043a\u0441\u0435\u0440\u0430<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432 \u0444\u0430\u0439\u043b <code>lexer.js<\/code>.<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0435\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043b\u0435\u043a\u0441\u0435\u0440\u0430 HydraScript \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u043e\u043d \u0441\u043a\u0440\u0438\u043f\u0442\u0430  \u0441 \u0444\u043b\u0430\u0433\u043e\u043c <code>--dump<\/code>:<\/p>\n<pre><code class=\"powershell\">hydrascript lexer.js --dump<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 <code>true<\/code>. \u0412 \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0435\u043c\u0441\u044f <code>lexer.tokens<\/code> \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b \u0442\u0430\u043a, \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e:<\/p>\n<pre><code>FloatLiteral (1, 9)-(1, 13): 12.5Assign (2, 3)-(2, 5): +=Output (3, 1)-(3, 4): &gt;&gt;&gt;Operator (3, 7)-(3, 9): &gt;=<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>--dump<\/code> \u0437\u0430\u043e\u0434\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0440\u044f\u0434\u043e\u043c \u0441\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0435\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0444\u0430\u0437\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430.<\/p>\n<p>\u0425\u043e\u0442\u0435\u043b \u044f \u043e\u0442 \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439 \u0437\u0430\u0442\u0435\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043a\u0440\u043e\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430: \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0442\u043e\u043a\u0435\u043d\u0430 \u0438 \u043d\u0435 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043a\u0443\u0434\u0430-\u0442\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443. \u0427\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0443\u0447\u043d\u043e\u0439 \u0448\u0430\u0433, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0438\u0434\u0435\u043d \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443. \u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u043d\u0435 \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u044f \u043a \u0418\u0418 \u0430\u0433\u0435\u043d\u0442\u0430\u043c!<\/p>\n<p>\u0415\u0449\u0451 \u044f \u0432\u0435\u0434\u0443 <a href=\"https:\/\/t.me\/+MgLRLb8ZSVAxNTY6\" rel=\"noopener nofollow\">Telegram \u043a\u0430\u043d\u0430\u043b StepOne<\/a>, \u043a\u0443\u0434\u0430 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0430 C#, \u0434\u0430\u044e \u043a\u0430\u0440\u044c\u0435\u0440\u043d\u044b\u0435 \u0441\u043e\u0432\u0435\u0442\u044b, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0438\u0437 \u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u0438 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044e \u0432\u0441\u0435 \u0442\u0430\u0439\u043d\u044b IT\u2011\u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438!<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1087280\/\">https:\/\/habr.com\/ru\/articles\/1087280\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b source generator \u0434\u043b\u044f \u043b\u0435\u043a\u0441\u0435\u0440\u0430 HydraScript. \u041e\u043d \u0441\u043e\u0431\u0438\u0440\u0430\u043b \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443 \u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0451 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u0430\u0439\u043b.\u0414\u0430\u0436\u0435 \u0442\u0435\u0441\u0442 \u043d\u0430 \u0437\u0430\u0431\u044b\u0442\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0437\u0430\u0432\u0435\u0441\u0442\u0438. \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0443\u0441\u0438\u043b\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438.\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0435\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u2014 \u0442\u043e\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c [GeneratedRegex] \u0432 .NET. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u043f\u043e\u0440\u0443\u0447\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0431\u043e\u0440\u043a\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 Roslyn \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b.\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 HydraScript\u041c\u043e\u0439 \u043b\u0435\u043a\u0441\u0435\u0440 \u043d\u0430\u0440\u0435\u0437\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043b\u0435\u0436\u0430\u0442 \u0432 TokenTypes.Stream:public record struct Dto(    string Tag,    string Pattern,    int Priority,    bool CanIgnore = false);\u0421 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e\u043c \u043f\u043e\u043b\u0435\u0439 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442. \u0410 \u0432\u043e\u0442 \u0437\u0430 Priority \u043f\u0440\u044f\u0447\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u044f\u0437\u044b\u043a \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u0435\u0437\u043e\u0431\u0438\u0434\u043d\u044b\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0442\u0430\u043a\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443:let x = 12.5x += 1&gt;&gt;&gt; x &gt;= 13\u041d\u0430\u0447\u0430\u043b\u043e 12.5 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u043a \u043f\u043e\u0434 \u0447\u0438\u0441\u043b\u043e \u0441 \u0434\u0440\u043e\u0431\u044c\u044e, \u0442\u0430\u043a \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u201c\u0446\u0435\u043b\u043e\u0435-\u0442\u043e\u0447\u043a\u0430-\u0446\u0435\u043b\u043e\u0435\u201d. \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430, \u043b\u0435\u043a\u0441\u0435\u0440 \u0437\u0430\u0431\u0435\u0440\u0451\u0442 12 \u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u043e\u0447\u043a\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0442\u043e\u043a\u0435\u043d\u0443. \u041f\u043e \u0442\u043e\u0439 \u0436\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 += \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u0432\u044b\u0432\u043e\u0434\u0430 &gt;&gt;&gt; \u0434\u0430\u0442\u044c \u0448\u0430\u043d\u0441 \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0431\u0435\u0440\u0451\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 &gt;.\u0427\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u0430\u043a:yield return new(    Tag: &#171;IntegerLiteral&#187;,    Pattern: &#171;[0-9]+&#187;,    Priority: 3);yield return new(    Tag: &#171;FloatLiteral&#187;,    Pattern: &#171;[0-9]+[.][0-9]+&#187;,    Priority: 2);\u0414\u0440\u043e\u0431\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0437\u0436\u0435 \u0432 \u0444\u0430\u0439\u043b\u0435, \u043d\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u0432 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0435. \u042f \u0445\u0440\u0430\u043d\u044e \u044d\u0442\u043e\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0440\u044f\u0434\u043e\u043c \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u043c\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u044f\u0437\u044b\u043a\u0430: \u043f\u0430\u0442\u0442\u0435\u0440\u043d [0-9]+ \u0441\u0430\u043c \u043d\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e 12.5 \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043f\u043e\u043a\u043e\u0435.\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 maximal munch, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0430\u043c\u043e\u0435 \u0434\u043b\u0438\u043d\u043d\u043e\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435, \u043d\u0435\u0442. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u044b.\u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u041d\u0430\u0439\u0442\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0442\u0435\u043a\u0441\u0442\u0430 \u2014 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0434\u0435\u043b\u0430. \u041f\u0430\u0440\u0441\u0435\u0440\u0443 \u0435\u0449\u0451 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u043c\u0443 \u0434\u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c: \u0447\u0438\u0441\u043b\u043e, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f. \u0418\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043d\u0435 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u043d\u043e\u0432\u043e.\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 PatternGenerator  \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:var tokenTypes = Provider.TokenTypesStream    .OrderBy(x =&gt; x.Priority)    .Concat([new TokenTypes.Dto(&#171;ERROR&#187;, @&#187;\\S+&#187;, int.MaxValue)]);var pattern = string.Join(    &#171;|&#187;,    tokenTypes.Select(t =&gt; $&#187;(?&lt;{t.Tag}&gt;{t.Pattern})&#187;));\u0414\u043b\u044f \u0434\u0432\u0443\u0445 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f:(?&lt;FloatLiteral&gt;[0-9]+[.][0-9]+)|(?&lt;IntegerLiteral&gt;[0-9]+)\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0435\u0449\u0451 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438 \u043f\u0443\u043d\u043a\u0442\u0443\u0430\u0446\u0438\u044e. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0433\u0440\u0443\u043f\u043f\u0430 ERROR \u043d\u0443\u0436\u043d\u0430 \u043f\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435: \u043d\u0435\u043f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043f\u043e\u0434\u043e\u0448\u0451\u043b \u043d\u0438 \u043f\u043e\u0434 \u043e\u0434\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0442\u0430\u0442\u044c \u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438. \u041f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u043e\u0439 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u043b\u0447\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u043d\u0435 \u0443\u0437\u043d\u0430\u043b\u0430.\u0423 \u0440\u0430\u0437\u043d\u044b\u0445 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0442\u0435\u0433\u0438. \u0418 =, \u0438 += \u2014 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f, \u0445\u043e\u0442\u044f \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u044b \u0443 \u043d\u0438\u0445 \u0440\u0430\u0437\u043d\u044b\u0435. \u041e\u0431\u0449\u0438\u0439 \u0442\u0435\u0433 Assign \u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442: \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u0442\u043e\u043a\u0435\u043d\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430.\u041f\u043e\u043a\u0430 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0441\u0442\u0440\u043e\u043a\u0430. \u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0435\u0451 \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442, \u043d\u0443\u0436\u043d\u0430 C#-\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u044b\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b PatternContainer.g.cs \u0441 PatternContainer.Value \u0432\u043d\u0443\u0442\u0440\u0438.\u041e\u0434\u043d\u043e\u043c\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u043d\u0443\u0436\u0435\u043d \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 GeneratedRegexContainer:using System.Text.RegularExpressions;using HydraScript.Domain.FrontEnd.Lexer;namespace HydraScript.Infrastructure;public sealed partial class GeneratedRegexContainer : IGeneratedRegexContainer{    [GeneratedRegex(        PatternContainer.Value,        options: RegexOptions.Compiled | RegexOptions.ExplicitCapture)]    public static partial Regex Regex { get; }}\u0412\u043e\u0442 \u043d\u0430 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u043e \u0440\u0443\u0447\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0435 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0445\u043e\u0434\u043e\u043c \u0432\u0442\u043e\u0440\u043e\u0433\u043e. \u0415\u0441\u043b\u0438 \u0432\u044b\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 RegisterSourceOutput, \u0434\u0440\u0443\u0433\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0432 \u0442\u043e\u043c \u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0435\u0451 \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u0442.\u041d\u043e \u0435\u0441\u0442\u044c post-initialization output. \u042d\u0442\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 Roslyn \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u0434\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432. \u041c\u043e\u044e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0430\u0442\u044c \u0432 \u044d\u0442\u043e\u0439 \u0444\u0430\u0437\u0435:context.RegisterPostInitializationOutput(ctx =&gt; ctx.AddSource(    &#171;PatternContainer.g.cs&#187;,    SourceText.From(code, Encoding.UTF8)));\u0422\u0435\u043f\u0435\u0440\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 PatternContainer.Value, \u043a\u043e\u0433\u0434\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442, \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e partial-\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u0420\u0430\u0437\u043d\u0438\u0446\u0443 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0444\u0430\u0437\u0430\u043c\u0438 \u0432\u044b\u0434\u0430\u0447\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Roslyn.\u0414\u043e \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u044d\u0442\u043e\u0442 Roslyn \u043f\u043b\u0430\u0433\u0438\u043d \u043a\u043e\u0434 \u0431\u044b\u043b \u0435\u0449\u0451 \u0445\u0443\u0436\u0435. \u0422\u043e\u0433\u0434\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0435\u0449\u0451 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0441\u044c \u0432 JSON \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u0432 \u043b\u0435\u043a\u0441\u0435\u0440 \u0447\u0435\u0440\u0435\u0437 runtime. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u0438\u0445 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 C#, \u043d\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u0435\u043c \u0436\u0435.\u0423 \u0440\u0430\u043d\u043d\u0435\u0439 \u0444\u0430\u0437\u044b \u0435\u0441\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435: \u0435\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430-\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f. \u0415\u0441\u043b\u0438 \u0431\u044b \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0437\u0430\u0432\u0438\u0441\u0435\u043b \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438\u043b\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u0434\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u044d\u0442\u0443 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 callback \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0431\u044b. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0441\u0430\u043c\u043e\u043c\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443.\u0417\u0430\u043e\u0434\u043d\u043e \u0437\u0430\u043c\u0435\u0447\u0443 \u043e\u0434\u043d\u0443 \u0434\u0435\u0442\u0430\u043b\u044c \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435: RegexOptions.Compiled \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u0430\u0451\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u044d\u0442\u043e\u0442 \u043a\u0435\u0439\u0441 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b \u0421\u0442\u0438\u0432\u0435\u043d \u0422\u043e\u0443\u0431 \u043d\u0430 github. \u0423 \u043c\u0435\u043d\u044f \u0432 hydrascript \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0442\u0430\u043a\u0430\u044f \u0444\u0430\u043a\u0442\u0443\u0440\u0430:MethodMeanErrorStdDevAllocatedCompiled275.9 us5.27 us12.21 us-Generated158.8 us1.72 us1.52 us-GeneratedCompiled155.5 us2.31 us2.05 us-\u041f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f, \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u2014 \u043d\u0435\u0442\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 ProjectReference \u043d\u0430 HydraScript.Domain.Constants. HydraScript \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0441\u044f \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b. \u0410 \u043f\u043e\u0442\u043e\u043c \u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b BenchmarkDotNet, \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0443\u043f\u0430\u043b \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u0435\u0449\u0451 \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0437\u0430\u043c\u0435\u0440\u0430: CS8032, \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 PatternGenerator. \u042f \u043f\u0440\u0438\u0448\u0451\u043b \u0441 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 BenchmarkDotNet, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u0442\u043e\u0442 \u0436\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u043b.\u0422\u0438\u043c \u041a\u0430\u0441\u0441\u0435\u043b\u043b \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0451\u043b \u043e\u0448\u0438\u0431\u043a\u0443 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 BenchmarkDotNet:dotnet build \/p:UseSharedCompilation=false\u0418\u043c\u0435\u043d\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c BenchmarkDotNet \u0441\u043e\u0431\u0438\u0440\u0430\u043b \u0441\u0432\u043e\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f shared compilation \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0435\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430.\u0422\u0438\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430: \u0443\u0431\u0440\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043f\u043e\u043c\u0435\u0442\u0438\u043b OutputItemType=&#187;Analyzer&#187;, \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 Compile. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u0432 \u0441\u0431\u043e\u0440\u043a\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430:&lt;PropertyGroup&gt;    &lt;EnforceExtendedAnalyzerRules&gt;true&lt;\/EnforceExtendedAnalyzerRules&gt;    &lt;IsRoslynComponent&gt;true&lt;\/IsRoslynComponent&gt;    &lt;TargetFramework&gt;netstandard2.0&lt;\/TargetFramework&gt;    &lt;IsAotCompatible&gt;false&lt;\/IsAotCompatible&gt;&lt;\/PropertyGroup&gt;&lt;ItemGroup&gt;    &lt;Compile Include=&#187;..\\..\\Domain\\HydraScript.Domain.Constants\\*.cs&#187;             LinkBase=&#187;_Constants&#187;\/&gt;&lt;\/ItemGroup&gt;\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0441\u0432\u043e\u044e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439, \u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u044e \u044f \u0438\u0445 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432 \u0435\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u041f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u043f\u043e\u043f\u0430\u043b\u043e \u0432 \u043d\u043e\u0432\u0443\u044e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443.\u0423 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0435\u0441\u0442\u044c \u0446\u0435\u043d\u0430: \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u0434 netstandard2.0, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0446\u0435\u043b\u0435\u043d \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440. \u0414\u043b\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u044d\u0442\u043e \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435.Infrastructure \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043a\u0430\u043a analyzer:&lt;ProjectReference    Include=&#187;..\\HydraScript.Infrastructure.LexerRegexGenerator\\HydraScript.Infrastructure.LexerRegexGenerator.csproj&#187;    OutputItemType=&#187;Analyzer&#187;    ReferenceOutputAssembly=&#187;false&#187;    PrivateAssets=&#187;all&#187; \/&gt;\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 IIncrementalGenerator, \u0445\u043e\u0442\u044f pipeline \u0441 syntax provider \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d. \u041e\u043d \u0433\u043e\u0442\u043e\u0432\u0438\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439, \u0443\u0436\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u0435\u0433\u043e \u0441\u0431\u043e\u0440\u043a\u0443, \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 post-initialization output. \u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0435\u043c\u0443 \u043d\u0435\u0437\u0430\u0447\u0435\u043c.\u041b\u0435\u043a\u0441\u0435\u0440\u0443 \u043d\u0435\u0437\u0430\u0447\u0435\u043c \u0437\u043d\u0430\u0442\u044c \u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0435\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 HydraScript \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0427\u0438\u0441\u0442\u043e\u0439 \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u041b\u0435\u043a\u0441\u0435\u0440 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 Domain, \u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438 \u2014 \u0432 Infrastructure. \u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043b\u043e\u0451\u0432 \u0440\u0430\u0434\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438 \u043c\u043d\u0435 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f.\u0412\u043e\u0442 \u0433\u0434\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u0447\u043b\u0435\u043d \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. Domain \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442:using System.Text.RegularExpressions;namespace HydraScript.Domain.FrontEnd.Lexer;public interface IGeneratedRegexContainer{    public static abstract Regex Regex { get; }}\u0410 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043d \u0447\u0435\u0440\u0435\u0437 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 Structure&lt;TContainer&gt; \u0438 \u0435\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 TContainer : IGeneratedRegexContainer. \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a \u0432\u044b\u0437\u043e\u0432 TContainer.Regex. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 DI composition root:services.AddSingleton&lt;IStructure, Structure&lt;GeneratedRegexContainer&gt;&gt;();services.AddSingleton&lt;ILexer, RegexLexer&gt;();\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0434\u0435\u043b\u043e\u043c Infrastructure. Domain \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0430\u043c\u043e\u0439 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438, \u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u0451\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443 \u0431\u0435\u0437 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442.\u0426\u0435\u043b\u0438\u043a\u043e\u043c \u0441\u0445\u0435\u043c\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:\u0421\u0430\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 RegexLexer.GetTokens \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u041f\u043e\u0438\u0441\u043a \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439, \u043f\u0440\u043e\u043f\u0443\u0441\u043a \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0442\u043e\u0433\u0434\u0430 \u0436\u0435. \u041a\u0430\u043a \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 frozen-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432.\u0418\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043b\u0435\u043a\u0441\u0435\u0440\u0430\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432 \u0444\u0430\u0439\u043b lexer.js.\u0422\u043e\u0433\u0434\u0430 \u0435\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043b\u0435\u043a\u0441\u0435\u0440\u0430 HydraScript \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u043e\u043d \u0441\u043a\u0440\u0438\u043f\u0442\u0430  \u0441 \u0444\u043b\u0430\u0433\u043e\u043c &#8212;dump:hydrascript lexer.js &#8212;dump\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 true. \u0412 \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0435\u043c\u0441\u044f lexer.tokens \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b \u0442\u0430\u043a, \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e:FloatLiteral (1, 9)-(1, 13): 12.5Assign (2, 3)-(2, 5): +=Output (3, 1)-(3, 4): &gt;&gt;&gt;Operator (3, 7)-(3, 9): &gt;=&#8212;dump \u0437\u0430\u043e\u0434\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0440\u044f\u0434\u043e\u043c \u0441\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0435\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-496280","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/496280","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=496280"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/496280\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=496280"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=496280"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=496280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}