/* Перекладач Мавки */

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

простір мавка {
  простір перекладач {
    структура ПомилкаПерекладу {
      позиція_в_тексті: природне;
      рядок: природне;
      стовпець: природне;
      повідомлення: кд; // має звільнити той хто оброляє помилку
    }

    синонім ДіяСтворитиКод = (М: адреса<Машина>, шлях: невідома_адреса) -> невідома_адреса;
    синонім ДіяПокластиКонстантуЧисла = (М: адреса<Машина>, код: невідома_адреса, значення: д64) -> п32;
    синонім ДіяПокластиКонстантуТексту = (М: адреса<Машина>, код: невідома_адреса, значення: кд) -> п32;
    синонім ДіяПокластиКонстантуКоду = (М: адреса<Машина>, код: невідома_адреса, значення: невідома_адреса) -> п32;
    синонім ДіяПокластиВказівку = (М: адреса<Машина>, код: невідома_адреса, рядок: п32, вид: п8) -> п32;
    синонім ДіяПокластиВказівкуЗАргументом = (М: адреса<Машина>, код: невідома_адреса, рядок: п32, вид: п8, аргумент: п32) -> п32;
    синонім ДіяПокластиВказівкуЗДвомаАргументами = (М: адреса<Машина>, код: невідома_адреса, рядок: п32, вид: п8, аргумент1: п32, аргумент2: п32) -> п32;
    синонім ДіяЗмінитиАргументВказівки = (М: адреса<Машина>, код: невідома_адреса, позиція_виду_вказівки: п32, позиція_аргумента_вказівки: п32, новий_аргумент: п32) -> ніщо;
    синонім ДіяОтриматиРозмірВказівок = (М: адреса<Машина>, код: невідома_адреса) -> п32;
    синонім ДіяОтриматиШляхКоду = (М: адреса<Машина>, код: невідома_адреса) -> невідома_адреса;

    структура Дії {
      створити_код: ДіяСтворитиКод;
      покласти_константу_числа: ДіяПокластиКонстантуЧисла;
      покласти_константу_тексту: ДіяПокластиКонстантуТексту;
      покласти_константу_коду: ДіяПокластиКонстантуКоду;
      покласти_вказівку: ДіяПокластиВказівку;
      покласти_вказівку_з_аргументом: ДіяПокластиВказівкуЗАргументом;
      покласти_вказівку_з_двома_аргументами: ДіяПокластиВказівкуЗДвомаАргументами;
      змінити_аргумент_вказівки: ДіяЗмінитиАргументВказівки;
      отримати_розмір_вказівок: ДіяОтриматиРозмірВказівок;
      отримати_шлях_коду: ДіяОтриматиШляхКоду;
    }

    дія перекласти(
      М: адреса<Машина>,
      шлях: невідома_адреса,
      сирий_текст: кд,
      знаки: розбирач::Знаки,
      здійснимі: розбирач::Сполуки,
      дії: Дії,
      вихід_коду: адреса<невідома_адреса>,
      вихід_помилки: адреса<ПомилкаПерекладу>
    ) -> логічне;
  }

  дія перекласти_в_код(
    М: адреса<Машина>,
    шлях: адреса<ПредметДаних>,
    сирий_текст: кд,
    знаки: розбирач::Знаки,
    здійснимі: розбирач::Сполуки,
    вихід_коду: адреса<адреса<ПредметКоду>>,
    вихід_помилки: адреса<перекладач::ПомилкаПерекладу>
  ) -> логічне;

  дія перекласти_у_файл_коду(
    М: адреса<Машина>,
    сирий_текст: кд,
    знаки: розбирач::Знаки,
    здійснимі: розбирач::Сполуки,
    вихід_розміру: адреса<природне>,
    вихід_даних: адреса<памʼять<п8>>,
    вихід_помилки: адреса<перекладач::ПомилкаПерекладу>
  ) -> логічне;
}