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

взяти визначення мавка/машина;
взяти визначення мавка/розбирач;
взяти визначення мавка/перекладач;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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