5.2 KiB
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
Если юзер высрал два лейбла с одинаковыми идентификаторами, то интерпретатор/компилятор должен выдать ошибку