labast/SPECIFICATION.md
2024-02-05 09:05:48 +02:00

5.2 KiB
Raw Permalink Blame History

Labaski specification

Last update: 2024-02-05

Программа состоит из команд в формате ИНСТРУКЦИЯ АРГУМЕНТ (assembler-like)

Аргумент всегда должен быть uint16 (unsigned short, u16)

Все данные которые программа использует хранятся в стеке, сам стек это массив из этих unsigned short'ов

Размер стека без разницы, но желательно минимум 256

Выполнение программы начинается либо с начала файла, либо с лейбла 0, если он есть

Почти каждая инструкция которые читает что-то стека должна POP'ать прочитаннное значение

Если название инструкции начинается с #, то парсер программы должен прочитать аргумент к инструкции как строку(до первого пробела)

Инструкции

Инструкция Аргумент Описание
PUSH uint16 Добавить в стек
POP - Удалить из стека
DUP - Дублировать последнее значение в стеке
SWAP - Поменять местами последние 2 значения в стеке
ADD - Прибавление последних 2-х значений из стека
SUB - Вычитание последних 2-х значений из стека
MUL - Умножение последних 2-х значений из стека
DIV - Деление последних 2-х значений из стека
JMP uint16 лейбл Перейти к лейблу <имя>
JNZ uint16 лейбл Перейти к лейблу <имя> если значение с верхушки стека не 0
JZ uint16 лейбл Перейти к лейблу <имя> если значение с верхушки стека 0
NOP - Ничего не делает
EXIT - Выход из программы с кодом 0
PUTC - Вывести символ в консоль
GETC - Получить символ с консоли, добавить символ в стек
MEOW - Принт, POP'ает со стека
DUMP - Вывести весь стек в консоль, понятное дело не попает со стека
SCAN - Сканирует ввод из консоли на short'ы и пушит в стек
#EXEC arg Выполнить код из файла, указанного в аргументе*
ARGS uint16 POP'ает аргумент значений с основного стека и пушит их в стек модуля, если указать аргумент 0, то нужное кол-во аргументов она возьмет(попнув) с оригинального стека
SIZE Пушит в стек значение размера стека
QUIT uint16 Полностью завершает выполнение программы. Как аргумент попает exit-код.

*путь относительно места вызова интерпретатора. Создает отдельный стек для модуля, но передает основной для того чтобы взять оттуда аргументы. После того как модуль выполнился, пушит весь стек модуля в основной.

Лейблы

Лейблы могут быть только unsigned short'ами От 0 (main-лейбл) до минимум 256 Если юзер высрал два лейбла с одинаковыми идентификаторами, то интерпретатор/компилятор должен выдать ошибку