Всем привет.
Сегодня на данный момент я пишу компилятор C в байткод.
Вы скажете: но C же в машинный код компилируется? В моём случае нет. Лишь в байткод.
Вот правила которые мой C поддерживает:
цикл do-while, цикл while, условие if-else, цикл for (возможно)
Из операций: +, -, /, *, ==, !=, <, >
Декларация переменных только с инициализацией (не int x;) а (int x = 5;)
Присваивание (типо a = a + 1;) можно при созданной переменной
Из типов данных только два: int, char
Функции не обещаю но возможно будут
А то что уже есть:
if-else, while
Декларация переменных
Присваивание переменных
Все типы данных
Все операции
Сделать факториал уже можно. Вот пример факториала 5:
int n = 5;
int f = 1;
while (n > 1) {
f = f * n;
n = n - 1;
}
Вывод:
Execution finished
n: 0
f: 120
Вот как он работает:
С помощью регулярок лексер получает нужный токен и тег
Парсер строит AST
Компилятор делает байткод
Виртуальная машина выполняет его
Вот так всё работает.
Все инструкции байткода (на данный момент):
FETCH переменная - положить на стек значение переменной
PUSH число - положить на стек число
POP - я не помню зачем это ведь это не нужно будет нам
ADD, SUB, MUL, DIV - бинарные операции
NOTEQ, EQ, LT, GT - реляционные операции
JMP адрес - перейти по адресу
JNZ адрес - перейти по адресу если на вершине стека не 0
JZ адрес - перейти по адресу если на вершине стека 0
PASS - игнорировать
STORE имя - сделать переменную если она есть и её тип данных
соответствует типу данных значения
TSTORE имя - декларация переменной
HALT - конец программы
Вот так. На данный момент в проекте где-то 400 строчек кода но это с комментариями и всеми пустыми строками.
Конец. Всем пока.