Язык в стиле C. Использует Flex и Bison для синтаксического и лексического анализа, а также для разбора.
Flex — инструмент для создания лексических анализаторов (lexer) на основе регулярных выражений.
Bison — генератор синтаксических анализаторов (parser) на основе контекстно-свободных грамматик.
- Лексический анализатор
- Синтансический анализатор ( или парсер )
- Семантический анализатор ( или проверка типов )
- Генерация промежуточного кода ( AST )
Лексический анализатор — часть компилятора, которая читает текст программы из входного потока и преобразовывает его в набор лексем или токенов (неделимые примитивы языка, такие как ключевые слова, идентификаторы, строковые и числовые константы, операторы и др), которые в простейшем случае представляют собой структуру содержащую информацию о типе прочитанного токена и его значение. Так же лексический анализатор часто убирает из выходного потока «шум» (конструкции языка, которые не влияют на дальнейший разбор программы, такие как комментарии и пробельные символы (в языках, где отступы не являются значимыми для разбора программы))
Синтаксический анализатор (парсер) — часть компилятора, основной целью которой является анализ потока токенов на принадлежность грамматике конкретного языка.
Часто результатом работы парсера является AST, которое содержит всю необходимую информацию для дальнейших стадий компилятора.
Синтаксис ParaCL очень похож на синтаксис C. Примеры можно найти в каталоге common
В этом проекте для управления зависимостями используется менеджер пакетов Conan. Перед установкой Conan вам потребуется следующее
- CMake (минимальная версия 3.14)
- Компилятор C++20
Эти зависимости пока не обрабатываются Conan и должны быть установлены через системный менеджер пакетов:
- становлен Graphviz (команда
dot) - библиотека
questionary FlexBison
git clone https://github.com/MaxGud10/ParaCL
cd ParaCL
mkdir build- Создадим виртуальную среду и установим Conan:
python3 -m venv .venv && source .venv/bin/activate && pip3 install conan- Установим зависимости проекта с помощью Conan:
conan install . --output-folder=third_party --build=missing- Создаем проект:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=./third_party/conan_toolchain.cmake
cmake --build build- Создадим виртуальную среду и установим Conan:
python3 -m venv .venv && source .venv/bin/activate && pip3 install conan- Установим зависимости проекта с помощью Conan:
conan install . --output-folder=third_party --build=missing -s build_type=Debug- Создаем проект
cmake -B build -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=./third_party/conan_toolchain.cmake
cmake --build buildВ проекте также реализован backend, который генерирует LLVM IR для языка ParaCL. Backend позволяет компилировать программу в промежуточное представление LLVM вместо интерпретации
Он использует библиотеку LLVM для генерации IR и runtime-библиотеку из каталога paralib
Язык ParaCL является динамически типизированным, поэтому backend использует универсальный тип значения: ParaValue, который может хранить:
int
closure
Все операции над значениями выполняются через runtime-функции
После сборки появится файл:
build/paracl_codegen
Пример запуска:
./build/paracl_codegen unit_tests/data/common/basic_1.dat
Backend ParaCL генерирует LLVM IR.
Пример:
./build/paracl_codegen unit_tests/data/common/func_basic.dat > out.ll
clang++ out.ll ./paralib/paraio.cpp -lstdc++ -o out
./outПроект содержит unit-тесты (GoogleTest)
- Создайте тесты:
cmake --build build- Запустите тестовый двоичный файл:
cd build
ctest --output-on-failure- Чтобы сгенерировать
dumpAST-дерева необходимо, чтобы в вашейrootдиректории проекта находилась папкаdumps - Она генерируется
cmake'ом, но лучше перепроверить, что она у вас есть в следующем виде:
├── dumps
│ ├── dot
│ └── png
./paracl file.dat --dump. Это флаг для дампа.- он генерирует
.dotв директорииdumps/dot
- он генерирует
python3 dot2png.py- это скрипт для генерации.pngкартинки из.dotфайла.
можно прочитать тут
