From 30a07548233c013bd16a742da22c4d454c63f24b Mon Sep 17 00:00:00 2001 From: biver Date: Tue, 28 Mar 2023 08:59:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D0=B2=D0=B5=D0=BD=D1=81=D1=82=D0=B2=D0=B0=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=20=D0=B2=20?= =?UTF-8?q?=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/classes/IoTScenario.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 9980fce0..b1c7b988 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -156,8 +156,8 @@ class BinaryExprAST : public ExprAST { IoTValue *lhs = LHS->exec(); // если присваивания не произошло, значит операция иная и необходимо значение левого операнда if (lhs == nullptr) return nullptr; - // все бинарные операции кроме +, - и == обязаны работать с числами - if (Op != '+' && Op != '-' && Op != tok_equal) { + // все бинарные операции кроме +, -, != и == обязаны работать с числами + if (Op != '+' && Op != '-' && Op != tok_equal && Op != tok_notequal) { // поэтому преобразовываем строки в булевые интерпретации if (!lhs->isDecimal) lhs->valD = lhs->valS != ""; // пустая строка = false if (!rhs->isDecimal) rhs->valD = rhs->valS != ""; // пустая строка = false @@ -175,9 +175,6 @@ class BinaryExprAST : public ExprAST { case tok_greateq: val.valD = lhs->valD >= rhs->valD; break; - case tok_notequal: - val.valD = lhs->valD != rhs->valD; - break; case '*': val.valD = lhs->valD * rhs->valD; @@ -199,7 +196,7 @@ class BinaryExprAST : public ExprAST { default: break; } - } else { // иначе имеем дело с операциями + или - или ==, которые могут работать с разными типами данных + } else { // иначе имеем дело с операциями + или - или == или !=, которые могут работать с разными типами данных if (lhs->isDecimal && lhs->valS == "") lhs->valS = (String)lhs->valD; // небольшой костыль пока не переделаем работу со значениями, планируется добавить long, работу со временем, перенести округление и модификаторы в IoTValue if (rhs->isDecimal && rhs->valS == "") rhs->valS = (String)rhs->valD; // пока для сохранения округления в IoTItem применяется хитрость с сохранением внешнего вида числа в строку valS, // но некоторые модули и системные не делают этого, поэтому отлавливаем эту ситуацию тут и учитываем. @@ -211,6 +208,13 @@ class BinaryExprAST : public ExprAST { val.valD = compStr(lhs->valS, rhs->valS); break; + case tok_notequal: + if (lhs->isDecimal && rhs->isDecimal) + val.valD = lhs->valD != rhs->valD; + else + val.valD = !compStr(lhs->valS, rhs->valS); + break; + case '+': if (lhs->isDecimal && rhs->isDecimal) val.valD = lhs->valD + rhs->valD;