From cc1938b16526e252a20d9b981838502469380f34 Mon Sep 17 00:00:00 2001 From: biver Date: Sat, 27 Aug 2022 20:21:43 +0300 Subject: [PATCH 1/2] =?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=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=B8=D1=84=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/classes/IoTScenario.h | 12 +++++------ src/classes/IoTScenario.cpp | 40 +++++++++++++++++------------------ 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/include/classes/IoTScenario.h b/include/classes/IoTScenario.h index 6308fd26..69c84126 100644 --- a/include/classes/IoTScenario.h +++ b/include/classes/IoTScenario.h @@ -45,16 +45,16 @@ class IoTScenario { /// identifierexpr /// ::= identifier /// ::= identifier '(' expression* ')' - ExprAST *ParseIdentifierExpr(String *IDNames); + ExprAST *ParseIdentifierExpr(String *IDNames, bool callFromCondition); /// numberexpr ::= number ExprAST *ParseNumberExpr(); /// parenexpr ::= '(' expression ')' - ExprAST *ParseParenExpr(); + ExprAST *ParseParenExpr(String *IDNames, bool callFromCondition); /// bracketsexpr ::= '{' expression '}' - ExprAST *ParseBracketsExpr(); + ExprAST *ParseBracketsExpr(String *IDNames, bool callFromCondition); /// quotesexpr ::= '"' expression '"' ExprAST *ParseQuotesExpr(); @@ -66,16 +66,16 @@ class IoTScenario { /// ::= identifierexpr /// ::= numberexpr /// ::= parenexpr - ExprAST *ParsePrimary(String *IDNames); + ExprAST *ParsePrimary(String *IDNames, bool callFromCondition); /// binoprhs /// ::= ('+' primary)* - ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames); + ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames, bool callFromCondition); /// expression /// ::= primary binoprhs /// - ExprAST *ParseExpression(String *IDNames); + ExprAST *ParseExpression(String *IDNames, bool callFromCondition); std::vector ScenarioElements; // корневые элементы дерава diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 29e9161a..700fc3da 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -720,7 +720,7 @@ ExprAST *IoTScenario::Error(const char *Str) { /// identifierexpr /// ::= identifier /// ::= identifier '(' expression* ')' -ExprAST *IoTScenario::ParseIdentifierExpr(String *IDNames) { +ExprAST *IoTScenario::ParseIdentifierExpr(String *IDNames, bool callFromCondition) { String IdName = IdentifierStr; String Cmd = ""; IoTItem *tmpItem = findIoTItem(IdName); @@ -746,7 +746,7 @@ ExprAST *IoTScenario::ParseIdentifierExpr(String *IDNames) { std::vector Args; if (CurTok != ')') { while (1) { - ExprAST *Arg = ParseExpression(IDNames); + ExprAST *Arg = ParseExpression(IDNames, callFromCondition); if (!Arg) return 0; Args.push_back(Arg); @@ -775,9 +775,9 @@ ExprAST *IoTScenario::ParseNumberExpr() { } /// parenexpr ::= '(' expression ')' -ExprAST *IoTScenario::ParseParenExpr() { +ExprAST *IoTScenario::ParseParenExpr(String *IDNames, bool callFromCondition) { getNextToken(); // получаем (. - ExprAST *V = ParseExpression(nullptr); + ExprAST *V = ParseExpression(IDNames, callFromCondition); if (!V) return 0; if (CurTok != ')') @@ -787,12 +787,12 @@ ExprAST *IoTScenario::ParseParenExpr() { } /// bracketsexpr ::= '{' expression '}' -ExprAST *IoTScenario::ParseBracketsExpr() { +ExprAST *IoTScenario::ParseBracketsExpr(String *IDNames, bool callFromCondition) { getNextToken(); // получаем {. std::vector bracketsList; if (CurTok != '}') { while (1) { - ExprAST *Expr = ParseExpression(nullptr); + ExprAST *Expr = ParseExpression(IDNames, callFromCondition); if (!Expr) return 0; bracketsList.push_back(Expr); @@ -825,14 +825,14 @@ ExprAST *IoTScenario::ParseIfExpr(String *IDNames) { getNextToken(); // Получаем if. // условие. - ExprAST *Cond = ParseExpression(IDNames); + ExprAST *Cond = ParseExpression(IDNames, true); if (!Cond) return 0; if (CurTok != tok_then) return Error("expected then"); getNextToken(); // Получаем then - ExprAST *Then = ParseExpression(nullptr); + ExprAST *Then = ParseExpression(IDNames, false); if (!Then) return 0; // if (CurTok != tok_else) @@ -840,7 +840,7 @@ ExprAST *IoTScenario::ParseIfExpr(String *IDNames) { ExprAST *Else = nullptr; if (CurTok == tok_else) { getNextToken(); - Else = ParseExpression(nullptr); + Else = ParseExpression(IDNames, false); } return new IfExprAST(Cond, Then, Else, IDNames); @@ -850,23 +850,23 @@ ExprAST *IoTScenario::ParseIfExpr(String *IDNames) { /// ::= identifierexpr /// ::= numberexpr /// ::= parenexpr -ExprAST *IoTScenario::ParsePrimary(String *IDNames) { +ExprAST *IoTScenario::ParsePrimary(String *IDNames, bool callFromCondition) { switch (CurTok) { default: return Error("unknown token when expecting an expression"); case tok_identifier: { - if (IDNames) { + if (callFromCondition && IDNames) { String tmpstr = *IDNames; *IDNames = tmpstr + " " + IdentifierStr + " "; } - return ParseIdentifierExpr(IDNames); + return ParseIdentifierExpr(IDNames, callFromCondition); } case tok_number: return ParseNumberExpr(); case '(': - return ParseParenExpr(); + return ParseParenExpr(IDNames, callFromCondition); case '{': - return ParseBracketsExpr(); + return ParseBracketsExpr(IDNames, callFromCondition); case tok_string: return ParseQuotesExpr(); case tok_if: @@ -876,7 +876,7 @@ ExprAST *IoTScenario::ParsePrimary(String *IDNames) { /// binoprhs /// ::= ('+' primary)* -ExprAST *IoTScenario::ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames) { +ExprAST *IoTScenario::ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames, bool callFromCondition) { // Если это бинарный оператор, получаем его приоритет while (1) { int TokPrec = GetTokPrecedence(); @@ -891,14 +891,14 @@ ExprAST *IoTScenario::ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames) getNextToken(); // eat binop // Разобрать первичное выражение после бинарного оператора - ExprAST *RHS = ParsePrimary(IDNames); + ExprAST *RHS = ParsePrimary(IDNames, callFromCondition); if (!RHS) return 0; // Если BinOp связан с RHS меньшим приоритетом, чем оператор после RHS, // то берём часть вместе с RHS как LHS. int NextPrec = GetTokPrecedence(); if (TokPrec < NextPrec) { - RHS = ParseBinOpRHS(TokPrec + 1, RHS, IDNames); + RHS = ParseBinOpRHS(TokPrec + 1, RHS, IDNames, callFromCondition); if (RHS == 0) return 0; } @@ -910,10 +910,10 @@ ExprAST *IoTScenario::ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames) /// expression /// ::= primary binoprhs /// -ExprAST *IoTScenario::ParseExpression(String *IDNames) { - ExprAST *LHS = ParsePrimary(IDNames); +ExprAST *IoTScenario::ParseExpression(String *IDNames, bool callFromCondition) { + ExprAST *LHS = ParsePrimary(IDNames, callFromCondition); if (!LHS) return 0; - return ParseBinOpRHS(0, LHS, IDNames); + return ParseBinOpRHS(0, LHS, IDNames, callFromCondition); } void IoTScenario::clearScenarioElements() { // удаляем все корневые элементы дерева AST From af6289693c64ff3524e68e23840f2a1ea41a32f8 Mon Sep 17 00:00:00 2001 From: biver Date: Sat, 27 Aug 2022 20:38:44 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D1=80=D0=BE=D0=B1=D0=BD?= =?UTF-8?q?=D0=B5=D0=B5=20=D0=BE=D0=BF=D0=B8=D1=81=D1=8B=D0=B2=D0=B0=D0=B5?= =?UTF-8?q?=D0=BC=20=D1=82=D0=B0=D0=B9=D0=BC=D0=B5=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/virtual/Timer/modinfo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/virtual/Timer/modinfo.json b/src/modules/virtual/Timer/modinfo.json index f2256166..a55a5f80 100644 --- a/src/modules/virtual/Timer/modinfo.json +++ b/src/modules/virtual/Timer/modinfo.json @@ -27,7 +27,7 @@ "moduleDesc": "Добавляет инструмент таймеров обратного отсчета для организации периодичных операций или логических конструкций. Часто используется как вспомогательный элемент для автоматизации.", "propInfo": { "int": "Задает размер в секундах одного шага(тика) таймера.", - "countDown": "Начальное значение таймера, с которого начинается обратный отсчет.", + "countDown": "Начальное значение таймера, с которого начинается обратный отсчет. countDown=0 - бесконечный счет (имеет смысл при ticker=1, иначе таймер будет выключен), countDown=-1 - отключает таймер совсем (используется для запуска системы с выключенным таймером)", "ticker": "Генерировать(1) или нет(0) события при каждом тике таймера.", "repeat": "Сбрасывать(1) или нет(0) таймер в начальное состояние при достижении нуля.", "needSave": "Требуется сохранять(1) или нет(0) состояние в энерго независимую память. Функция находится в разработке."