/* Розбирач Мавки */

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

взяти визначення мавка/машина;
взяти визначення КД;

простір мавка {
  простір розбирач {
    структура можливо<Т>;

    структура можливо<Т> {
      заповнено: логічне;
      значення: Т;
    }

    структура ПомилкаРозборуНаЗнаки {
      позиція_в_тексті: природне;
      рядок: природне;
      стовпець: природне;
    }

    структура ПомилкаРозборуНаСполуки {
      позиція_знаку: природне;
      рядок: природне;
      стовпець: природне;
    }

    стала ВидЗнакуАбо = 0;
    стала ВидЗнакуБільше = 1;
    стала ВидЗнакуВзяти = 2;
    стала ВидЗнакуВласна = 3;
    стала ВидЗнакуВпасти = 4;
    стала ВидЗнакуВернути = 8;
    стала ВидЗнакуДія = 9;
    стала ВидЗнакуДати = 10;
    стала ВидЗнакуЄ = 11;
    стала ВидЗнакуЗловити = 13;
    стала ВидЗнакуІ = 14;
    стала ВидЗнакуІнакше = 15;
    стала ВидЗнакуКінець = 17;
    стала ВидЗнакуМодуль = 18;
    стала ВидЗнакуМенше = 19;
    стала ВидЗнакуНе = 22;
    стала ВидЗнакуПоки = 23;
    стала ВидЗнакуПеребрати = 26;
    стала ВидЗнакуРівно = 27;
    стала ВидЗнакуСтруктура = 28;
    стала ВидЗнакуСпробувати = 29;
    стала ВидЗнакуТривала = 31;
    стала ВидЗнакуЦикл = 32;
    стала ВидЗнакуЧекати = 34;
    стала ВидЗнакуЯк = 35;
    стала ВидЗнакуЯкщо = 36;

    стала ВидЗнакуСимволРівно = 37;
    стала ВидЗнакуСимволБільше = 38;
    стала ВидЗнакуСимволМенше = 39;
    стала ВидЗнакуСимволКрапка = 40;
    стала ВидЗнакуСимволПлюс = 41;
    стала ВидЗнакуСимволМінус = 42;
    стала ВидЗнакуСимволПомножити = 43;
    стала ВидЗнакуСимволПоділити = 44;
    стала ВидЗнакуСимволЗалишку = 45;
    стала ВидЗнакуСимволВиключнеАбо = 46;
    стала ВидЗнакуСимволІ = 47;
    стала ВидЗнакуСимволАбо = 48;
    стала ВидЗнакуСимволВідкритаДужка = 49;
    стала ВидЗнакуСимволЗакритаДужка = 50;
    стала ВидЗнакуСимволКвадратнаВідкритаДужка = 51;
    стала ВидЗнакуСимволКвадратнаЗакритаДужка = 52;
    стала ВидЗнакуСимволЗнакПитання = 53;
    стала ВидЗнакуСимволДвокрапка = 54;
    стала ВидЗнакуСимволДвійковеНе = 55;
    стала ВидЗнакуСимволОднолапка = 56;
    стала ВидЗнакуСимволДволапка = 57;
    стала ВидЗнакуСимволЗнакОклику = 58;
    стала ВидЗнакуСимволКома = 59;
    стала ВидЗнакуСимволМіжряд = 60;

    стала ВидЗнакуЧисло = 61;
    стала ВидЗнакуСимвол = 63;
    стала ВидЗнакуТекст = 64;
    стала ВидЗнакуКоментар = 66;
    стала ВидЗнакуБагаторядковийКоментар = 67;
    стала ВидЗнакуІдентифікатор = 68;

    стала ВидЗнакуПочатокЗбитогоТексту = 69;
    стала ВидЗнакуРоздільникЗбитогоТексту = 70;
    стала ВидЗнакуКінецьЗбитогоТексту = 71;
    стала ВидЗнакуЧастинаЗбитогоТексту = 72;
    стала ВидЗнакуСимволФігурнаВідкритаДужка = 73;
    стала ВидЗнакуСимволФігурнаЗакритаДужка = 74;

    стала ВидЗнакуКлас = 75;

    стала ВидЗнакуКІНЕЦЬСЛІВ = 100;

    стала КД_РОЗРИВ = КД::символи::Міжряд;
    стала КД_ПРОПУСК = КД::символи::Пропуск;
    стала КД_ДВОЛАПКА = КД::символи::Дволапка;
    стала КД_ВІДСОТОК = КД::символи::Відсоток;
    стала КД_ЛАПКА = КД::символи::Однолапка;
    стала КД_ВІДКРИТА_ДУЖКА = КД::символи::Відкрита_дужка;
    стала КД_ЗАКРИТА_ДУЖКА = КД::символи::Закрита_дужка;
    стала КД_КРАПКА = КД::символи::Крапка;
    стала КД_0 = КД::символи::Нуль;
    стала КД_1 = КД::символи::Один;
    стала КД_2 = КД::символи::Два;
    стала КД_3 = КД::символи::Три;
    стала КД_4 = КД::символи::Чотири;
    стала КД_5 = КД::символи::Пʼять;
    стала КД_6 = КД::символи::Шість;
    стала КД_7 = КД::символи::Сім;
    стала КД_8 = КД::символи::Вісім;
    стала КД_9 = КД::символи::Девʼять;
    стала КД_ОБЕРНЕНА_ПОХИЛА = КД::символи::Обернена_похила;
    стала КД_ПІДРИСКА = КД::символи::Підриска;
    стала КД_д = КД::символи::Мала_буква_д;
    стала КД_р = КД::символи::Мала_буква_р;
    стала КД_ДІЯ = КД::символи::Дія;
    стала КД_ХРЕСТИК = КД::символи::Хрестик;
    стала КД_РИСКА = КД::символи::Риска;
    стала КД_мала_буква_е = КД::символи::Мала_буква_е;

    структура ПозиціяЗнаки {
      позиція_в_тексті: природне;
      рядок: природне;
      стовпець: природне;
    }

    структура Знак {
      вид: природне;
      позиція_початку: ПозиціяЗнаки;
      позиція_кінця: ПозиціяЗнаки;
    }

    структура Знаки {
      розмір: природне;
      дані: *Знак;
    }

    стала ВидСполукиНіщо = 0;
    стала ВидСполукиВизначити = 1;
    стала ВидСполукиЗвернутись = 2;
    стала ВидСполукиОтриматиВластивість = 3;
    стала ВидСполукиОтриматиЕлемент = 5;
    стала ВидСполукиЗмінитиВластивість = 6;
    стала ВидСполукиЗмінитиЕлемент = 8;
    стала ВидСполукиВиконати = 9;
    стала ВидСполукиДія = 12;
    стала ВидСполукиКлас = 13;
    стала ВидСполукиЧисло = 18;
    стала ВидСполукиТекст = 19;
    стала ВидСполукиОперація = 21;
    стала ВидСполукиЯкщо = 22;
    стала ВидСполукиПоки = 23;
    стала ВидСполукиВернути = 24;
    стала ВидСполукиЗначенняЯкщо = 27;
    стала ВидСполукиСамоОперація = 29;
    стала ВидСполукиВзяти = 33;
    стала ВидСполукиСпробувати = 34;
    стала ВидСполукиВпасти = 35;
    стала ВидСполукиДати = 36;
    стала ВидСполукиМодуль = 37;
    стала ВидСполукиСписок = 38;
    стала ВидСполукиСловник = 39;
    стала ВидСполукиСимвол = 40;
    стала ВидСполукиПеребрати = 41;
    стала ВидСполукиЦикл = 42;
    стала ВидСполукиВизначитиЗзовні = 43;
    стала ВидСполукиВічнийЦикл = 45;
    стала ВидСполукиЧекати = 49;
    стала ВидСполукиДіапазон = 50;
    стала ВидСполукиЗбитийТекст = 51; // 52

    стала ВидОпераціїМноження = 1;
    стала ВидОпераціїДілення = 2;
    стала ВидОпераціїМодуль = 3;
    стала ВидОпераціїДодавання = 4;
    стала ВидОпераціїВіднімання = 5;
    стала ВидОпераціїЗсувВліво = 6;
    стала ВидОпераціїЗсувВправо = 7;
    стала ВидОпераціїЗсувВправоЗнаковий = 8;
    стала ВидОпераціїМенше = 9;
    стала ВидОпераціїБільше = 10;
    стала ВидОпераціїМеншеРівне = 11;
    стала ВидОпераціїБільшеРівне = 12;
    стала ВидОпераціїРівне = 13;
    стала ВидОпераціїНерівне = 14;
    стала ВидОпераціїДІ = 15;
    стала ВидОпераціїВАБО = 16;
    стала ВидОпераціїДАБО = 17;
    стала ВидОпераціїІ = 18;
    стала ВидОпераціїАБО = 19;
    стала ВидОпераціїДіленняНаціло = 20;
    стала ВидОпераціїПіднесенняДоСтепеня = 21;
    стала ВидОпераціїЄ = 24;
    стала ВидОпераціїНеЄ = 25;

    стала ВидСамоОпераціїЛогічнеНі = 1;
    стала ВидСамоОпераціїДвійковеНі = 2;
    стала ВидСамоОпераціїПлюс = 3;
    стала ВидСамоОпераціїМінус = 4;

    структура Місцезнаходження;
    структура Сполука;
    структура Сполуки;

    структура Ідентифікатор;
    структура Параметр;
    структура Аргумент;
    структура ЕлементДати;
    структура ЕлементВзяти;
    структура ЕлементСловника;

    структура ДаніСполукиВизначити;
    структура ДаніСполукиЗвернутись;
    структура ДаніСполукиОтриматиВластивість;
    структура ДаніСполукиОтриматиЕлемент;
    структура ДаніСполукиЗмінитиВластивість;
    структура ДаніСполукиЗмінитиЕлемент;
    структура ДаніСполукиВиконати;
    структура ДаніСполукиДія;
    структура ДаніСполукиКлас;
    структура ДаніСполукиЧисло;
    структура ДаніСполукиТекст;
    структура ДаніСполукиСимвол;
    структура ДаніСполукиОперація;
    структура ДаніСполукиЯкщо;
    структура ДаніСполукиПоки;
    структура ДаніСполукиПеребрати;
    структура ДаніСполукиЦикл;
    структура ДаніСполукиВічнийЦикл;
    структура ДаніСполукиВернути;
    структура ДаніСполукиЗначенняЯкщо;
    структура ДаніСполукиСамоОперація;
    структура ДаніСполукиВзяти;
    структура ДаніСполукиСпробувати;
    структура ДаніСполукиВпасти;
    структура ДаніСполукиДати;
    структура ДаніСполукиМодуль;
    структура ДаніСполукиСписок;
    структура ДаніСполукиСловник;
    структура ДаніСполукиВизначитиЗзовні;
    структура ДаніСполукиЧекати;
    структура ДаніСполукиДіапазон;
    структура ДаніСполукиЗбитийТекст;

    структура Сполуки {
      розмір: природне;
      дані: **Сполука;
    }

    структура Місцезнаходження {
      позиція_знаку: природне;
    }

    структура Ідентифікатор {
      позиція_знаку: природне;
    }

    структура Тип {
      кількість_гілок: природне;
      сполуки: **Сполука;
    }

    структура Параметр {
      ідентифікатор: Ідентифікатор;
      тип: можливо<Тип>;
      значення: *Сполука;
      місцезнаходження: Місцезнаходження;
    }

    структура Аргумент {
      ідентифікатор: можливо<Ідентифікатор>;
      значення: *Сполука;
      місцезнаходження: Місцезнаходження;
    }

    структура ЕлементДати {
      ідентифікатор: Ідентифікатор;
      ідентифікатор_як: можливо<Ідентифікатор>;
      місцезнаходження: Місцезнаходження;
    }

    структура ЕлементВзяти {
      ідентифікатор: Ідентифікатор;
      ідентифікатор_як: можливо<Ідентифікатор>;
      місцезнаходження: Місцезнаходження;
    }

    структура ЕлементСловника {
      ключ: *Сполука;
      значення: *Сполука;
      місцезнаходження: Місцезнаходження;
    }

    структура ДаніСполукиВизначити {
      ідентифікатор: Ідентифікатор;
      значення: *Сполука;
    }

    структура ДаніСполукиЗвернутись {
      ідентифікатор: Ідентифікатор;
    }

    структура ДаніСполукиОтриматиВластивість {
      предмет: *Сполука;
      ідентифікатор: Ідентифікатор;
    }

    структура ДаніСполукиОтриматиЕлемент {
      предмет: *Сполука;
      ключ: *Сполука;
    }

    структура ДаніСполукиЗмінитиВластивість {
      предмет: *Сполука;
      ідентифікатор: Ідентифікатор;
      значення: *Сполука;
    }

    структура ДаніСполукиЗмінитиЕлемент {
      предмет: *Сполука;
      ключ: *Сполука;
      значення: *Сполука;
    }

    структура ДаніСполукиВиконати {
      предмет: *Сполука;
      кількість_аргументів: природне;
      аргументи: *Аргумент;
    }

    структура ДаніСполукиДія {
      тривала: логічне;
      власна: логічне;
      клас: *Сполука;
      ідентифікатор: можливо<Ідентифікатор>;
      кількість_параметрів: природне;
      параметри: *Параметр;
      тип_результату: можливо<Тип>;
      тіло: Сполуки;
    }

    структура ДаніСполукиКлас {
      ідентифікатор: можливо<Ідентифікатор>;
      предок: *Сполука;
      кількість_параметрів: природне;
      параметри: *Параметр;
      методи: Сполуки;
    }

    структура ДаніСполукиЧисло {
      позиція_знаку: природне;
    }

    структура ДаніСполукиТекст {
      ідентифікатор: можливо<Ідентифікатор>;
      позиція_знаку: природне;
    }

    структура ДаніСполукиСимвол {
      ідентифікатор: можливо<Ідентифікатор>;
      позиція_знаку: природне;
    }

    структура ДаніСполукиОперація {
      ліво: *Сполука;
      операція: природне;
      право: *Сполука;
    }

    структура ДаніСполукиЯкщо {
      умова: *Сполука;
      тіло: Сполуки;
      тіло_інакше: Сполуки;
    }

    структура ДаніСполукиПоки {
      умова: *Сполука;
      тіло: Сполуки;
    }

    структура ДаніСполукиПеребрати {
      предмет: *Сполука;
      ідентифікатор: можливо<Ідентифікатор>;
      тіло: Сполуки;
    }

    структура ДаніСполукиЦикл {
      старт: Сполуки;
      умова: *Сполука;
      тіло: Сполуки;
      ітерація: Сполуки;
    }

    структура ДаніСполукиВічнийЦикл {
      тіло: Сполуки;
    }

    структура ДаніСполукиВернути {
      значення: *Сполука;
    }

    структура ДаніСполукиЗначенняЯкщо {
      умова: *Сполука;
      значення_так: *Сполука;
      значення_ні: *Сполука;
    }

    структура ДаніСполукиСамоОперація {
      операція: природне;
      предмет: *Сполука;
    }

    структура ДаніСполукиВзяти {
      тип: можливо<Ідентифікатор>;
      довжина_шляху: природне;
      шлях: *Ідентифікатор;
      ідентифікатор_як: можливо<Ідентифікатор>;
      кількість_елементів: природне;
      елементи: *ЕлементВзяти;
    }

    структура ДаніСполукиСпробувати {
      тіло: Сполуки;
      ідентифікатор_зловити: можливо<Ідентифікатор>;
      тіло_зловити: Сполуки;
    }

    структура ДаніСполукиВпасти {
      значення: *Сполука;
    }

    структура ДаніСполукиДати {
      кількість_елементів: природне;
      елементи: *ЕлементДати;
    }

    структура ДаніСполукиМодуль {
      ідентифікатор: можливо<Ідентифікатор>;
      тіло: Сполуки;
    }

    структура ДаніСполукиСписок {
      кількість_елементів: природне;
      елементи: **Сполука;
    }

    структура ДаніСполукиСловник {
      кількість_елементів: природне;
      елементи: *ЕлементСловника;
    }

    структура ДаніСполукиВизначитиЗзовні {
      ідентифікатор: Ідентифікатор;
      значення: *Сполука;
    }

    структура ДаніСполукиЧекати {
      значення: *Сполука;
    }

    структура ДаніСполукиДіапазон {
      від: *Сполука;
      до: *Сполука;
      включно: логічне;
    }

    структура ДаніСполукиЗбитийТекст {
      ідентифікатор: можливо<Ідентифікатор>;
      кількість_гілок: природне;
      сполуки: **Сполука;
    }

    структура Сполука {
      вид: природне;
      дані: ДаніСполукиВизначити
          | ДаніСполукиЗвернутись
          | ДаніСполукиОтриматиВластивість
          | ДаніСполукиОтриматиЕлемент
          | ДаніСполукиЗмінитиВластивість
          | ДаніСполукиЗмінитиЕлемент
          | ДаніСполукиВиконати
          | ДаніСполукиДія
          | ДаніСполукиКлас
          | ДаніСполукиЧисло
          | ДаніСполукиТекст
          | ДаніСполукиСимвол
          | ДаніСполукиОперація
          | ДаніСполукиЯкщо
          | ДаніСполукиПоки
          | ДаніСполукиПеребрати
          | ДаніСполукиЦикл
          | ДаніСполукиВічнийЦикл
          | ДаніСполукиВернути
          | ДаніСполукиЗначенняЯкщо
          | ДаніСполукиСамоОперація
          | ДаніСполукиВзяти
          | ДаніСполукиСпробувати
          | ДаніСполукиВпасти
          | ДаніСполукиДати
          | ДаніСполукиМодуль
          | ДаніСполукиСписок
          | ДаніСполукиСловник
          | ДаніСполукиВизначитиЗзовні
          | ДаніСполукиЧекати
          | ДаніСполукиДіапазон
          | ДаніСполукиЗбитийТекст;
      місцезнаходження: Місцезнаходження;
    }

    // потім:
    //   - обрахунок стовпця
    //   - виправити місцезнаходження гілок

    дія розібрати_на_знаки(М: *Машина,
                                   значення_кд: кд,
                                   вихід: *Знаки,
                                   вихід_помилки: *ПомилкаРозборуНаЗнаки): логічне;
    дія звільнити_знаки(М: *Машина,
                                знаки: Знаки);
    дія звільнити_помилку_розбору_на_знаки(М: *Машина,
                                                   помилка: ПомилкаРозборуНаЗнаки);
    дія отримати_помилку_розбору_на_знаки(М: *Машина,
                                                  помилка: ПомилкаРозборуНаЗнаки, вихід: *кд): логічне;
    дія отримати_рядок_помилки_розбору_на_знаки(М: *Машина,
                                                        помилка: ПомилкаРозборуНаЗнаки): природне;
    дія отримати_стовпець_помилки_розбору_на_знаки(М: *Машина,
                                                           помилка: ПомилкаРозборуНаЗнаки): природне;

    дія отримати_значення_ідентифікатора(значення_кд: кд,
                                                 знаки: Знаки,
                                                 ідентифікатор: Ідентифікатор): кд;
    дія отримати_значення_знаку(значення_кд: кд,
                                        знаки: Знаки,
                                        знак: Знак): кд;
    дія отримати_значення_тексту(значення_кд: кд,
                                         знаки: Знаки,
                                         знак: Знак): кд;
    дія отримати_значення_символу(значення_кд: кд,
                                          знаки: Знаки,
                                          знак: Знак): кд;
    дія отримати_рядок_з_місцезнаходження(значення_кд: кд,
                                                  знаки: Знаки,
                                                  місцезнаходження: Місцезнаходження): природне;
    дія отримати_стовпець_з_місцезнаходження(значення_кд: кд,
                                                     знаки: Знаки,
                                                     місцезнаходження: Місцезнаходження): природне;

    дія розібрати_знаки_на_сполуки(М: *Машина,
                                           значення_кд: кд,
                                           знаки: Знаки,
                                           вихід: *Сполуки,
                                           вихід_помилки: *ПомилкаРозборуНаСполуки): логічне;
    дія звільнити_сполуки(М: *Машина,
                                  сполуки: Сполуки);
    дія звільнити_помилку_розбору_на_сполуки(М: *Машина,
                                                     помилка: ПомилкаРозборуНаСполуки);
    дія отримати_помилку_розбору_на_сполуки(М: *Машина,
                                                    помилка: ПомилкаРозборуНаСполуки,
                                                    вихід: *кд): логічне;
    дія отримати_рядок_помилки_розбору_на_сполуки(М: *Машина,
                                                          помилка: ПомилкаРозборуНаСполуки): природне;
    дія отримати_стовпець_помилки_розбору_на_сполуки(М: *Машина,
                                                             помилка: ПомилкаРозборуНаСполуки): природне;
  }
}