From ed2eb6cfb7c176104c31872c2d4a7f765faf1939 Mon Sep 17 00:00:00 2001 From: biver Date: Sun, 4 Sep 2022 11:20:33 +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=D1=83=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B1=D0=BE=D1=80=D0=B0=20=D0=BA=D0=BE?= =?UTF-8?q?=D1=80=D0=BD=D0=B5=D0=B2=D1=8B=D1=85=20=D0=98=D0=A4=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B8=20=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=B8=D0=BC=20=D0=BC?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/classes/IoTScenario.h | 9 +++++++ src/classes/IoTScenario.cpp | 49 +++++++++++++++++++++-------------- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/include/classes/IoTScenario.h b/include/classes/IoTScenario.h index 7a1630df..f212bb8a 100644 --- a/include/classes/IoTScenario.h +++ b/include/classes/IoTScenario.h @@ -12,6 +12,15 @@ class ExprAST { }; class IoTScenario { + int mode = 0; // режим работы: + // 0 - весь сценарий хранится в FS, читаем посимвольно из файла. Максимальная экономии памяти, но медленно + // 1 - весь сценарий подгружается в String, читаем посимвольно из строки + // 2 - сценарий конвертируется в структуру классов за один проход и выполняется только в памяти. Максимальная + // скорость, но на 8266 при средних сценариях не хватает памяти + + String strFromFile; + int charCount; + //===----------------------------------------------------------------------===// // Lexer (Лексический анализатор) //===----------------------------------------------------------------------===// diff --git a/src/classes/IoTScenario.cpp b/src/classes/IoTScenario.cpp index 3b63663d..dd7aad59 100644 --- a/src/classes/IoTScenario.cpp +++ b/src/classes/IoTScenario.cpp @@ -933,33 +933,44 @@ ExprAST *IoTScenario::ParseExpression(String *IDNames, bool callFromCondition) { void IoTScenario::loadScenario(String fileName) { // подготавливаем контекст для чтения и интерпретации файла if (file) file.close(); file = FileFS.open(fileName, "r"); -} - -void IoTScenario::exec(String eventIdName) { // посимвольно считываем и сразу интерпретируем сценарий в дерево AST if (!file) { Error("Open file scenario error"); return; } + + if (mode == 1) { + strFromFile = file.readString(); + file.close(); + } +} + +void IoTScenario::exec(String eventIdName) { // посимвольно считываем и сразу интерпретируем сценарий в дерево AST + if (mode == 0 && !file) return; + LastChar = 0; CurTok = 0; - file.seek(0); curLine = 1; - - while ((getNextToken()) != EOF) { - switch (CurTok) { - case tok_if: { - IDNames = ""; // сбрасываем накопитель встречающихся идентификаторов в условии - ExprAST *tmpAST = ParseIfExpr(&IDNames); - if (!tmpAST) { - Error("IF Expr wrong."); - break; - } - if (tmpAST->hasEventIdName(eventIdName)) { - tmpAST->exec(); - } - delete tmpAST; - break;} + if (mode == 0) file.seek(0); else charCount = 0; + + if (mode < 2) { + while (CurTok != EOF) { + switch (CurTok) { + case tok_if: { + IDNames = ""; // сбрасываем накопитель встречающихся идентификаторов в условии + ExprAST *tmpAST = ParseIfExpr(&IDNames); + if (!tmpAST) { + Error("IF Expr wrong."); + break; + } + + if (tmpAST->hasEventIdName(eventIdName)) { + tmpAST->exec(); + } + delete tmpAST; + break;} + default: getNextToken(); break; + } } } }