mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 22:22:16 +03:00
Исправляем ошибку перебора корневых ИФов и готовим многорежимность
This commit is contained in:
@@ -12,6 +12,15 @@ class ExprAST {
|
||||
};
|
||||
|
||||
class IoTScenario {
|
||||
int mode = 0; // режим работы:
|
||||
// 0 - весь сценарий хранится в FS, читаем посимвольно из файла. Максимальная экономии памяти, но медленно
|
||||
// 1 - весь сценарий подгружается в String, читаем посимвольно из строки
|
||||
// 2 - сценарий конвертируется в структуру классов за один проход и выполняется только в памяти. Максимальная
|
||||
// скорость, но на 8266 при средних сценариях не хватает памяти
|
||||
|
||||
String strFromFile;
|
||||
int charCount;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Lexer (Лексический анализатор)
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
@@ -933,19 +933,28 @@ 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) {
|
||||
if (mode == 0) file.seek(0); else charCount = 0;
|
||||
|
||||
if (mode < 2) {
|
||||
while (CurTok != EOF) {
|
||||
switch (CurTok) {
|
||||
case tok_if: {
|
||||
IDNames = ""; // сбрасываем накопитель встречающихся идентификаторов в условии
|
||||
@@ -960,6 +969,8 @@ void IoTScenario::exec(String eventIdName) { // посимвольно счит
|
||||
}
|
||||
delete tmpAST;
|
||||
break;}
|
||||
default: getNextToken(); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user