From b347c5c0fb2879b2c24af5697a8c947ea1149326 Mon Sep 17 00:00:00 2001 From: biver Date: Thu, 27 Oct 2022 10:50:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=B2=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B1=D0=B5=D1=81=D1=88=D1=83=D0=BC=D0=BD=D0=BE?= =?UTF-8?q?=D0=B5=20=D0=BF=D1=80=D0=B8=D1=81=D0=B2=D0=BE=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20:=3D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/classes/IoTScenario.h | 2 +- src/classes/IoTScenario.cpp | 27 ++++++++++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/include/classes/IoTScenario.h b/include/classes/IoTScenario.h index 83a47531..9e14a92c 100644 --- a/include/classes/IoTScenario.h +++ b/include/classes/IoTScenario.h @@ -7,7 +7,7 @@ class ExprAST { public: virtual ~ExprAST(); virtual IoTValue *exec(); - virtual int setValue(IoTValue *val); // ret 0 - установка значения не поддерживается наследником + virtual int setValue(IoTValue *val, bool generateEvent); // ret 0 - установка значения не поддерживается наследником virtual bool hasEventIdName(String eventIdName); }; diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 7964852a..bb0a53b2 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -21,6 +21,7 @@ enum Token { tok_notequal = -9, tok_lesseq = -10, tok_greateq = -11, + tok_silentset = -12, // управление tok_if = -6, @@ -35,7 +36,7 @@ enum Token { /// ExprAST - Базовый класс для всех узлов выражений. ExprAST::~ExprAST() {} IoTValue *ExprAST::exec() { return nullptr; } -int ExprAST::setValue(IoTValue *val) { return 0; } // 0 - установка значения не поддерживается наследником +int ExprAST::setValue(IoTValue *val, bool generateEvent) { return 0; } // 0 - установка значения не поддерживается наследником bool ExprAST::hasEventIdName(String eventIdName) { return false; } // по умолчанию все узлы не связаны с ИД события, для которого выполняется сценарий // struct IoTValue zeroIotVal; @@ -84,10 +85,10 @@ class VariableExprAST : public ExprAST { if (item) ItemIsLocal = item->iAmLocal; } - int setValue(IoTValue *val) { + int setValue(IoTValue *val, bool generateEvent) { if (!ItemIsLocal) Item = findIoTItem(Name); if (Item) - Item->setValue(*val); + Item->setValue(*val, generateEvent); else return 0; @@ -148,7 +149,11 @@ class BinaryExprAST : public ExprAST { IoTValue *rhs = RHS->exec(); // получаем значение правого операнда для возможного использования в операции присваивания if (rhs == nullptr) return nullptr; - if (Op == '=' && LHS->setValue(rhs)) { // если установка значения не поддерживается, т.е. слева не переменная, то работаем по другим комбинациям далее + if (Op == '=' && LHS->setValue(rhs, true)) { // если установка значения не поддерживается, т.е. слева не переменная, то работаем по другим комбинациям далее + return rhs; // иначе возвращаем присвоенное значение справа + } + + if (Op == tok_silentset && LHS->setValue(rhs, false)) { // если установка значения не поддерживается, т.е. слева не переменная, то работаем по другим комбинациям далее return rhs; // иначе возвращаем присвоенное значение справа } @@ -211,10 +216,12 @@ class BinaryExprAST : public ExprAST { 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); @@ -699,6 +706,15 @@ int IoTScenario::gettok() { return '='; } + if (LastChar == ':') { + LastChar = getLastChar(); + if (LastChar == '=') { + LastChar = getLastChar(); + return tok_silentset; + } else + return ':'; + } + if (LastChar == '!') { LastChar = getLastChar(); if (LastChar == '=') { @@ -1040,7 +1056,8 @@ void IoTScenario::exec(String eventIdName) { // посимвольно счит IoTScenario::IoTScenario() { // Задаём стандартные бинарные операторы. // 1 - наименьший приоритет. - BinopPrecedence['='] = 1; + BinopPrecedence[tok_silentset] = 1; + BinopPrecedence['='] = 2; BinopPrecedence['|'] = 5; BinopPrecedence['&'] = 6; BinopPrecedence[tok_equal] = 10; // ==