IgorPI
@IgorPI

Формат файла описывающий действия?

Добрый вечер коллеги.

Вопросы теоретические.
Каким образом можно анализировать данный формат и выполнять те или иные действия?

Например:
spoiler
{
  "$kind": "Microsoft.AdaptiveDialog",
  "$designer": {
    "id": "433224",
    "name": "EchoBot-0"
  },
  "autoEndDialog": true,
  "defaultResultProperty": "dialog.result",
  "triggers": [
    {
      "$kind": "Microsoft.OnUnknownIntent",
      "$designer": {
        "id": "821845"
      },
      "actions": [
        {
          "$kind": "Microsoft.SendActivity",
          "$designer": {
            "id": "003038"
          },
          "activity": "${SendActivity_003038()}"
        }
      ]
    },
    {
      "$kind": "Microsoft.OnConversationUpdateActivity",
      "$designer": {
        "id": "376720"
      },
      "actions": [
        {
          "$kind": "Microsoft.Foreach",
          "$designer": {
            "id": "518944",
            "name": "Loop: for each item"
          },
          "itemsProperty": "turn.Activity.membersAdded",
          "actions": [
            {
              "$kind": "Microsoft.IfCondition",
              "$designer": {
                "id": "641773",
                "name": "Branch: if/else"
              },
              "condition": "string(dialog.foreach.value.id) != string(turn.Activity.Recipient.id)",
              "actions": [
                {
                  "$kind": "Microsoft.SendActivity",
                  "$designer": {
                    "id": "859266",
                    "name": "Send a response"
                  },
                  "activity": "${SendActivity_Welcome()}"
                }
              ]
            }
          ]
        }
      ]
    },
    {
      "$kind": "Microsoft.OnActivity",
      "$designer": {
        "id": "pv7CmQ"
      },
      "actions": [
        {
          "$kind": "Microsoft.SendActivity",
          "$designer": {
            "id": "hUW5JC"
          },
          "activity": "${SendActivity_hUW5JC()}"
        },
        {
          "$kind": "Microsoft.TextInput",
          "$designer": {
            "id": "yXxTFP"
          },
          "disabled": false,
          "maxTurnCount": 3,
          "alwaysPrompt": false,
          "allowInterruptions": false,
          "prompt": "${TextInput_Prompt_yXxTFP()}",
          "property": "user.name"
        },
        {
          "$kind": "Microsoft.IfCondition",
          "$designer": {
            "id": "HCfN1O"
          },
          "condition": "user.name.length > 10",
          "actions": [
            {
              "$kind": "Microsoft.SendActivity",
              "$designer": {
                "id": "LCUNef"
              },
              "activity": "${SendActivity_LCUNef()}"
            }
          ],
          "elseActions": [
            {
              "$kind": "Microsoft.SendActivity",
              "$designer": {
                "id": "hDfr7K"
              },
              "activity": "${SendActivity_hDfr7K()}"
            }
          ]
        }
      ]
    }
  ],
  "generator": "echobot-0.lg",
  "$schema": "https://raw.githubusercontent.com/microsoft/BotFramework-Composer/stable/Composer/packages/server/schemas/sdk.schema"
}


Это пример из Microsoft bot framework
Как бы например выгладил обработчик одного действия, или группы действий?

Под обработчиком я подразумеваю, специальную софтину, которая считывает определённый формат и выполняет действия.
  • Вопрос задан
  • 134 просмотра
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Файл, похоже, в формате json. Гуглите "json <ваш язык прогаммирования>", чтобы найти библиотеку для парсинга этого формата. Потом надо обрабатывать семантику языка.

Поля "$designer" похоже можно игнорировать. Дальше у каждого важного элемента есть поле "$kind". Читайте описание в схеме, которая по ссылке в конце файла "https://raw.githubusercontent.com/microsoft/BotFra..."

Фактически это задана программа на весьма неудобном для человека языке программирования. Каждое действие - это узел в json. Он имеет kind, который определяет, что это за инструкция и всякие дополнительные поля, которые описывают параметры этой инструкции. Типа инструкция ветвления содержит команды для обеих веток исполнения и условие. В этом языке, похоже есть циклы, встроенные функции. Похоже, пользователь может задать какие-то свои функции, вызов которых вам тоже придется обрабатывать.

После разбора файла json-парсером, надо писать обработку каждого типа действия, которое есть в этом файле. Это будет полноценный интерпретатор этого странного языка программирования.

Например, "Microsoft.ForEach". Поищите эту строчку в схеме, она будет встречаться 6 раз. Интересное место №3 - там расписано, какие поля могут быть у этого типа действия. Там куча очевидных полей вроде designer и kind, но есть нужное нам "actions". Описание говорит, что это массив действий, которые будут вызваны для всех элементов списка. Т.е. встретив в файле узел foreach, надо взять поле "actions" и применить все действия оттуда ко всем элементам входного списка.

И так надо по каждому "kind" действия писать обработку. Проще всего его будет писать на каком-то интерпретируемом языке, где есть что-то типа eval(). Потому что, например, в IfCondition есть поле condition, которое придется вычислять. Надо будет поддерживать какой-то словарь для всех переменных, локальных и глобальных, поддерживать стек вызова и словарь всех известных пользовательских подпрограм.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы