From a535a66ca770994643fd307ef6c26f61cb46626c Mon Sep 17 00:00:00 2001 From: biver Date: Mon, 5 Sep 2022 23:24:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B5=D1=80=D1=8B=D0=B2=D0=B0?= =?UTF-8?q?=D0=B5=D0=BC=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D1=81?= =?UTF-8?q?=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B5=20=D0=B1=D1=83=D0=B4=D1=83=D1=82=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=20=D0=B3=D1=80=D1=83=D0=B1=D1=8B=D0=B5=20=D1=81?= =?UTF-8?q?=D0=B8=D0=BD=D1=82=D0=B0=D0=BA=D1=81=D0=B8=D1=87=D0=B5=D1=81?= =?UTF-8?q?=D0=BA=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8.=20?= =?UTF-8?q?=D0=AD=D1=82=D0=BE=20=D0=BF=D0=BE=D0=B7=D0=B2=D0=BE=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D1=82=20=D0=B8=D0=B7=D0=B1=D0=B5=D0=B6=D0=B0=D1=82=D1=8C?= =?UTF-8?q?=20=D0=B1=D0=B5=D1=81=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=83=D0=B7=D0=BB=D0=BE=D0=B2=20=D0=B1?= =?UTF-8?q?=D0=B8=D0=BD=D0=B0=D1=80=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B4=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B2=D0=B0=20=D0=B8=20=D1=83=D1=82=D0=B5=D1=87?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=BF=D0=B0=D0=BC=D1=8F=D1=82=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/classes/IoTScenario.cpp | 38 +++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 1b09eacc..a6102fb2 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -6,7 +6,7 @@ #include "NTP.h" -bool isIotScenException; // признак исключения и попытки прекратить выполнение сценария заранее +bool isIotScenException = false; // признак исключения и попытки прекратить выполнение сценария заранее // Лексический анализатор возвращает токены [0-255], если это неизвестны, // иначе одну из известных единиц кода @@ -734,7 +734,8 @@ int IoTScenario::GetTokPrecedence() { /// Error* - Это небольшие вспомогательные функции для обработки ошибок. ExprAST *IoTScenario::Error(const char *Str) { - Serial.printf("Scenario error in line %d: %s\n", curLine-1, Str); + Serial.printf("Scenario error in line %d: %s\n", curLine, Str); + isIotScenException = true; return nullptr; } @@ -742,6 +743,8 @@ ExprAST *IoTScenario::Error(const char *Str) { /// ::= identifier /// ::= identifier '(' expression* ')' ExprAST *IoTScenario::ParseIdentifierExpr(String *IDNames, bool callFromCondition) { + if (isIotScenException) return nullptr; + String IdName = IdentifierStr; String Cmd = ""; IoTItem *tmpItem = findIoTItem(IdName); @@ -773,8 +776,10 @@ ExprAST *IoTScenario::ParseIdentifierExpr(String *IDNames, bool callFromConditio if (CurTok == ')') break; - if (CurTok != ',') + if (CurTok != ','){ + return Error("Expected ')' or ',' in argument list"); + } getNextToken(); } } @@ -790,6 +795,8 @@ ExprAST *IoTScenario::ParseIdentifierExpr(String *IDNames, bool callFromConditio /// numberexpr ::= number ExprAST *IoTScenario::ParseNumberExpr() { + if (isIotScenException) return nullptr; + ExprAST *Result = new NumberExprAST(NumStr); getNextToken(); // получаем число return Result; @@ -809,6 +816,8 @@ ExprAST *IoTScenario::ParseParenExpr(String *IDNames, bool callFromCondition) { /// bracketsexpr ::= '{' expression '}' ExprAST *IoTScenario::ParseBracketsExpr(String *IDNames, bool callFromCondition) { + if (isIotScenException) return nullptr; + getNextToken(); // получаем {. std::vector bracketsList; @@ -838,6 +847,8 @@ ExprAST *IoTScenario::ParseBracketsExpr(String *IDNames, bool callFromCondition) /// quotesexpr ::= '"' expression '"' ExprAST *IoTScenario::ParseQuotesExpr() { + if (isIotScenException) return nullptr; + String StringCont = IdentifierStr; ExprAST *Result = new StringExprAST(StringCont); getNextToken(); // получаем число @@ -846,6 +857,8 @@ ExprAST *IoTScenario::ParseQuotesExpr() { /// ifexpr ::= 'if' expression 'then' expression 'else' expression ExprAST *IoTScenario::ParseIfExpr(String *IDNames) { + if (isIotScenException) return nullptr; + getNextToken(); // Получаем if. // условие. @@ -903,6 +916,8 @@ ExprAST *IoTScenario::ParsePrimary(String *IDNames, bool callFromCondition) { /// binoprhs /// ::= ('+' primary)* ExprAST *IoTScenario::ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames, bool callFromCondition) { + if (isIotScenException) return nullptr; + // Если это бинарный оператор, получаем его приоритет while (1) { int TokPrec = GetTokPrecedence(); @@ -944,6 +959,8 @@ ExprAST *IoTScenario::ParseExpression(String *IDNames, bool callFromCondition) { void IoTScenario::loadScenario(String fileName) { // подготавливаем контекст для чтения и интерпретации файла + isIotScenException = false; + if (mode == 0) { if (file) file.close(); file = FileFS.open(fileName.c_str(), "r"); @@ -979,15 +996,12 @@ void IoTScenario::exec(String eventIdName) { // посимвольно счит case tok_if: { IDNames = ""; // сбрасываем накопитель встречающихся идентификаторов в условии ExprAST *tmpAST = ParseIfExpr(&IDNames); - if (!tmpAST) { - Error("IF Expr wrong."); - break; - } - - if (tmpAST->hasEventIdName(eventIdName)) { - tmpAST->exec(); - } - delete tmpAST; + if (tmpAST) { + if (tmpAST->hasEventIdName(eventIdName)) { + tmpAST->exec(); + } + delete tmpAST; + } else getNextToken(); break;} default: getNextToken(); break; }