Skip to content

wacko-io/algochecker

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Оценка временной сложности алгоритмов (algochecker)

Standalone-библиотека для статической оценки временной сложности алгоритмов на упрощенном подмножестве C++. Ядро проекта не привязано к консольному приложению: пользовательские программы ввода-вывода, GUI или веб-сервер должны работать через публичный интерфейс библиотеки.

Структура проекта

algochecker/
├── CMakeLists.txt                  # Скрипт сборки библиотек и тестов
├── README.md                       # Документация (этот файл)
├── src/                            # Исходные файлы (.cpp)
│   ├── algochecker/                # Публичный API библиотеки
│   │   └── analyzer.cpp
│   ├── static_analyzer/            # Модуль статического анализа
│   │   ├── file_loader.cpp
│   │   ├── lexer.cpp
│   │   ├── parser.cpp
│   │   └── complexity_evaluator.cpp
│   ├── web_server/                 # Заготовка интеграции веб-сервера с библиотекой
│   │   └── server.cpp
│   └── dynamic_analyzer/           # Черновики вне текущего ФТ
│       ├── data_generator.cpp
│       ├── benchmarker.cpp
│       ├── exporter.cpp
│       └── visualizer.cpp
├── include/                        # Заголовочные файлы (.h), повторяют структуру src/
│   ├── algochecker/
│   │   └── analyzer.h
│   ├── static_analyzer/
│   ├── dynamic_analyzer/
│   └── web_server/
├── web/                            # Статические файлы для веб-интерфейса
│   ├── index.html
│   ├── style.css
│   └── script.js
├── tests/                          # Тестовые примеры и автопроверки
│   ├── analyzer_api_test.cpp
│   └── *.cpp
└── scripts/                        # Вспомогательные скрипты

Публичный интерфейс библиотеки

Основная точка входа: include/algochecker/analyzer.h.

#include "algochecker/analyzer.h"

int main() {
    const std::string source = R"(
        int helper(int n) {
            for (int i = 0; i < n; ++i) {
                n -= i;
            }
            return n;
        }

        int main() {
            return helper(10);
        }
    )";

    const auto report = algochecker::analyze_source(source);
    // report.parse_result
    // report.complexity
}

Что возвращает библиотека:

  • нормализованный исходный код без комментариев и строковых литералов;
  • результат парсинга с числом найденных for, глубиной вложенности, количеством вызовов функций и отметками о пропущенной рекурсии;
  • строку с теоретической оценкой вида T(n) = ... , O(...).

Распределение ролей и задач (План разработки)

Этап 1: Проектирование и базовый сетап

  • Все разработчики работают совместно.
  • Матвеев: настройка репозитория и базовой сборки на CMake.
  • Леонов: проектирование структур данных для результатов парсинга и анализа.
  • Новицкий: подготовка каркаса веб-части и статических файлов web/.

Этап 2: Активная разработка модулей

Леонов и Матвеев: Блок 1. Статический анализ и библиотечный API

  • ФТ-1.1 Загрузка исходного кода. Файл: src/static_analyzer/file_loader.cpp. Ответственный: Матвеев.
  • ФТ-1.2 Лексическая очистка исходного текста. Файл: src/static_analyzer/lexer.cpp. Ответственный: Леонов.
  • ФТ-1.3 Идентификация только циклов for. Файл: src/static_analyzer/parser.cpp. Ответственный: Леонов.
  • ФТ-1.4 Расчет глубины вложенности поддерживаемых циклов for. Файл: src/static_analyzer/parser.cpp. Ответственный: Леонов.
  • ФТ-1.5 Подсчет элементарных операций в анализируемом коде. Файлы: src/static_analyzer/parser.cpp, src/static_analyzer/complexity_evaluator.cpp. Ответственные: Леонов, Матвеев.
  • ФТ-1.6 Поддержка вызовов пользовательских функций по имени и числу параметров. Файл: src/static_analyzer/parser.cpp. Ответственный: Леонов.
  • Ограничение: рекурсивные вызовы не разворачиваются и помечаются отдельно. Файл: src/static_analyzer/parser.cpp. Ответственный: Леонов.
  • Архитектурное требование: standalone-библиотека с публичным интерфейсом для пользовательских программ ввода-вывода. Файлы: include/algochecker/analyzer.h, src/algochecker/analyzer.cpp, CMakeLists.txt. Ответственный: Матвеев.

Новицкий: Блок 2. Веб-сервер и веб-интерфейс

  • Веб-сервер / API. Файлы: include/web_server/server.h, src/web_server/server.cpp. Использовать библиотечный интерфейс algochecker::analyze_source(...).
  • Фронтенд: структура и стили. Файлы: web/index.html, web/style.css.
  • Фронтенд: логика отправки кода и отображения результата. Файл: web/script.js.

Этап 3: Объединение (сборка)

  • Точка синхронизации работы всех участников.
  • Новицкий: подключает библиотечный API в веб-сервер и связывает его с фронтендом.
  • Матвеев: поддерживает сборку библиотек algochecker и algochecker_web, а также тестового таргета.
  • Леонов: пополняет tests/ эталонными алгоритмами для ручной и автоматической проверки анализа.

Этап 4: Тестирование и обработка ограничений

  • Все разработчики проверяют систему на соответствие ограничениям текущего ФТ.
  • Поддерживаются только циклы for; конструкции while, do while и аналогичные не участвуют в расчете циклической сложности.
  • Вызовы функций разрешены только в рамках нерекурсивного обхода и сопоставляются по имени и количеству параметров.
  • Отладка парсера ведется на упрощенном синтаксисе C++ без претензии на полноценный компилятор.
  • Ошибки пользовательского ввода должны обрабатываться внешними программами, использующими библиотеку.

Актуальные ограничения

  • Анализатор работает с упрощенным подмножеством C++.
  • Поддерживаемый цикл для оценки сложности: только for.
  • Рекурсия не анализируется как часть дерева вызовов.
  • При наличии нескольких перегрузок выбор функции выполняется по имени и количеству параметров.
  • При отсутствии main() можно явно указать точку входа через AnalysisOptions.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages