From a010859c0684480b3730df50781d5b55f683491f Mon Sep 17 00:00:00 2001 From: biver Date: Sat, 3 Sep 2022 21:32:39 +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=D0=B8=20?= =?UTF-8?q?=D0=B2=20=D1=81=D0=B8=D0=BD=D1=82=D0=B0=D0=BA=D1=81=D0=B8=D1=81?= =?UTF-8?q?=D0=B5=20=D0=B8=20=D0=B4=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=98=D0=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/classes/IoTScenario.h | 12 +++---- src/classes/IoTScenario.cpp | 68 ++++++++++++++++++----------------- 2 files changed, 42 insertions(+), 38 deletions(-) diff --git a/include/classes/IoTScenario.h b/include/classes/IoTScenario.h index ec0dc516..7a1630df 100644 --- a/include/classes/IoTScenario.h +++ b/include/classes/IoTScenario.h @@ -47,16 +47,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(); @@ -68,16 +68,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); int getLastChar(); fs::File file; diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 4e9b9284..3b63663d 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -728,7 +728,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); @@ -754,7 +754,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 nullptr; Args.push_back(Arg); @@ -783,9 +783,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 nullptr; if (CurTok != ')') @@ -795,28 +795,31 @@ 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); + + while (CurTok != '}') { + ExprAST *Expr = ParseExpression(IDNames, callFromCondition); if (!Expr) return nullptr; bracketsList.push_back(Expr); + + //if (CurTok == '}') break; - if (CurTok != ';') - return Error("Expected ';' in operation list"); - int ttok = getNextToken(); - if (!ttok) { - Error("Expected '}'"); - break; - } + Serial.printf("ParseBracketsExpr CurTok = %d \n", CurTok); - if (CurTok == '}') break; + + + //if (CurTok != ';') + // return Error("Expected ';' in operation list"); + + //int ttok = getNextToken(); + if (CurTok == tok_eof) { + return Error("Expected '}'"); + } } - } - //getNextToken(); // получаем }. + getNextToken(); // получаем }. return new BracketsExprAST(bracketsList); } @@ -833,14 +836,14 @@ ExprAST *IoTScenario::ParseIfExpr(String *IDNames) { getNextToken(); // Получаем if. // условие. - ExprAST *Cond = ParseExpression(IDNames); + ExprAST *Cond = ParseExpression(IDNames, true); if (!Cond) return nullptr; if (CurTok != tok_then) return Error("expected then"); getNextToken(); // Получаем then - ExprAST *Then = ParseExpression(nullptr); + ExprAST *Then = ParseExpression(IDNames, false); if (!Then) return nullptr; // if (CurTok != tok_else) @@ -848,7 +851,8 @@ ExprAST *IoTScenario::ParseIfExpr(String *IDNames) { ExprAST *Else = nullptr; if (CurTok == tok_else) { getNextToken(); - Else = ParseExpression(nullptr); + Else = ParseExpression(IDNames, false); + if (!Else) return nullptr; } return new IfExprAST(Cond, Then, Else, IDNames); @@ -858,24 +862,24 @@ ExprAST *IoTScenario::ParseIfExpr(String *IDNames) { /// ::= identifierexpr /// ::= numberexpr /// ::= parenexpr -ExprAST *IoTScenario::ParsePrimary(String *IDNames) { +ExprAST *IoTScenario::ParsePrimary(String *IDNames, bool callFromCondition) { switch (CurTok) { default: Serial.println(CurTok); 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: @@ -885,7 +889,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(); @@ -900,14 +904,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 nullptr; // Если 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 == nullptr) return nullptr; } @@ -919,10 +923,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 nullptr; - return ParseBinOpRHS(0, LHS, IDNames); + return ParseBinOpRHS(0, LHS, IDNames, callFromCondition); }