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

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