Pull to refresh

Всем привет.

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

Конец. Всем пока.

Tags:
+4
Comments1

Articles