From bea3ff33000bcc9e8eb698a85cee43cae5fba316 Mon Sep 17 00:00:00 2001 From: biver Date: Tue, 30 Aug 2022 23:31:38 +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=B1=D0=B0=D0=B3=20=D1=81=20=D1=84=D0=B8?= =?UTF-8?q?=D0=B3=D1=83=D1=80=D0=BD=D1=8B=D0=BC=D0=B8=20=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=B1=D0=BA=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/classes/IoTScenario.h | 1 + src/classes/IoTScenario.cpp | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/include/classes/IoTScenario.h b/include/classes/IoTScenario.h index b717c0e7..ec0dc516 100644 --- a/include/classes/IoTScenario.h +++ b/include/classes/IoTScenario.h @@ -19,6 +19,7 @@ class IoTScenario { String IdentifierStr; // Заполняется, если tok_identifier float NumVal; // Заполняется, если tok_number int LastChar; + int curLine; /// gettok - Возвращает следующий токен из стандартного потока ввода. int gettok(); diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 4ae13341..f60fb280 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -467,7 +467,7 @@ class SysCallExprAST : public ExprAST { } IoTValue *exec() { - Serial.printf("Call from SysCallExprAST exec %d\n", operation); + //Serial.printf("Call from SysCallExprAST exec %d\n", operation); if (isIotScenException) return nullptr; // если прерывание, то сразу выходим @@ -586,8 +586,11 @@ class BracketsExprAST : public ExprAST { //===----------------------------------------------------------------------===// int IoTScenario::getLastChar() { - if (file) return file.read(); - else return EOF; + if (file) { + LastChar = file.read(); + if (LastChar == 10) curLine++; + return LastChar; + } else return EOF; } /// gettok - Возвращает следующий токен из стандартного потока ввода. @@ -712,7 +715,7 @@ int IoTScenario::GetTokPrecedence() { /// Error* - Это небольшие вспомогательные функции для обработки ошибок. ExprAST *IoTScenario::Error(const char *Str) { - Serial.printf("Error: %s\n", Str); + Serial.printf("Scenario error in line %d: %s\n", curLine-1, Str); return nullptr; } @@ -781,7 +784,7 @@ ExprAST *IoTScenario::ParseParenExpr() { if (CurTok != ')') return Error("expected ')'"); - getNextToken(); // получаем ). + //getNextToken(); // получаем ). return V; } @@ -807,7 +810,7 @@ ExprAST *IoTScenario::ParseBracketsExpr() { } } - getNextToken(); // получаем }. + //getNextToken(); // получаем }. return new BracketsExprAST(bracketsList); } @@ -930,13 +933,17 @@ void IoTScenario::exec(String eventIdName) { // посимвольно счит LastChar = 0; CurTok = 0; file.seek(0); + curLine = 1; while ((getNextToken()) != EOF) { switch (CurTok) { case tok_if: { IDNames = ""; // сбрасываем накопитель встречающихся идентификаторов в условии ExprAST *tmpAST = ParseIfExpr(&IDNames); - if (!tmpAST) break; + if (!tmpAST) { + Error("IF Expr wrong."); + break; + } if (tmpAST->hasEventIdName(eventIdName)) { tmpAST->exec();