Skip to content

MaxGud10/ParaCL

Repository files navigation

Para C Language

Язык в стиле C. Использует Flex и Bison для синтаксического и лексического анализа, а также для разбора.

Flex — инструмент для создания лексических анализаторов (lexer) на основе регулярных выражений.

Bison — генератор синтаксических анализаторов (parser) на основе контекстно-свободных грамматик.

FRONTEND

  • Лексический анализатор
  • Синтансический анализатор ( или парсер )
  • Семантический анализатор ( или проверка типов )
  • Генерация промежуточного кода ( AST )

Лексический анализ

Лексический анализатор — часть компилятора, которая читает текст программы из входного потока и преобразовывает его в набор лексем или токенов (неделимые примитивы языка, такие как ключевые слова, идентификаторы, строковые и числовые константы, операторы и др), которые в простейшем случае представляют собой структуру содержащую информацию о типе прочитанного токена и его значение. Так же лексический анализатор часто убирает из выходного потока «шум» (конструкции языка, которые не влияют на дальнейший разбор программы, такие как комментарии и пробельные символы (в языках, где отступы не являются значимыми для разбора программы))

Синтаксический анализ

Синтаксический анализатор (парсер) — часть компилятора, основной целью которой является анализ потока токенов на принадлежность грамматике конкретного языка.

Часто результатом работы парсера является AST, которое содержит всю необходимую информацию для дальнейших стадий компилятора.

Примеры

Синтаксис ParaCL очень похож на синтаксис C. Примеры можно найти в каталоге common

Зависимости

В этом проекте для управления зависимостями используется менеджер пакетов Conan. Перед установкой Conan вам потребуется следующее

  • CMake (минимальная версия 3.14)
  • Компилятор C++20

Эти зависимости пока не обрабатываются Conan и должны быть установлены через системный менеджер пакетов:

  • становлен Graphviz (команда dot)
  • библиотека questionary
  • Flex
  • Bison

Запуск проекта

git  clone https://github.com/MaxGud10/ParaCL
cd ParaCL
mkdir build

Pежим Release

  1. Создадим виртуальную среду и установим Conan:
python3 -m venv .venv && source .venv/bin/activate && pip3 install conan
  1. Установим зависимости проекта с помощью Conan:
conan install . --output-folder=third_party --build=missing
  1. Создаем проект:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=./third_party/conan_toolchain.cmake
cmake --build build

Режим Debug

  1. Создадим виртуальную среду и установим Conan:
python3 -m venv .venv && source .venv/bin/activate && pip3 install conan
  1. Установим зависимости проекта с помощью Conan:
conan install . --output-folder=third_party --build=missing -s build_type=Debug
  1. Создаем проект
cmake -B build -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=./third_party/conan_toolchain.cmake
cmake --build build

BACKEND (LLVM Codegen)

В проекте также реализован 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.

Компиляция в нативный код через LLVM

Пример:

./build/paracl_codegen unit_tests/data/common/func_basic.dat > out.ll
clang++ out.ll ./paralib/paraio.cpp -lstdc++ -o out
./out

Тесты

Проект содержит unit-тесты (GoogleTest)

  1. Создайте тесты:
cmake --build build
  1. Запустите тестовый двоичный файл:
cd build
ctest --output-on-failure

GraphViz

img

  • Чтобы сгенерировать dump AST-дерева необходимо, чтобы в вашей root директории проекта находилась папка dumps
  • Она генерируется cmake'ом, но лучше перепроверить, что она у вас есть в следующем виде:
├── dumps
│   ├── dot
│   └── png

⚠️ Если хотите сгененировать dump, то вызывайте его из корня проекта. В будущем мы это пофиксим, но пока что будет работать только так.

Инструкция по дампу
  1. ./paracl file.dat --dump. Это флаг для дампа.
    • он генерирует .dot в директории dumps/dot
  2. python3 dot2png.py - это скрипт для генерации .png картинки из .dot файла.

Реализация паттерна Visitor

можно прочитать тут $\rightarrow$ тык


References

About

para C language (C++ course) Resources

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors