Проект 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
.