// 2025-2026 Богданович Давид Когут Прихожденко (кдб.дійсність.укр)

взяти визначення мавка/пристрій;

простір мавка {
  простір пристрій {
    дія почати_розмову(
      М: *Машина,
      шлях_до_теки_модулів: *ПредметДаних,
      шлях_до_стандартного_вводу: *ПредметДаних
    ) {
      змінна сирий_текст: кд;
      змінна успіх = ні;
      змінна зупинено = ні;
      змінна перед = "- ";
      змінна знаки: розбирач::Знаки;
      змінна помилка_розбору_на_знаки: розбирач::ПомилкаРозборуНаЗнаки;
      змінна сполуки: розбирач::Сполуки;
      змінна помилка_розбору_на_сполуки: розбирач::ПомилкаРозборуНаСполуки;
      змінна перекладений_код: *ПредметКоду = пусто;
      змінна помилка_перекладу: перекладач::ПомилкаПерекладу;
      змінна інформація_падіння: ІнформаціяПадіння;
      змінна кінець_файлу = природне(ні);

      змінна предмет_модуля = створити_модуль(
        М,
        створити_текст(М, "розмова")
      );

      змінна дійсність = створити_дійсність(
        М,
        М.глобальна_дійсність
      );

      поки не зупинено {
    крок_початок:
        успіх = пристрій_мавки_читати_кд(
          перед.розмір,
          перед.дані,
          сирий_текст.розмір::адреса,
          сирий_текст.дані::адреса,
          природне(так),
          кінець_файлу::адреса
        );

        якщо не успіх {
          змінна помилка = "Помилка читання входу розмови.";
          пристрій_мавки_надрукувати_кд(помилка.розмір, помилка.дані);
          стрибнути крок_початок;
        }

        якщо кінець_файлу {
          зупинено = так;
          стрибнути крок_кінець;
        }

        якщо сирий_текст.розмір == 0 {
          стрибнути крок_початок;
        }

        успіх = розбирач::розібрати_на_знаки(
          М,
          сирий_текст,
          знаки::адреса,
          помилка_розбору_на_знаки::адреса
        );

        якщо не успіх {
          змінна рядок = розбирач::отримати_рядок_помилки_розбору_на_знаки(
            М,
            помилка_розбору_на_знаки
          );
          змінна помилка = "Не вдалось розібрати текст входу розмови.";
          пристрій_мавки_надрукувати_кд(помилка.розмір, помилка.дані);
          стрибнути крок_початок;
        }

        успіх = розбирач::розібрати_знаки_на_сполуки(
          М,
          сирий_текст,
          знаки,
          сполуки::адреса,
          помилка_розбору_на_сполуки::адреса
        );

        якщо не успіх {
          змінна рядок = розбирач::отримати_рядок_помилки_розбору_на_сполуки(
            М,
            помилка_розбору_на_сполуки
          );
          змінна помилка = "Не вдалось розібрати знаки входу розмови.";
          пристрій_мавки_надрукувати_кд(помилка.розмір, помилка.дані);
          стрибнути крок_початок;
        }

        успіх = перекласти_в_код(
          М,
          шлях_до_стандартного_вводу,
          сирий_текст,
          знаки,
          сполуки,
          перекладений_код::адреса,
          помилка_перекладу::адреса
        );

        якщо не успіх {
          змінна помилка = "Не вдалось перекласти сполуки на код.";
          пристрій_мавки_надрукувати_кд(помилка.розмір, помилка.дані);
          стрибнути крок_початок;
        }

        змінна предмет_дії = створити_дію(
          М,
          дійсність,
          створити_текст(М, "розмова"),
          М.пуста_послідовність,
          пусто,
          перекладений_код,
          шлях_до_теки_модулів
        );

        змінна розмір_історії = М.історія_здійснення.розмір;
        змінна розмір_накопичувача_значень = М.накопичувач_значень.розмір;

        змінна елемент_історії = покласти_в_історію_здійснення(
          М,
          дійсність,
          ПРЕДМЕТ(предмет_модуля),
          предмет_дії,
          Задіяні { ВидЗадіяних2, 0, пусто, 0 },
          Місцезнаходження { шлях_до_стандартного_вводу, 0 }
        );

        змінна результат = виконати_код(
          М,
          М.накопичувач_значень::адреса,
          елемент_історії.спроби::адреса,
          дійсність,
          ПРЕДМЕТ(предмет_модуля),
          перекладений_код,
          0,
          предмет_дії.шлях_до_теки_модулів
        );

        якщо отримати_інформацію_падіння(М, інформація_падіння::адреса) {
          пристрій::надрукувати_інформацію_падіння(
            М,
            інформація_падіння
          );

          знищити_інформацію_падіння(М, інформація_падіння);

          вимкнути_стан_падіння(М);
        } інакше {
          надрукувати_значення(М, результат, 2, 0);
        }

        видалити_з_історії_здійснення(М, М.історія_здійснення.розмір - розмір_історії);
        М.накопичувач_значень.розмір = розмір_накопичувача_значень;

    крок_кінець:
      }
    }
  }
}