C++ ПРОСТЕНЬКИЙ МАТЕМАТИЧЕСКИЙ ПАРСЕР
#include <iostream> #include <fstream> #include <stack> #include <cmath> using namespace std; int priority(char op) { if (op == '+' || op == '-') return 1; if (op == '*' || op == '/') return 2; if (op == '^') return 3; return 0; } bool is_operator(char c) { return (c == '+' || c == '-' || c == '*' || c == '/' || c == '^'); } double apply_operator(char op, double b, double a) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; case '^': return pow(a, b); default: return 0; } } double calculate(string expression) { stack values; stack operators; for (int i = 0; i < expression.length(); i++) { if (expression[i] == ' ') continue; if (expression[i] == '(') { operators.push(expression[i]); } else if (expression[i] == ')') { while (operators.top() != '(') { char op = operators.top(); operators.pop(); double a = values.top(); values.pop(); double b = values.top(); values.pop(); values.push(apply_operator(op, b, a)); } operators.pop(); } else if (isdigit(expression[i])) { double value = 0; while (i < expression.length() && (isdigit(expression[i]) || expression[i] == '.')) { value = (value * 10) + (expression[i] - '0'); i++; } i--; if (!operators.empty() && operators.top() == '-') { operators.pop(); value = -value; } values.push(value); } else if (is_operator(expression[i])) { while (!operators.empty() && priority(operators.top()) >= priority(expression[i])) { char op = operators.top(); operators.pop(); double a = values.top(); values.pop(); double b = values.top(); values.pop(); values.push(apply_operator(op, b, a)); } operators.push(expression[i]); } else { cout << "Invalid character in expression: " << expression[i] << endl; return 0; } } while (!operators.empty()) { char op = operators.top(); operators.pop(); double a = values.top(); values.pop(); double b = values.top(); values.pop(); values.push(apply_operator(op, b, a)); } return values.top(); } int main() { ifstream config_file("config.txt"); if (!config_file.is_open()) { cout << "Error opening config file." << endl; return 0; } string expression; getline(config_file, expression); config_file.close(); double result = calculate(expression); cout << "Result: " << result << endl; return 0; }
Пример файла конфигурации "config.txt":
2 + 3 * (4 - 1) -5 * (3 + 2) 10 / 2 - 3 * (7 - 1) / 2