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

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

простір мавка {
  внутрішня дія КД_виділити_сиру_памʼять(система: *КД::Система, розмір: природне) -> *п8 {
    змінна М = система.дані як *Машина;
    вернути виділити<п8>(М, розмір);
  }

  внутрішня дія КД_перевиділити_сиру_памʼять(система: *КД::Система, значення: *п8, новий_розмір: природне) -> *п8 {
    змінна М = система.дані як *Машина;
    вернути перевиділити<п8>(М, значення, новий_розмір);
  }

  внутрішня дія КД_звільнити_сиру_памʼять(система: *КД::Система, значення: адреса) {
    змінна М = система.дані як *Машина;
    звільнити(М, значення);
  }

  дія перекодувати_ю8_в_кд(М: *Машина, значення: ю8, вихід: *кд, вихід_позиції_помилки: *природне) -> логічне {
    змінна система_КД = КД::Система {
      дані = М,
      виділити_сиру_памʼять = КД_виділити_сиру_памʼять,
      звільнити_сиру_памʼять = КД_звільнити_сиру_памʼять,
      перевиділити_сиру_памʼять = КД_перевиділити_сиру_памʼять
    };

    вернути КД::перекодувати_з_ю8(
      система_КД::адреса,
      значення,
      ні,
      так,
      вихід,
      вихід_позиції_помилки
    );
  }

  дія перекодувати_кд_в_ю8(М: *Машина, значення: кд, вихід: *ю8, вихід_позиції_помилки: *природне) -> логічне {
    змінна система_КД = КД::Система {
      дані = М,
      виділити_сиру_памʼять = КД_виділити_сиру_памʼять,
      звільнити_сиру_памʼять = КД_звільнити_сиру_памʼять,
      перевиділити_сиру_памʼять = КД_перевиділити_сиру_памʼять
    };

    вернути КД::перекодувати_в_ю8(
      система_КД::адреса,
      значення,
      так,
      вихід,
      вихід_позиції_помилки
    );
  }

  дія розібрати_число_з_кд(М: *Машина, значення: кд, вихід: *р64) -> логічне {
    змінна відʼємне = ні;
    змінна результат = р64(0.0);
    змінна п = природне(0);
    змінна знак = п8(0);

    якщо значення.дані[п] == мавка::розбирач::Велика_буква_Е або значення.дані[п] == мавка::розбирач::КД_мала_буква_е { // е або Е
      вернути ні;
    }

    якщо значення.дані[п] == мавка::розбирач::КД_РИСКА { // -
      відʼємне = так;

      п += 1;
    }

    знак = значення.дані[п];

    поки п < значення.розмір {
      знак = значення.дані[п];

      якщо знак >= мавка::розбирач::КД_0 і знак <= мавка::розбирач::КД_9 {
        результат = результат * 10.0 + (р64(знак) - р64(мавка::розбирач::КД_0));
      } інакше якщо знак == мавка::розбирач::КД_ПІДРИСКА { // _
        // ігноруємо
      } інакше якщо знак == мавка::розбирач::КД_КРАПКА { // .
        п += 1;

        знак = значення.дані[п];

        змінна дробна_частина = р64(0.0);
        змінна дільник = р64(1.0);

        поки п < значення.розмір {
          знак = значення.дані[п];

          змінна ігнор = ні;

          якщо знак >= мавка::розбирач::КД_0 і знак <= мавка::розбирач::КД_9 {
            дробна_частина = дробна_частина * 10.0 + (р64(знак) - р64(мавка::розбирач::КД_0));
          } інакше якщо знак == мавка::розбирач::КД_ПІДРИСКА { // _
            ігнор = так;
          } інакше якщо знак == мавка::розбирач::Велика_буква_Е або знак == мавка::розбирач::КД_мала_буква_е { // е (наукова нотація)
            результат = результат + дробна_частина / дільник;

            якщо відʼємне {
              результат = -результат;
            }

            // Розбираємо експоненту
            п += 1;

            якщо п >= значення.розмір {
              вернути ні;
            }

            змінна експонента_відʼємна = ні;
            знак = значення.дані[п];

            якщо знак == мавка::розбирач::КД_РИСКА { // -
              експонента_відʼємна = так;
              п += 1;
            } інакше якщо знак == мавка::розбирач::КД_ХРЕСТИК { // +
              п += 1;
            }

            якщо п >= значення.розмір {
              вернути ні;
            }

            змінна експонента = ц32(0);

            поки п < значення.розмір {
              знак = значення.дані[п];

              якщо знак >= мавка::розбирач::КД_0 і знак <= мавка::розбирач::КД_9 {
                експонента = експонента * 10 + (ц32(знак) - ц32(мавка::розбирач::КД_0));
              } інакше якщо знак == мавка::розбирач::КД_ПІДРИСКА { // _
                // ігноруємо
              } інакше {
                вернути ні;
              }

              п += 1;
            }

            якщо експонента_відʼємна {
              експонента = -експонента;
            }

            // Застосовуємо експоненту: результат * 10**експонента
            змінна степінь = мавка::піднести_до_степеня_р64(М, 10.0, р64(експонента));

            результат = результат * степінь;

            вихід::вміст = результат;

            вернути так;
          } інакше {
            вернути ні;
          }

          п += 1;

          якщо не ігнор {
            дільник = дільник * 10.0;
          }
        }

        результат = результат + дробна_частина / дільник;

        якщо відʼємне {
          результат = -результат;
        }

        вихід::вміст = результат;

        вернути так;
      } інакше якщо знак == мавка::розбирач::Велика_буква_Е або знак == мавка::розбирач::КД_мала_буква_е { // е (наукова нотація)
        якщо відʼємне {
          результат = -результат;
        }

        // Розбираємо експоненту
        п += 1;

        якщо п >= значення.розмір {
          вернути ні;
        }

        змінна експонента_відʼємна = ні;
        знак = значення.дані[п];

        якщо знак == мавка::розбирач::КД_РИСКА { // -
          експонента_відʼємна = так;
          п += 1;
        } інакше якщо знак == мавка::розбирач::КД_ХРЕСТИК { // +
          п += 1;
        }

        якщо п >= значення.розмір {
          вернути ні;
        }

        змінна експонента = ц32(0);

        поки п < значення.розмір {
          знак = значення.дані[п];

          якщо знак >= мавка::розбирач::КД_0 і знак <= мавка::розбирач::КД_9 {
            експонента = експонента * 10 + (ц32(знак) - ц32(мавка::розбирач::КД_0));
          } інакше якщо знак == мавка::розбирач::КД_ПІДРИСКА { // _
            // ігноруємо
          } інакше {
            вернути ні;
          }

          п += 1;
        }

        якщо експонента_відʼємна {
          експонента = -експонента;
        }

        // Застосовуємо експоненту: результат * 10**експонента
        змінна степінь = мавка::піднести_до_степеня_р64(М, 10.0, р64(експонента));

        результат = результат * степінь;

        вихід::вміст = результат;

        вернути так;
      } інакше {
        вернути ні;
      }

      п += 1;
    }

    якщо відʼємне {
      результат = -результат;
    }

    вихід::вміст = результат;

    вернути так;
  }
}