Добавляем сообщение о ненайденных ИД и исправляем баги

This commit is contained in:
2022-10-22 22:53:49 +03:00
parent 480e20a62e
commit e5a6a7a0c4

View File

@@ -104,6 +104,7 @@ class VariableExprAST : public ExprAST {
return &(Item->value);
}
SerialPrint("E", Name, "Элемент не найден или соединение потеряно", Name);
return nullptr; // Item не найден.
}
};
@@ -145,90 +146,92 @@ class BinaryExprAST : public ExprAST {
if (RHS == nullptr || LHS == nullptr) return nullptr;
IoTValue *rhs = RHS->exec(); // получаем значение правого операнда для возможного использования в операции присваивания
if (rhs == nullptr) return nullptr;
if (Op == '=' && LHS->setValue(rhs)) { // если установка значения не поддерживается, т.е. слева не переменная, то работаем по другим комбинациям далее
return rhs; // иначе возвращаем присвоенное значение справа
}
IoTValue *lhs = LHS->exec(); // если присваивания не произошло, значит операция иная и необходимо значение левого операнда
if (lhs == nullptr) return nullptr;
if (lhs != nullptr && rhs != nullptr) {
if (lhs->isDecimal && rhs->isDecimal) {
switch (Op) {
case '>':
val.valD = lhs->valD > rhs->valD;
break;
case '<':
val.valD = lhs->valD < rhs->valD;
break;
case tok_lesseq:
val.valD = lhs->valD <= rhs->valD;
break;
case tok_greateq:
val.valD = lhs->valD >= rhs->valD;
break;
case tok_equal:
val.valD = lhs->valD == rhs->valD;
break;
case tok_notequal:
val.valD = lhs->valD != rhs->valD;
break;
if (lhs->isDecimal && rhs->isDecimal) {
switch (Op) {
case '>':
val.valD = lhs->valD > rhs->valD;
break;
case '<':
val.valD = lhs->valD < rhs->valD;
break;
case tok_lesseq:
val.valD = lhs->valD <= rhs->valD;
break;
case tok_greateq:
val.valD = lhs->valD >= rhs->valD;
break;
case tok_equal:
val.valD = lhs->valD == rhs->valD;
break;
case tok_notequal:
val.valD = lhs->valD != rhs->valD;
break;
case '+':
val.valD = lhs->valD + rhs->valD;
break;
case '-':
val.valD = lhs->valD - rhs->valD;
break;
case '*':
val.valD = lhs->valD * rhs->valD;
break;
case '/':
if (rhs->valD != 0)
val.valD = lhs->valD / rhs->valD;
else
val.valD = 3.4E+38;
break;
case '+':
val.valD = lhs->valD + rhs->valD;
break;
case '-':
val.valD = lhs->valD - rhs->valD;
break;
case '*':
val.valD = lhs->valD * rhs->valD;
break;
case '/':
if (rhs->valD != 0)
val.valD = lhs->valD / rhs->valD;
else
val.valD = 3.4E+38;
break;
case '|':
val.valD = lhs->valD || rhs->valD;
break;
case '&':
val.valD = lhs->valD && rhs->valD;
break;
case '|':
val.valD = lhs->valD || rhs->valD;
break;
case '&':
val.valD = lhs->valD && rhs->valD;
break;
default:
break;
}
return &val;
}
if (!lhs->isDecimal || !rhs->isDecimal) {
if (lhs->isDecimal)
lhsStr = (String)lhs->valD;
else
lhsStr = lhs->valS;
if (rhs->isDecimal)
rhsStr = (String)rhs->valD;
else
rhsStr = rhs->valS;
switch (Op) {
case tok_equal:
val.valD = compStr(lhsStr, rhsStr);
break;
case '+':
val.valS = lhsStr + rhsStr;
val.valD = 1;
val.isDecimal = false;
break;
default:
break;
}
return &val;
default:
break;
}
return &val;
}
if (!lhs->isDecimal || !rhs->isDecimal) {
if (lhs->isDecimal)
lhsStr = (String)lhs->valD;
else
lhsStr = lhs->valS;
if (rhs->isDecimal)
rhsStr = (String)rhs->valD;
else
rhsStr = rhs->valS;
switch (Op) {
case tok_equal:
val.valD = compStr(lhsStr, rhsStr);
break;
case '+':
val.valS = lhsStr + rhsStr;
val.valD = 1;
val.isDecimal = false;
break;
default:
break;
}
return &val;
}
return &val;
}
@@ -544,7 +547,8 @@ class IfExprAST : public ExprAST {
return nullptr; //&zeroIotVal;
}
if (cond_ret->isDecimal && cond_ret->valD) {
// если число больше нуля или строка не равна пустой, то считаем условие выполненным
if (cond_ret->isDecimal && cond_ret->valD || !(cond_ret->isDecimal) && cond_ret->valS != "") {
if (Then == nullptr) return nullptr;
res_ret = Then->exec();
} else {