/
xverizex
/
ximas
Обзор
Документация
Войти
/
xverizex
/
ximas
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/Rules.cpp
128 строк
3 KB
Dmitry
[+] Добавил частично работу со строковыми выражениями для калькулятора
14 июл 2026, 15:17
14 июл 2026, 15:17
96256ec
Код
Авторство
О чём код?
#include "Rules.h" #include "Scanner.h" #include "Token.h" #include "Error.h" static int isDigitSym (char sym) { if ((sym >= '0') && (sym <= '9')) return 1; return 0; } static int isVariable (Token *token) { std::string &buf = token->buf (); if ((buf.size () >= 1) && !(isDigitSym (buf[0]))) { return 1; } return 0; } static int isSet (Token *token) { std::string &buf = token->buf (); if ((buf.size () == 1) && (buf[0] == '=')) { return 1; } return 0; } static int checkDeep (std::vector<Token *> &token, size_t startIndex, size_t indx, std::vector<std::string> &error) { int found = 0; int deep = 0; while (token[indx]->type () != ximas::TokenType::END) { std::string &buf = token[indx]->buf (); if ((buf.size () == 1) && (buf[0] == '(')) { deep++; found = 1; indx++; continue; } if ((buf.size () == 1) && (buf[0] == ')')) { deep--; if (deep < 0) { setErrorDeep (token, startIndex, indx, ximas::PosError::START, error); return 0; } found = 1; indx++; continue; } indx++; } if (deep != 0) { setErrorDeep (token, startIndex, indx, ximas::PosError::END, error); return 0; } return 1; } static int checkInitVariableEquation (std::vector<Token *> &token, size_t startIndex, size_t indx, std::vector<std::string> &error) { if (!checkDeep (token, startIndex, indx, error)) { return 0; } return 0; } static int checkRuleInitVariable (std::vector<Token *> &token, size_t indx, std::vector<std::string> &error) { size_t startIndex = indx; indx += 2; return checkInitVariableEquation (token, startIndex, indx, error); } static int isInitVariable (std::vector<Token *> &token, size_t indx, std::vector<std::string> &error) { if ((token.size () - indx) > 2) { if (isVariable (token[indx + 0]) && isSet (token[indx + 1])) { return checkRuleInitVariable (token, indx, error); } } return 0; } int isValidGrammarsLanguage (Scanner *scanner, std::vector<std::string> &error) { std::vector<Token *> &token = scanner->listToken (); size_t indx = scanner->indx (); size_t sz = token.size (); while (indx < sz) { if (isInitVariable (token, indx, error)) { continue; } return 0; } return 0; } int isValidGrammarsCalculator (Scanner *scanner, std::vector<std::string> &error) { std::vector<Token *> &token = scanner->listToken (); size_t indx = scanner->indx (); size_t sz = token.size (); if (!checkDeep (token, 0, indx, error)) { return 0; } return 1; }