Make most of the reassignment stuff work
This commit is contained in:
parent
ab07efcb86
commit
a65dfdf6d2
|
@ -221,51 +221,53 @@ void Interpreter::executeCode(vector<Token> tokens) {
|
|||
} else {
|
||||
if (tokens[i].keyword == keywords::VALUE && tokens[i].value.type == valtype::STR && variables.find(get<string>(tokens[i].value.value)) != variables.end()) {
|
||||
log.debug("Manipulating variable...");
|
||||
if (tokens.size() < i + 1) {
|
||||
if (tokens.size() <= i + 2) { // Need at least 3 tokens: variable, operator, value
|
||||
syntaxError.mathTooFewArgs();
|
||||
return;
|
||||
}
|
||||
string varName = get<string>(tokens[i].value.value);
|
||||
i++;
|
||||
if (variables[varName].type == valtype::INT) {
|
||||
if (tokens[i].keyword == keywords::INCREMENT) {
|
||||
|
||||
if (tokens[i].keyword == keywords::SET) {
|
||||
Token valueToken = tokens[i + 1];
|
||||
if (valueToken.type != variables[varName].type) {
|
||||
vector<string> validTypes;
|
||||
switch(variables[varName].type) {
|
||||
case valtype::INT: validTypes = {"int"}; break;
|
||||
case valtype::DEC: validTypes = {"dec"}; break;
|
||||
case valtype::STR: validTypes = {"str"}; break;
|
||||
case valtype::BOOL: validTypes = {"bool"}; break;
|
||||
}
|
||||
syntaxError.fnTypeMismatch("assignment", validTypes, valueToken.type);
|
||||
return;
|
||||
}
|
||||
variables[varName].value = valueToken.value.value;
|
||||
i++; // Skip the value token since we've processed it
|
||||
} else if (tokens[i].keyword == keywords::INCREMENT) {
|
||||
if (variables[varName].type == valtype::INT) {
|
||||
variables[varName].value = get<int>(variables[varName].value) + 1;
|
||||
} else if (tokens[i].keyword == keywords::DECREMENT) {
|
||||
} else {
|
||||
syntaxError.mathCannotDoOperationOnType("++", "non-int");
|
||||
}
|
||||
} else if (tokens[i].keyword == keywords::DECREMENT) {
|
||||
if (variables[varName].type == valtype::INT) {
|
||||
variables[varName].value = get<int>(variables[varName].value) - 1;
|
||||
} else if (tokens[i].keyword == keywords::ADDTO) {
|
||||
if (tokens.size() < i + 1) syntaxError.mathTooFewArgs();
|
||||
if (tokens[i + 1].value.type != valtype::INT) syntaxError.mathTypeMismatch("Expected an int when adding to an int");
|
||||
} else {
|
||||
syntaxError.mathCannotDoOperationOnType("--", "non-int");
|
||||
}
|
||||
} else if (tokens[i].keyword == keywords::ADDTO) {
|
||||
if (tokens.size() < i + 1) syntaxError.mathTooFewArgs();
|
||||
if (tokens[i + 1].value.type != variables[varName].type) syntaxError.mathTypeMismatch("Expected same type when adding");
|
||||
if (variables[varName].type == valtype::INT) {
|
||||
variables[varName].value = get<int>(variables[varName].value) + get<int>(tokens[i + 1].value.value);
|
||||
} else if (tokens[i].keyword == keywords::SUBTRACTFROM) {
|
||||
if (tokens.size() < i + 1) syntaxError.mathTooFewArgs();
|
||||
if (tokens[i + 1].value.type != valtype::INT) syntaxError.mathTypeMismatch("Expected an int when subtracting from an int");
|
||||
variables[varName].value = get<int>(variables[varName].value) - get<int>(tokens[i + 1].value.value);
|
||||
} else if (tokens[i].keyword == keywords::SET) {
|
||||
if (tokens.size() < i + 1) syntaxError.mathTooFewArgs();
|
||||
if (tokens[i + 1].value.type != valtype::INT) syntaxError.mathTypeMismatch("Expected an int when changing an int");
|
||||
variables[varName].value = get<int>(tokens[i + 1].value.value);
|
||||
} else {
|
||||
syntaxError.mathCannotDoOperationOnType("unknown", "int");
|
||||
}
|
||||
} else if (variables[varName].type == valtype::DEC) {
|
||||
if (tokens[i].keyword == keywords::INCREMENT) {
|
||||
variables[varName].value = get<double>(variables[varName].value) + 1;
|
||||
} else if (tokens[i].keyword == keywords::DECREMENT) {
|
||||
variables[varName].value = get<double>(variables[varName].value) - 1;
|
||||
} else if (tokens[i].keyword == keywords::ADDTO) {
|
||||
if (tokens.size() < i + 1) syntaxError.mathTooFewArgs();
|
||||
if (tokens[i + 1].value.type != valtype::DEC) syntaxError.mathTypeMismatch("Expected an dec when adding to an dec");
|
||||
} else if (variables[varName].type == valtype::DEC) {
|
||||
variables[varName].value = get<double>(variables[varName].value) + get<double>(tokens[i + 1].value.value);
|
||||
} else if (tokens[i].keyword == keywords::SUBTRACTFROM) {
|
||||
if (tokens.size() < i + 1) syntaxError.mathTooFewArgs();
|
||||
if (tokens[i + 1].value.type != valtype::DEC) syntaxError.mathTypeMismatch("Expected an dec when subtracting from an dec");
|
||||
variables[varName].value = get<double>(variables[varName].value) - get<double>(tokens[i + 1].value.value);
|
||||
} else if (tokens[i].keyword == keywords::SET) {
|
||||
if (tokens.size() < i + 1) syntaxError.mathTooFewArgs();
|
||||
if (tokens[i + 1].value.type != valtype::DEC) syntaxError.mathTypeMismatch("Expected a dec when changing a dec");
|
||||
variables[varName].value = get<int>(tokens[i + 1].value.value);
|
||||
} else {
|
||||
syntaxError.mathCannotDoOperationOnType("unknown", "dec");
|
||||
syntaxError.mathCannotDoOperationOnType("+=", "non-numeric");
|
||||
}
|
||||
i++;
|
||||
} else {
|
||||
syntaxError.mathCannotDoOperationOnType("unknown", "any");
|
||||
}
|
||||
} else {
|
||||
syntaxError.unknownFn();
|
||||
|
|
Loading…
Reference in New Issue
Block a user