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