Исправляем ошибку перебора корневых ИФов и готовим многорежимность

This commit is contained in:
2022-09-04 11:20:33 +03:00
parent 9403a150ff
commit ed2eb6cfb7
2 changed files with 39 additions and 19 deletions

View File

@@ -12,6 +12,15 @@ class ExprAST {
};
class IoTScenario {
int mode = 0; // режим работы:
// 0 - весь сценарий хранится в FS, читаем посимвольно из файла. Максимальная экономии памяти, но медленно
// 1 - весь сценарий подгружается в String, читаем посимвольно из строки
// 2 - сценарий конвертируется в структуру классов за один проход и выполняется только в памяти. Максимальная
// скорость, но на 8266 при средних сценариях не хватает памяти
String strFromFile;
int charCount;
//===----------------------------------------------------------------------===//
// Lexer (Лексический анализатор)
//===----------------------------------------------------------------------===//

View File

@@ -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;
}
}
}
}