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 {
|
class IoTScenario {
|
||||||
|
int mode = 0; // режим работы:
|
||||||
|
// 0 - весь сценарий хранится в FS, читаем посимвольно из файла. Максимальная экономии памяти, но медленно
|
||||||
|
// 1 - весь сценарий подгружается в String, читаем посимвольно из строки
|
||||||
|
// 2 - сценарий конвертируется в структуру классов за один проход и выполняется только в памяти. Максимальная
|
||||||
|
// скорость, но на 8266 при средних сценариях не хватает памяти
|
||||||
|
|
||||||
|
String strFromFile;
|
||||||
|
int charCount;
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Lexer (Лексический анализатор)
|
// Lexer (Лексический анализатор)
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|||||||
@@ -933,33 +933,44 @@ ExprAST *IoTScenario::ParseExpression(String *IDNames, bool callFromCondition) {
|
|||||||
void IoTScenario::loadScenario(String fileName) { // подготавливаем контекст для чтения и интерпретации файла
|
void IoTScenario::loadScenario(String fileName) { // подготавливаем контекст для чтения и интерпретации файла
|
||||||
if (file) file.close();
|
if (file) file.close();
|
||||||
file = FileFS.open(fileName, "r");
|
file = FileFS.open(fileName, "r");
|
||||||
}
|
|
||||||
|
|
||||||
void IoTScenario::exec(String eventIdName) { // посимвольно считываем и сразу интерпретируем сценарий в дерево AST
|
|
||||||
if (!file) {
|
if (!file) {
|
||||||
Error("Open file scenario error");
|
Error("Open file scenario error");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mode == 1) {
|
||||||
|
strFromFile = file.readString();
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IoTScenario::exec(String eventIdName) { // посимвольно считываем и сразу интерпретируем сценарий в дерево AST
|
||||||
|
if (mode == 0 && !file) return;
|
||||||
|
|
||||||
LastChar = 0;
|
LastChar = 0;
|
||||||
CurTok = 0;
|
CurTok = 0;
|
||||||
file.seek(0);
|
|
||||||
curLine = 1;
|
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)) {
|
if (mode == 0) file.seek(0); else charCount = 0;
|
||||||
tmpAST->exec();
|
|
||||||
}
|
if (mode < 2) {
|
||||||
delete tmpAST;
|
while (CurTok != EOF) {
|
||||||
break;}
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user