Проект gl-lang-compiler представляет собой компилятор, предназначенный для архитектуры команд AArch64. Он выполняет разбор исходного кода, построение абстрактного синтаксического дерева (AST), построение дерева операций и графа потока управления. В перспективе планируется вывод в ассемблерный листинг.
Кроме того, проект генерирует визуализации в формате DOT для AST и графа вызовов функций.
Для запуска программы в Windows используйте терминал и выполните команду:
./WinV.exe example.txt treeAST.dot
где:
example.txt— входной файл с исходным кодом для разбора,treeAST.dot— выходной файл с деревом разбора в формате DOT.
treeAST.dot— файл с визуализацией абстрактного синтаксического дерева (AST) в формате DOT.call_graph.dot— файл с графом вызовов функций в формате DOT.
Эти файлы можно просмотреть с помощью программ для визуализации графов, например, Graphviz.
LinuxV/— исходные файлы проекта, включая код генерации кода, построения AST и управления графами.WinV/— файлы и исполняемые файлы для Windows.Makefile— файл сборки проекта.
- Компилятор
gcc - Библиотека
antlr3c(используется для лексического и синтаксического анализа)
Данный проект предназначен для изучения и экспериментов с компиляторами и генерацией кода.
Язык, поддерживаемый компилятором, имеет следующий синтаксис:
- Программа состоит из набора функций.
- Определение функции включает сигнатуру с типом возвращаемого значения, именем функции и списком параметров.
- Поддерживаются базовые типы:
bool,byte,int,uint,short,long,char,string,unsigned,signed,void,float,double. - Объявления переменных с указанием типа.
- Управляющие конструкции:
if,else,switch,while,do-while,break,return. - Выражения включают арифметические, логические, побитовые операции, вызовы функций, индексацию массивов.
- Поддерживаются массивы с указанием размеров.
- Комментарии: многострочные
/* ... */и однострочные// .... - Литералы: булевы значения (
true,false), целые числа, числа в двоичной, шестнадцатеричной системах, символы и строки.
Пример определения функции:
int sum(int a, int b) {
return a + b;
}
Пример использования управляющей конструкции:
if (a > b) {
return a;
} else {
return b;
}
Данный синтаксис описан в файле грамматики LinuxV/antlr/labgramm.g.