Этот репозиторий содежит задания из моего первого семестра обучения на ФРКТ. Далее следует краткий обзор некоторых задач.
Си - подобный язык, основные ключевые слова которого можно менять с помощью файла lang.h.
В языке используются следующие ключевые слова (текущая конфигурация - "непонятный язык"):
fi
->if
esel
->else
hewli
->while
rterun
->return
gte
->get(val)
считывание числа в переменнуюtup
->put(val)
вывод аргумента на экранmani
->main
главная функция программыarv
->var
объявление переменнойrived
->deriv(expression, variable)
дифференцированиеexpression
по переменнойvariable
Данный проект включает в себя 4 программы:
- Frontend - перевод из текстового файла в синтаксическое дерево.
- Frontend^-1 - перевод из синтаксического дерева в текстовый файл.
- Middle-end - упрощение выражений и взятие производных в синтаксическом дереве.
- Backend - перевод из синтаксического дерева в собственный ассемблер
adasm
.
Разберём подробнее каждый этап.
На вход программа получает текстовый файл с кодом программы, написанной на языке. Ниже представлен пример программы, считающей факториал.
$fact( number )
{
fi (number <= 1)
rterun 1;
rterun number * fact(number - 1);
}
$main()
{
arv number = 228;
gte(number);
tup(fact(number));
rterun;
}
Программа разбивается на токены, а затем парсер, основанный на методе рекурсивного спуска, создаёт синтаксическое дерево программы и записывает его в файл.
На вход программа получает файл, в котором описано синтаксическое дерево. Программа восстанавливает дерево из файла, а затем пишет исходный код программы, основываясь на этом дереве.
На вход программа получает файл, в котором описано синтаксическое дерево. Программа восстанавливает дерево из файла, а затем ищет узлы с выражениями (expression
), либо с оператором взятия производной (rived
) и производит вычисления.
На вход программа получает файл, в котором описано синтаксическое дерево. Программа восстанавливает дерево из файла, после чего пишет код на ассемблере adasm
, сохраняя его в текстовый файл.