{
    "componentChunkName": "component---src-templates-doc-page-js",
    "path": "/docs/ru/Patterns/advanced_patterns/",
    "result": {"data":{"site":{"siteMetadata":{"title":"Gatsby-doc-engine"}},"markdownRemark":{"id":"0794ba70-49d0-53b7-8a30-dae3ed2ad3ad","excerpt":"Расширенные элементы паттернов $pattern_name  — ссылка на именованный паттерн.?> Подробнее об именованных паттернах Использование в сценарии Объявление паттерна…","html":"<h1>Расширенные элементы паттернов</h1>\n<hr>\n<h3>$pattern_name</h3>\n<p><code class=\"language-text\">$название-паттерна</code> — ссылка на именованный паттерн.</p>\n<p class='warn'><a href=/1.11.1/docs/ru/Patterns/named_patterns  >Подробнее об именованных паттернах</a></p>\n</br>\n<h5>Использование в сценарии</h5>\n<p>Объявление паттерна:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">patterns:</span>\n    $thanks = (спасибо [и] [тебе|вам] [большое]|благодар*|спс|супер|супир|ура|отлично|молод*|умни*|пасиб*)\n    $ok = (окей|ок|okey|okay|o key|ok)\n    $you = (ты|вы|тебе|вам|тебя|тя|тибя|вас)\n    $my = (мой|моя|мое|моё|мае|маё|мне|мои|маи|мою|маю|моне|мане|манё|монё|меня|миня|моих|маих|моим|маим|моем|маем|моём|маём|мя|ма|мня|[со] мной)</code></pre></div>\n<p>Использование паттерна в сценарии:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"> <span class=\"token keyword\">state:</span> Thanks\n        <span class=\"token storageType\">q!:</span> *  $thanks  \n        <span class=\"token storageType\">q!:</span> * $ok *\n        <span class=\"token storageType\">q!:</span> * {мне (понятно|понятненько|ясно|ясненько) [все|всё]} *\n        <span class=\"token storageType\">q!:</span> * {(понятно|понятненько|ясно|ясненько) (все|всё)} *\n        <span class=\"token storageType\">q!:</span> * [премного] благодарн* *\n        <span class=\"token variableParameter\">script:</span>\n            $reactions.answer(\"Рад помочь.\\nОстались ли у вас еще вопросы?\")</code></pre></div>\n<hr>\n<h3>~lemma</h3>\n<p><code class=\"language-text\">~lemma</code> — проверяет все формы слова.</p>\n<p>Например, в паттерн <code class=\"language-text\">~яблоко</code> попадут слова: <code class=\"language-text\">яблоки</code>, <code class=\"language-text\">яблок</code> и др.</p>\n<p>Правило срабатывает на всех словоформах всех омонимов: слов, которые пишутся одинаково, но имеют разные значения или морфологическую форму.</p>\n<p>Например, паттерн <code class=\"language-text\">~печь</code> сработает на словоформах существительного <code class=\"language-text\">печь</code> (<code class=\"language-text\">печи</code>, <code class=\"language-text\">печью</code>) и глагола <code class=\"language-text\">печь</code> (<code class=\"language-text\">пеку</code>, <code class=\"language-text\">печешь</code>).</p>\n<p class='warn'>Из-за морфологического разнообразия языка использование этого паттерна может приводить к ложноположительным результатам.</p>\n</br>\n<h5>Использование в сценарии</h5>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"> <span class=\"token keyword\">state:</span> Delivery\n        <span class=\"token storageType\">q!:</span> * {(заказать/заказывать/заказ/~доставка/доставляете) [~еда] * [$cafe]} * $City *\n        <span class=\"token storageType\">q:</span> * $City *\n        <span class=\"token variableParameter\">script:</span>\n          if (!$session.address) {\n            $session.address = {};\n          }\n          $session.address.city = $parseTree.City[0].value.name;\n        <span class=\"token variableParameter\">go!:</span> ../../Delivery</code></pre></div>\n<hr>\n<h3>$morph</h3>\n<p><code class=\"language-text\">$morph&lt;часть речи и/или граммема></code> — проверяет грамматические свойства слова.</p>\n<p>Например, для паттерна <code class=\"language-text\">$morph&lt;С им ед></code>: <code class=\"language-text\">С</code> — существительное, <code class=\"language-text\">им</code> — в именительном падеже, <code class=\"language-text\">ед</code> — в единственном числе.</p>\n<p class='warn'>Вы можете указать одно или несколько свойств.</p>\n<p>Для парсинга морфологии используется библиотека <a href=\"http://aot.ru/docs/rusmorph.html\" target=\"_blank\" rel=\"noopener noreferrer\">АОТ</a>.</p>\n</br>\n<h5>Использование в сценарии</h5>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">theme:</span> /Bank Information\n    <span class=\"token keyword\">state:</span> Bank Information\n        <span class=\"token storageType\">q!:</span> * $morph&lt;С> [нашего/вашего/этого] (банка) * \n        <span class=\"token storageType\">q!:</span> * (называется) [наш/ваш/этот] (~банк) *\n        <span class=\"token variableParameter\">go:</span> /</code></pre></div>\n<p class='warn'>Одно слово не обязательно заключать в <code class=\"language-text\">()</code>.</p>\n<hr>\n<h3>$regexp</h3>\n<p><code class=\"language-text\">$regexp&lt;литералы и метасимволы></code> — <a href=\"https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F\" target=\"_blank\" rel=\"noopener noreferrer\">регулярное выражение</a> — строка, которая является шаблоном, описывающим некий набор строк.\nВ <code class=\"language-text\">$regexp</code> будут попадать строки, соответствующие шаблону.</p>\n<p>Шаблон состоит из литералов и метасимволов — символов со специальным, а не буквальным значением.</p>\n<p>?><a href=\"https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html\" target=\"_blank\" rel=\"noopener noreferrer\">Синтаксис регулярных выражений</a> соответствует синтаксису, используемому в Java.</p>\n</br>\n<h5>Использование в сценарии</h5>\n<p>Объявление паттерна для обнаружения любого слова в ответе:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">patterns:</span>\n    $anyWord = $regexp&lt;.+> </code></pre></div>\n<p>Объявление паттерна для обнаружения процентного значения:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">patterns:</span>\n    $procent = $regexp&lt;\\b([0-9][0-9]?%?)\\b|\\b100%?\\b> </code></pre></div>\n<hr>\n<h3>$entity</h3>\n<p><code class=\"language-text\">$entity&lt;именованная сущность></code> — преобразует в паттерн именованную сущность.</p>\n<p class='warn'><a href=/1.11.1/docs/ru/Patterns/named_entity  >Подробнее об именованных сущностях</a></p>\n</br>\n<h5>Использование в сценарии</h5>\n<p>Объявление именованного паттерна:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">$roamingRegion <span class=\"token operator\">=</span> $entity<span class=\"token operator\">&lt;</span>RoamingRegions<span class=\"token operator\">></span> <span class=\"token operator\">||</span> converter <span class=\"token operator\">=</span> RoamingRegionTagConverter</code></pre></div>\n<p>Использование в сценарии:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span> Проблемы\n            <span class=\"token storageType\">q!:</span> *{$problems * роуминг*}*\n            <span class=\"token storageType\">q!:</span> *{$someProblems * $roamingRegion}*\n            <span class=\"token variableParameter\">script:</span>\n                $temp.messageForOperator = 'Пользователь испытывает проблемы с роумингом';\n            <span class=\"token variableParameter\">a:</span> По этому вопросу Вас может проконсультировать специалист.\n            <span class=\"token variableParameter\">go!:</span> /ПереключениеНаОператора</code></pre></div>\n<p>Здесь <code class=\"language-text\">RoamingRegions</code> — название справочника, <code class=\"language-text\">RoamingRegionTagConverter</code> — название конвертера.</p>\n<p class='tip'>При подобном объявлении именованного паттерна в <code class=\"language-text\">$parseTree</code> появляется элемент <code class=\"language-text\">value</code>, куда обычно записывается id или значение из справочника.</p>\n<p class='warn'>Правило <code class=\"language-text\">$entity</code> записывает в <code class=\"language-text\">value</code> только идентификатор сущности, а список ассоциированных значений содержится в справочнике.</p>\n<hr>\n<h3>$Pattern::Alias</h3>\n<p><code class=\"language-text\">$Pattern::Alias</code> — позволяет задать псевдоним для токена, под которым токен будет помещен в <code class=\"language-text\">$parseTree</code>.</p>\n</br>\n<h5>Использование в сценарии</h5>\n<p>Рассмотрим пример <code class=\"language-text\">$Number::Hour</code>: паттерн <code class=\"language-text\">$Number</code> будет интерпретироваться в <code class=\"language-text\">parseTree</code> как <code class=\"language-text\">Hour</code>.</p>\n<p>Сценарий:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token storageType\">q!:</span> я приду в $Number::Hour</code></pre></div>\n<p>Запрос пользователя:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Я приду в 7</code></pre></div>\n<p>Дерево разбора:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{\n        \"tag\": \"root\",\n        \"pattern\": \"root\",\n        \"text\": \"я приду в 7\",\n        \"words\": [\n            \"я\",\n            \"приду\",\n            \"в\",\n            \"7\"\n        ],\n        \"Hour\": [\n            {\n                \"tag\": \"Hour\",\n                \"pattern\": \"Number\",\n                \"text\": \"7\",\n                \"words\": [\n                    \"7\"\n                ]\n            }\n        ],\n        \"_Hour\": \"7\",\n    }</code></pre></div>\n<p>Дерево разбора без использования псевдонима для сценария <code class=\"language-text\">q!: я приду в $Number</code> имеет вид:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{\n        \"tag\": \"root\",\n        \"pattern\": \"root\",\n        \"text\": \"я приду в 7\",\n        \"words\": [\n            \"я\",\n            \"приду\",\n            \"в\",\n            \"7\"\n        ],\n        \"Number\": [\n            {\n                \"tag\": \"Number\",\n                \"pattern\": \"Number\",\n                \"text\": \"7\",\n                \"words\": [\n                    \"7\"\n                ]\n            }\n        ],\n        \"_Number\": \"7\",\n    }</code></pre></div>\n<p>Практичный прием использования <code class=\"language-text\">$Pattern::Alias</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span>\n    <span class=\"token storageType\">q!:</span> сколько будет $Number::minuend минус $Number::subtrahend\n    <span class=\"token storageType\">q!:</span> вычти $Number::subtrahend из $Number::minuend\n    <span class=\"token variableParameter\">a:</span> <span class=\"token constantCharacter\">{{ $parseTree._minuend - $parseTree._subtrahend }}</span></code></pre></div>\n<p>Здесь смысл <code class=\"language-text\">$Number</code> зависит от положения в запросе: вычитаемое может быть названо первым или вторым числом.</p>\n<hr>\n<h3>(один:1 | два:2 …​)</h3>\n<p><code class=\"language-text\">(один:1 | два:2 …​) </code> — соответствие различных семантик, позволяет задать значение для той или иной фразы. Указанное значение записывается в поле <code class=\"language-text\">value</code> для <code class=\"language-text\">$parseTree</code>, того паттерна, в котором соответствие объявлено.</p>\n</br>\n<h5>Использование в сценарии</h5>\n<p>Объявление паттерна:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\">$price = ((бесплатн*|ноль|0):0|(семь|7):7|(двести|200):200) [руб*]</code></pre></div>\n<p>Сценарий:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token storageType\">q!:</span> {подключить услугу [за] $price}</code></pre></div>\n<p>Запрос пользователя:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Подключить бесплатную услугу</code></pre></div>\n<p>Дерево разбора:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{\n        \"tag\": \"root\",\n        \"pattern\": \"root\",\n        \"text\": \"Подключить бесплатную услугу\",\n        \"words\": [\n            \"подключить\",\n            \"бесплатную\",\n            \"услугу\"\n        ],\n        \"price\": [\n            {\n                \"tag\": \"price\",\n                \"pattern\": \"price\",\n                \"text\": \"бесплатную\",\n                \"words\": [\n                    \"бесплатную\"\n                ],\n                \"value\": \"0\"\n            }\n        ]\n    }</code></pre></div>\n<hr>\n<h3>$repeat</h3>\n<p><code class=\"language-text\">$repeat&lt;именованный паттерн></code> — вложенный паттерн может повторяться в тексте неограниченное количество раз.</p>\n<p class='tip'>Использовать можно только именнованные паттерны. Ошибка:<code class=\"language-text\">Repeat can contain only named pattern like $repeat&lt;$Number>.</code></p>\n</br>\n<h5>Использование в сценарии</h5>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">patterns:</span>\n    $color = (красный/белый/синий/зеленый/желтый/черный)\n\n<span class=\"token keyword\">theme:</span> /\n    <span class=\"token keyword\">state:</span> asd\n        <span class=\"token storageType\">q!:</span> (мой/мои) любимы* цвет* это $repeat&lt;$color> \n        <span class=\"token variableParameter\">if:</span> $parseTree.color.length > 1\n            <span class=\"token variableParameter\">a:</span> Ого! Целых <span class=\"token constantCharacter\">{{ $parseTree.color.length }}</span>\n        <span class=\"token variableParameter\">else:</span>\n            <span class=\"token variableParameter\">a:</span> Почему именно <span class=\"token constantCharacter\">{{ $parseTree._color }}</span>?</code></pre></div>\n<hr>\n<h3>$oneWord</h3>\n<p><code class=\"language-text\">$oneWord</code> — любое слово, число или символ.</p>\n<p>Этот именованный паттерн доступен в любом проекте без объявления.</p>\n</br>\n<h5>Использование в сценарии</h5>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span> Dialog\n    <span class=\"token storageType\">q!:</span> * $you * [меня] * не (понимае*|поняла|поняли) * !\n    <span class=\"token storageType\">q!:</span> [$oneWord] не то\n    <span class=\"token variableParameter\">go!:</span> /CatchAll/CatchALLState</code></pre></div>\n<hr>\n<h3>$nonEmptyGarbage</h3>\n<p><code class=\"language-text\">$nonEmptyGarbage</code> — произвольный текст.</p>\n<p>Отличие от паттерна <code class=\"language-text\">*</code> в том, что текст не может быть пустым, а также знаком препинания.</p>\n<p>Этот именованный паттерн доступен в любом проекте без объявления.</p>\n</br>\n<h5>Использование в сценарии</h5>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\">$Text = * $nonEmptyGarbage * || converter = $converters.textConverter</code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span> Action\n                <span class=\"token storageType\">q:</span> $nonEmptyGarbage\n                <span class=\"token variableParameter\">go!:</span> /NextStep</code></pre></div>","frontmatter":{"title":"","description":null},"headings":[{"value":"Расширенные элементы паттернов"}]}},"pageContext":{"slug":"/docs/ru/Patterns/advanced_patterns/","previous":{"fields":{"slug":"/docs/ru/Patterns/base_patterns/"},"frontmatter":{"title":"","description":null}},"next":{"fields":{"slug":"/docs/ru/Patterns/about_patterns/"},"frontmatter":{"title":"","description":null}}}},
    "staticQueryHashes": ["1209419333"]}