не рабочая версия

This commit is contained in:
Dmitry Borisenko
2022-08-23 13:06:01 +02:00
parent f7849894e5
commit 99e2fcfcb8
5 changed files with 808 additions and 750 deletions

View File

@@ -0,0 +1,3 @@
{
"scen": ""
}

View File

@@ -4,91 +4,91 @@
#include <map>
class ExprAST {
public:
virtual ~ExprAST();
virtual IoTValue* exec();
virtual int setValue(IoTValue *val); // ret 0 - установка значения не поддерживается наследником
virtual bool hasEventIdName(String eventIdName);
public:
virtual ~ExprAST();
virtual IoTValue *exec();
virtual int setValue(IoTValue *val); // ret 0 - установка значения не поддерживается наследником
virtual bool hasEventIdName(String eventIdName);
};
class IoTScenario {
//===----------------------------------------------------------------------===//
// Lexer (Лексический анализатор)
//===----------------------------------------------------------------------===//
//===----------------------------------------------------------------------===//
// Lexer (Лексический анализатор)
//===----------------------------------------------------------------------===//
String IdentifierStr; // Заполняется, если tok_identifier
float NumVal; // Заполняется, если tok_number
char LastChar = ' ';
String IdentifierStr; // Заполняется, если tok_identifier
float NumVal; // Заполняется, если tok_number
char LastChar = ' ';
/// gettok - Возвращает следующий токен из стандартного потока ввода.
int gettok();
/// gettok - Возвращает следующий токен из стандартного потока ввода.
int gettok();
//===----------------------------------------------------------------------===//
// Parser (Парсер или Синтаксический Анализатор)
//===----------------------------------------------------------------------===//
//===----------------------------------------------------------------------===//
// Parser (Парсер или Синтаксический Анализатор)
//===----------------------------------------------------------------------===//
/// CurTok/getNextToken - Предоставляет простой буфер токенов. CurTok - это текущий
/// токен, просматриваемый парсером. getNextToken получает следующий токен от
/// лексического анализатора и обновляет CurTok.
int CurTok;
int getNextToken();
/// CurTok/getNextToken - Предоставляет простой буфер токенов. CurTok - это текущий
/// токен, просматриваемый парсером. getNextToken получает следующий токен от
/// лексического анализатора и обновляет CurTok.
int CurTok;
int getNextToken();
/// BinopPrecedence - Содержит приоритеты для бинарных операторов
std::map<signed char, int> BinopPrecedence;
/// BinopPrecedence - Содержит приоритеты для бинарных операторов
std::map<signed char, int> BinopPrecedence;
/// GetTokPrecedence - Возвращает приоритет текущего бинарного оператора.
int GetTokPrecedence();
/// GetTokPrecedence - Возвращает приоритет текущего бинарного оператора.
int GetTokPrecedence();
/// Error* - Это небольшие вспомогательные функции для обработки ошибок.
ExprAST *Error(const char *Str);
/// Error* - Это небольшие вспомогательные функции для обработки ошибок.
ExprAST *Error(const char *Str);
/// identifierexpr
/// ::= identifier
/// ::= identifier '(' expression* ')'
ExprAST *ParseIdentifierExpr(String *IDNames);
/// identifierexpr
/// ::= identifier
/// ::= identifier '(' expression* ')'
ExprAST *ParseIdentifierExpr(String *IDNames);
/// numberexpr ::= number
ExprAST *ParseNumberExpr();
/// numberexpr ::= number
ExprAST *ParseNumberExpr();
/// parenexpr ::= '(' expression ')'
ExprAST *ParseParenExpr();
/// parenexpr ::= '(' expression ')'
ExprAST *ParseParenExpr();
/// bracketsexpr ::= '{' expression '}'
ExprAST *ParseBracketsExpr();
/// bracketsexpr ::= '{' expression '}'
ExprAST *ParseBracketsExpr();
/// quotesexpr ::= '"' expression '"'
ExprAST *ParseQuotesExpr();
/// quotesexpr ::= '"' expression '"'
ExprAST *ParseQuotesExpr();
/// ifexpr ::= 'if' expression 'then' expression 'else' expression
ExprAST *ParseIfExpr(String* IDNames);
/// ifexpr ::= 'if' expression 'then' expression 'else' expression
ExprAST *ParseIfExpr(String *IDNames);
/// primary
/// ::= identifierexpr
/// ::= numberexpr
/// ::= parenexpr
ExprAST *ParsePrimary(String* IDNames);
/// primary
/// ::= identifierexpr
/// ::= numberexpr
/// ::= parenexpr
ExprAST *ParsePrimary(String *IDNames);
/// binoprhs
/// ::= ('+' primary)*
ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames);
/// binoprhs
/// ::= ('+' primary)*
ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames);
/// expression
/// ::= primary binoprhs
///
ExprAST *ParseExpression(String *IDNames);
/// expression
/// ::= primary binoprhs
///
ExprAST *ParseExpression(String *IDNames);
std::vector<ExprAST*> ScenarioElements; // корневые элементы дерава
std::vector<ExprAST *> ScenarioElements; // корневые элементы дерава
String *strFromFile;
char getLastChar();
int strIterator = 0;
String *strFromFile;
char getLastChar();
int strIterator = 0;
void clearScenarioElements();
void clearScenarioElements();
public:
void loadScenario(String fileName);
void ExecScenario(String eventIdName);
public:
void loadScenario(String fileName);
void ExecScenario(String eventIdName);
IoTScenario();
~IoTScenario();
};
IoTScenario();
~IoTScenario();
};

View File

@@ -63,7 +63,7 @@ void setup() {
asyncUdpInit();
//загрузка сценария
iotScen.loadScenario("/scenario.txt");
iotScen.loadScenario("/scenario.json");
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
IoTItems.push_back((IoTItem *)new externalVariable("{\"id\":\"onStart\",\"val\":1,\"int\":60}"));
generateEvent("onStart", "");

View File

@@ -63,7 +63,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
sendFileToWs("/items.json", num, 1024);
sendFileToWs("/widgets.json", num, 1024);
sendFileToWs("/config.json", num, 1024);
sendFileToWs("/scenario.txt", num, 1024);
sendFileToWs("/scenario.json", num, 1024);
standWebSocket.sendTXT(num, settingsFlashJson);
}
//**сохранение**//
@@ -73,7 +73,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
clearConfigure();
Serial.println("Start config");
configure("/config.json");
iotScen.loadScenario("/scenario.txt");
iotScen.loadScenario("/scenario.json");
}
//**сохранение**//
if (headerStr == "/tuoyal|") {
@@ -81,13 +81,9 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length)
}
//**сохранение**//
if (headerStr == "/oiranecs|") {
if (length - headerLenth == 0) {
SerialPrint("i", "WS", "Scenario file empty");
writeFile("/scenario.txt", "");
} else {
writeFileUint8tByFrames("scenario.txt", payload, length, headerLenth, 256);
iotScen.loadScenario("/scenario.txt");
}
writeFileUint8tByFrames("scenario.json", payload, length, headerLenth, 256);
iotScen.loadScenario("/scenario.json");
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
IoTItems.push_back((IoTItem*)new externalVariable("{\"id\":\"onStart\",\"val\":1,\"int\":60}"));
generateEvent("onStart", "");

File diff suppressed because it is too large Load Diff