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(...).
- Все разработчики работают совместно.
- Матвеев: настройка репозитория и базовой сборки на
CMake. - Леонов: проектирование структур данных для результатов парсинга и анализа.
- Новицкий: подготовка каркаса веб-части и статических файлов
web/.
- ФТ-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. Ответственный: Матвеев.
- Веб-сервер / API. Файлы:
include/web_server/server.h,src/web_server/server.cpp. Использовать библиотечный интерфейсalgochecker::analyze_source(...). - Фронтенд: структура и стили. Файлы:
web/index.html,web/style.css. - Фронтенд: логика отправки кода и отображения результата. Файл:
web/script.js.
- Точка синхронизации работы всех участников.
- Новицкий: подключает библиотечный API в веб-сервер и связывает его с фронтендом.
- Матвеев: поддерживает сборку библиотек
algocheckerиalgochecker_web, а также тестового таргета. - Леонов: пополняет
tests/эталонными алгоритмами для ручной и автоматической проверки анализа.
- Все разработчики проверяют систему на соответствие ограничениям текущего ФТ.
- Поддерживаются только циклы
for; конструкцииwhile,do whileи аналогичные не участвуют в расчете циклической сложности. - Вызовы функций разрешены только в рамках нерекурсивного обхода и сопоставляются по имени и количеству параметров.
- Отладка парсера ведется на упрощенном синтаксисе C++ без претензии на полноценный компилятор.
- Ошибки пользовательского ввода должны обрабатываться внешними программами, использующими библиотеку.
- Анализатор работает с упрощенным подмножеством C++.
- Поддерживаемый цикл для оценки сложности: только
for. - Рекурсия не анализируется как часть дерева вызовов.
- При наличии нескольких перегрузок выбор функции выполняется по имени и количеству параметров.
- При отсутствии
main()можно явно указать точку входа черезAnalysisOptions.