Консольный движок электронной таблицы на C++17 с поддержкой формул, зависимостей между ячейками, кеширования вычислений и защитой от циклических ссылок.
Проект реализует ключевые механизмы, используемые в spreadsheet-приложениях: обработку формул, построение графа зависимостей, инвалидацию кеша и обработку ошибок вычислений.
-
хранение текстовых и вычисляемых значений;
-
поддержка адресации (
A1,B2, ...); -
вывод таблицы как:
- исходного содержимого;
- вычисленных значений.
-
арифметические операции:
+-*/
-
скобки;
-
ссылки на другие ячейки;
-
нормализация выражений.
- отслеживание связей между ячейками;
- автоматическая инвалидация кеша;
- обнаружение циклических зависимостей;
- выброс
CircularDependencyException.
Поддерживаются ошибки вычислений:
- деление на ноль;
- некорректные значения;
- арифметические ошибки.
- C++17
- CMake
- ANTLR4 (C++ runtime)
- собственный lightweight test runner
Проект разделён на несколько компонентов:
Sheet
↓
Cell
↓
Formula
↓
AST
Основные модули:
-
sheet.*- контейнер ячеек;
- API таблицы;
- печать и валидация;
-
cell.*-
логика ячеек;
-
кеширование значений;
-
зависимости:
depends_ondepended_by;
-
-
formula.* -
FormulaAST.*- парсинг и вычисление формул;
-
common.h-
общие типы и интерфейсы:
PositionSizeCellInterfaceSheetInterface
-
-
main.cpp- тесты основных сценариев.
-
CMake >= 3.8
-
Компилятор с поддержкой C++17:
- MSVC
- GCC
- Clang
-
Java
-
ANTLR4 C++ runtime
-
antlr-4.12.0-complete.jar
Ожидаемая структура:
spreadsheet/
├── antlr4_runtime/
└── antlr-4.12.0-complete.jar
cd spreadsheet
cmake -S . -B build
cmake --build build --config Release./build/Release/spreadsheetЕсли все тесты проходят успешно, приложение завершается без ошибок.
=1+2*3
=(A1+B2)/C3
=A1+A2+A1
'=A1+1
Описание:
=1+2*3— арифметическое выражение;=(A1+B2)/C3— использование ссылок;=A1+A2+A1— повторные ссылки корректно учитываются;'=A1+1— экранирование формулы и обработка как текста.
- AST (Abstract Syntax Tree);
- граф зависимостей;
- кеширование вычислений;
- обработка исключений;
- объектная модель;
- парсинг выражений.