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

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

  внутрішня дія обробити_падіння(
    М: *Машина,
    інформація_падіння: ІнформаціяПадіння,
  ) {
    надрукувати_інформацію_падіння(
      М,
      інформація_падіння
    );
  }

  внутрішня дія обробник_прочитання(
    сирий_текст: кд,
    кінець_файлу: логічне,
    аргумент: адреса,
  ) {
    змінна розмова = аргумент як *Розмова;
    змінна М = розмова.М;

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

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

    змінна успіх = ні;
    змінна знаки: розбирач::Знаки;
    змінна помилка_розбору_на_знаки: розбирач::ПомилкаРозборуНаЗнаки;
    змінна сполуки: розбирач::Сполуки;
    змінна помилка_розбору_на_сполуки: розбирач::ПомилкаРозборуНаСполуки;
    змінна скомпільований_код: *ПредметКоду = пусто;
    змінна помилка_компілювання: перекладач::ПомилкаКомпілювання;
    змінна інформація_падіння: ІнформаціяПадіння;

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

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

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

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

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

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

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

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

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

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

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

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

  дія почати_розмову(
    М: *Машина,
  ) {
    якщо М.розмова != пусто {
      вернути; // потім: помилка?
    }

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

    змінна середовище = створити_середовище(
      М,
      М.глобальне_середовище
    );
    середовище.кількість_запозичень += 1;

    М.розмова = виділити<Розмова>(М, 1);
    М.розмова.М = М;
    М.розмова.перед = М.створити_текст("- ");
    М.розмова.предмет_модуля = предмет_модуля;
    М.розмова.середовище = середовище;

    читати_ввід_асинхронно(
      М,
      М.розмова.перед,
      обробник_прочитання,
      М.розмова,
      так
    );
  }
}