«Электронная таблица» это аналог существующих решений: лист таблицы Microsoft Excel или Google Sheets. В ячейках таблицы могут быть текст или формулы. Формулы, как и в существующих решениях, могут содержать индексы ячеек.
- Ячейки могут содержать текст, числовые значения, арифметические формулы, ссылки на другие ячейки.
- Вывод печатной области (выводится только использованная часть таблицы).
- Проверка синтаксической и математической корректности формул, проверка ссылок и промежуточных значений.
- Защита от циклических зависимостей между ячейками.
- Поддержка кеша ячеек.
ANTLR (ANother Tool for Language Recognition) — мощный генератор парсеров для чтения, обработки, выполнения или перевода структурированного текста или двоичных файлов. Он широко используется для создания языков, инструментов и фреймворков. Из грамматики ANTLR генерирует синтаксический анализатор, который может строить и проходить деревья синтаксического анализа.
Для корректной генерации кода с помощью ANTLR4 требуется Java не ниже 11, antlr4-complete.jar и его исходники. Исходники вместе с CmakeLists.txt расположены в паке antlr4_runtime, antlr4-complete.jar вложен в корневую директорию проекта. Останется только указать системе путь к antlr4-complete.jar.
Перед началом сборки необходиму указать системе путь к antlr4-complete.jar. Для этого нужно выполнить одну из команд:
WindowsSET CLASSPATH=.;Полный путь к проекту\antlr4-complete.jar;%CLASSPATH%Linux$ export CLASSPATH=".:Полный путь к проекту\antlr4-complete.jar:$CLASSPATH"OS X$ export CLASSPATH=".:Полный путь к проекту\antlr4-complete.jar:$CLASSPATH"
Теперь Cmake сможет собрать проект.
// Для удобства работы с координатами определим оператор _pos
inline Position operator"" _pos(const char* str, std::size_t) {
return Position::FromString(str);
}
void Example() {
auto sheet = CreateSheet();
sheet->SetCell("A1"_pos, "300");
sheet->SetCell("A2"_pos, "50");
sheet->SetCell("A3"_pos, "=A1/A2");
sheet->SetCell("B1"_pos, "=A3*50");
sheet->SetCell("B3"_pos, "(A3+B1)/10=");
sheet->SetCell("C3"_pos, "=(A3+B1)/10");
sheet->SetCell("D1"_pos, "Delete mee");
sheet->ClearCell("D1"_pos);
sheet->PrintValues(std::cout);
}