Я делаю интерпретатор языка, и я дошел до того, что мне нужно оценить операторы if. Сначала я думал, что это просто, я смог заставить свой интерпретатор оценивать простые условия, подобные этому, 10 == 10
, но затем, когда я попытался заставить его оценить более сложное условие, например, 10 == 10 and 9 > 2
, он запутался.
Например, я сделал некоторый код на C++, который может оценивать каждую часть условия по отдельности.
"Hello World" == "Hello World" or "Test" == "Test"
В настоящее время он работает так, он дает фактический результат выше и ожидаемый результат ниже. Результатом этого будет:
TRUE or TRUE <- Actual
-----------------------
TRUE or TRUE <- Expected
-----------------------
Вот код:
#include <iostream>
#include <string>
#include <vector>
#include "cond.h"
using namespace std;
vector <string> cond_holder;
vector <string> res;
vector <string> expects;
bool eval_cond(string cond) {
int i;
int i2;
bool state = 0;
bool final_return = false;
string c = "";
for (i = 0; i < cond.length();i++) {
c += cond[i];
if (cond[i] == '"') {
if (state == 0)
state = 1;
else
state = 0;
} else if (cond[i] == ' ' && state == 0) {
c = c.substr(0,c.length()-1);
cond_holder.push_back(c);
c = "";
}
if (i == cond.length()-1) {
cout << c << endl;
}
}
for (i = 0; i < cond_holder.size();i++) {
if (cond_holder[i+1] == "eqeq") {
expects.push_back("TRUE");
if (cond_holder[i] == cond_holder[i+2]) {
res.push_back("TRUE");
} else {
res.push_back("FALSE");
}
i+=3;
}
if (cond_holder[i] == "and") {
res.push_back("and");
expects.push_back("and");
} else if (cond_holder[i] == "or") {
res.push_back("or");
expects.push_back("or");
}
}
for (i = 0; i < res.size();i++) {
cout << res[i] << " ";
}
cout << endl << "-----------------------" << endl;
for (i = 0; i < expects.size();i++) {
cout << expects[i] << " ";
}
cout << endl << "-----------------------" << endl;
return final_return;
}
int main() {
cout << eval_cond("string:\"Hello World\" eqeq string:\"Hello World\" or string:\"H\" eqeq string:\"H\" ") << endl;
return 0;
}
Честно говоря, я просто составлял код по мере продвижения, поэтому я был бы признателен, если бы кто-нибудь подсказал мне лучший способ сделать это. Я даже не уверен, что делать с этим кодом дальше.