-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Требуется написать консольное приложение, которое будет преобразовывать код на язке "Ять" в машинный код.
- Разделение компиляции на следующие этапы: Лексический анализ. Синтаксический анализ. Построение абстрактного синтаксического дерева (АСД). Преобразование АСД в код на llvm assembly language. Преобразование кода на llvm assembly language в бинарный исполняемый файл.
- Реализация грамматики для лексера с помощью flex.
- Реализация грамматики для парсера с помощью bison.
- Реализация классов для АСД на языке C++ и последующее добавление кода на C++ к парсеру.
- Добавление каждому классу для АСД метод для вывода команд на llvm с использованием специального API.
Текущее решение строит по исходному коду на языке Ять АСД, преобразует построенное дерево в исходный код на языке C и компилирует этот код в машинный код.
Попытки что-то сделать с llvm находятся в ветке llvm_stuff.
Здесь прописаны зависимости для файлов, которые генерируются в процессе сборки проекта.
Здесь описаны классы вершин АСД.
Здесь реализованы методы классов абстрактного синтаксического дерева.
Здесь реализованно всё, что связано с пользовательским интерфейсом.
Здесь описана грамматика лексического анализа.
Здесь описана грамматика синтаксического анализа.
- Перейдите в корневую директорию проекта
- В терминале запустите следующую команду:
$ makeЧтобы скомпилировать файл на языке Ять, необходимо запустить в терминале следующую команду:
$ ./yc <имя входного файла> <имя выходного файла>Если имя выходного файла не указано, то по умолчанию код будет компилироваться в файл "a.out".
code.ypl (считывает число из stdin, выводит его факториал):
def fact(a){
//print(a);
if (a){
fact(a-1)*(a);
} else {
1;
};
};
read a;
print fact(a);Собираем и запускаем (дадим на вход число 5, потом число 8):
$ ./yc code.ypl
$ ./a.out
5
120
$ ./a.out <<< "8"
40320Компилятор поддерживает комментарии, закомментированная строка не выполняется.
code1.ypl (выводит 12-ое число Фибоначчи):
def foo(a){
if (a < 2){
1;
} else {
foo(a - 1) + foo(a - 2);
};
};
print foo(12);code2.ypl (выводит gcd считанных из стандартного ввода чисел):
def gcd(a, b){
if (b == 0){
a;
} else {
gcd(b, a % b);
};
};
read a;
read b;
print gcd(a, b);Собираем и запускаем:
$ ./yc code2.ypl
$ ./a.out <<< "1998 1971"
27В файле unittest/test.h находятся тесты для классов АСД, реализованные с помощью фреймворка CXX. Все тесты имеют следующий вид:
class MyTest : public CxxTest::TestSuite {
public:
void testMethod() {
...
}
};- Перейдите в корневую директорию проекта
- В терминале запустите следующую команду:
$ make testВ терминале запустите следующую команду:
$ ./testПосле этого должно появиться примерно такое сообщение о том, что тесты пройдены:
Running cxxtest tests (15 tests)...............OK!