Files
IoTManager/include/classes/IoTScenario.h

101 lines
4.2 KiB
C
Raw Normal View History

#pragma once
#include "Global.h"
#include "classes/IoTItem.h"
#include <map>
class ExprAST {
2022-08-23 13:06:01 +02:00
public:
virtual ~ExprAST();
virtual IoTValue *exec();
virtual int setValue(IoTValue *val, bool generateEvent); // ret 0 - установка значения не поддерживается наследником
virtual bool hasEventIdName(const String& eventIdName);
};
class IoTScenario {
int mode = 0; // режим работы:
// 0 - весь сценарий хранится в FS, читаем посимвольно из файла. Максимальная экономии памяти, но медленно
// 1 - весь сценарий подгружается в String, читаем посимвольно из строки
// 2 - сценарий конвертируется в структуру классов за один проход и выполняется только в памяти. Максимальная
// скорость, но на 8266 при средних сценариях не хватает памяти
String strFromFile;
int charCount;
2022-08-23 13:06:01 +02:00
//===----------------------------------------------------------------------===//
// Lexer (Лексический анализатор)
//===----------------------------------------------------------------------===//
2022-08-23 13:06:01 +02:00
String IdentifierStr; // Заполняется, если tok_identifier
String NumStr = ""; // Заполняется, если tok_number
int LastChar;
int curLine;
2022-08-23 13:06:01 +02:00
/// gettok - Возвращает следующий токен из стандартного потока ввода.
int gettok();
2022-08-23 13:06:01 +02:00
//===----------------------------------------------------------------------===//
// Parser (Парсер или Синтаксический Анализатор)
//===----------------------------------------------------------------------===//
2022-08-23 13:06:01 +02:00
/// CurTok/getNextToken - Предоставляет простой буфер токенов. CurTok - это текущий
/// токен, просматриваемый парсером. getNextToken получает следующий токен от
/// лексического анализатора и обновляет CurTok.
int CurTok;
int getNextToken();
String IDNames; // накопитель встречающихся идентификаторов в условии
2022-08-23 13:06:01 +02:00
/// BinopPrecedence - Содержит приоритеты для бинарных операторов
std::map<signed char, int> BinopPrecedence;
2022-08-23 13:06:01 +02:00
/// GetTokPrecedence - Возвращает приоритет текущего бинарного оператора.
int GetTokPrecedence();
2022-08-23 13:06:01 +02:00
/// Error* - Это небольшие вспомогательные функции для обработки ошибок.
ExprAST *Error(const String& Str);
2022-08-23 13:06:01 +02:00
/// identifierexpr
/// ::= identifier
/// ::= identifier '(' expression* ')'
ExprAST *ParseIdentifierExpr(String *IDNames, bool callFromCondition);
2022-08-23 13:06:01 +02:00
/// numberexpr ::= number
ExprAST *ParseNumberExpr();
2022-08-23 13:06:01 +02:00
/// parenexpr ::= '(' expression ')'
ExprAST *ParseParenExpr(String *IDNames, bool callFromCondition);
2022-08-23 13:06:01 +02:00
/// bracketsexpr ::= '{' expression '}'
ExprAST *ParseBracketsExpr(String *IDNames, bool callFromCondition);
2022-08-23 13:06:01 +02:00
/// quotesexpr ::= '"' expression '"'
ExprAST *ParseQuotesExpr();
2022-08-23 13:06:01 +02:00
/// ifexpr ::= 'if' expression 'then' expression 'else' expression
ExprAST *ParseIfExpr(String *IDNames);
2022-08-23 13:06:01 +02:00
/// primary
/// ::= identifierexpr
/// ::= numberexpr
/// ::= parenexpr
ExprAST *ParsePrimary(String *IDNames, bool callFromCondition);
2022-08-23 13:06:01 +02:00
/// binoprhs
/// ::= ('+' primary)*
ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames, bool callFromCondition);
2022-08-23 13:06:01 +02:00
/// expression
/// ::= primary binoprhs
///
ExprAST *ParseExpression(String *IDNames, bool callFromCondition);
int getLastChar();
fs::File file;
2022-08-23 13:06:01 +02:00
public:
void loadScenario(String fileName);
void exec(const String& eventIdName);
2022-08-23 13:06:01 +02:00
IoTScenario();
~IoTScenario();
};