Всем добрый день. Стоит задача написать интерпретатор "сферического скрипта в вакууме".
Должны использоваться:
— типы данных — int, float
— все переменные — глобальные. имена могут содержать символы и цифры
— математические операции +, -, *, /, ^ (в степень)
— мат функции sqr(), sin(), cos()
— операторы сравнения — < > ==
— из конструкций языка — условные операторы if, if/else, while, do/while, for, break
Не могу понять, почему не меняются значения Y и Z, когда я меняю X.
Вот код:
#include <iostream>
#include <string>
#include <sstream>
#include <unordered_map>
#include <cmath>
#include <functional>
using namespace std;
unordered_map<string, double> variables;
double eval_expr(const string& expr) {
string updated_expr = expr;
for (const auto& var : variables) {
size_t pos = 0;
while ((pos = updated_expr.find(var.first, pos)) != string::npos) {
updated_expr.replace(pos, var.first.length(), to_string(var.second));
pos += to_string(var.second).length();
}
}
// Обработка sin и cos
size_t pos = updated_expr.find("sin");
while (pos != string::npos) {
size_t start = updated_expr.find('(', pos) + 1;
size_t end = updated_expr.find(')', start);
double arg = eval_expr(updated_expr.substr(start, end - start));
updated_expr.replace(pos, end - pos + 1, to_string(sin(arg)));
pos = updated_expr.find("sin", pos);
}
pos = updated_expr.find("cos");
while (pos != string::npos) {
size_t start = updated_expr.find('(', pos) + 1;
size_t end = updated_expr.find(')', start);
double arg = eval_expr(updated_expr.substr(start, end - start));
updated_expr.replace(pos, end - pos + 1, to_string(cos(arg)));
pos = updated_expr.find("cos", pos);
}
// Обработка sqr для квадратного корня
pos = updated_expr.find("sqr");
while (pos != string::npos) {
size_t start = updated_expr.find('(', pos) + 1;
size_t end = updated_expr.find(')', start);
double arg = eval_expr(updated_expr.substr(start, end - start));
updated_expr.replace(pos, end - pos + 1, to_string(sqrt(arg)));
pos = updated_expr.find("sqr", pos);
}
istringstream iss(updated_expr);
double result;
iss >> result;
return result;
}
void execute_line(const string& line) {
if (line.find('=') != string::npos) {
string var = line.substr(0, line.find('='));
string expr = line.substr(line.find('=') + 1);
variables[var] = eval_expr(expr);
}
else if (line.find("if") == 0) {
size_t pos_then = line.find("then");
if (eval_expr(line.substr(3, pos_then - 3))) {
string block = line.substr(pos_then + 4);
// Execute block
}
}
else if (line.find("while") == 0) {
size_t pos_do = line.find("do");
while (eval_expr(line.substr(6, pos_do - 6))) {
string block = line.substr(pos_do + 2);
// Execute block
}
}
}
void interpret(const string& script) {
istringstream iss(script);
string line;
while (getline(iss, line)) {
size_t pos = line.find("for");
if (pos != string::npos) {
// Обработка for цикла
continue;
}
execute_line(line); // Вызов функции для выполнения строки
}
}
int main() {
string script = R"(
x = 25;
y = sqr(x);
z = cos(x);
for (int i = 0; i < 3; i++) {
b = sin(i);
if (b > 0.5) break;
}
)";
interpret(script);
for (const auto& var : variables) {
cout << var.first << " = " << var.second << endl;
}
return 0;
}