Всем привет.
Сегодня на данный момент я пишу компилятор 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 строчек кода но это с комментариями и всеми пустыми строками.
Конец. Всем пока.
