mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 22:22:16 +03:00
Добавляем в сценарии бесшумное присвоение :=
This commit is contained in:
@@ -7,7 +7,7 @@ class ExprAST {
|
|||||||
public:
|
public:
|
||||||
virtual ~ExprAST();
|
virtual ~ExprAST();
|
||||||
virtual IoTValue *exec();
|
virtual IoTValue *exec();
|
||||||
virtual int setValue(IoTValue *val); // ret 0 - установка значения не поддерживается наследником
|
virtual int setValue(IoTValue *val, bool generateEvent); // ret 0 - установка значения не поддерживается наследником
|
||||||
virtual bool hasEventIdName(String eventIdName);
|
virtual bool hasEventIdName(String eventIdName);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ enum Token {
|
|||||||
tok_notequal = -9,
|
tok_notequal = -9,
|
||||||
tok_lesseq = -10,
|
tok_lesseq = -10,
|
||||||
tok_greateq = -11,
|
tok_greateq = -11,
|
||||||
|
tok_silentset = -12,
|
||||||
|
|
||||||
// управление
|
// управление
|
||||||
tok_if = -6,
|
tok_if = -6,
|
||||||
@@ -35,7 +36,7 @@ enum Token {
|
|||||||
/// ExprAST - Базовый класс для всех узлов выражений.
|
/// ExprAST - Базовый класс для всех узлов выражений.
|
||||||
ExprAST::~ExprAST() {}
|
ExprAST::~ExprAST() {}
|
||||||
IoTValue *ExprAST::exec() { return nullptr; }
|
IoTValue *ExprAST::exec() { return nullptr; }
|
||||||
int ExprAST::setValue(IoTValue *val) { return 0; } // 0 - установка значения не поддерживается наследником
|
int ExprAST::setValue(IoTValue *val, bool generateEvent) { return 0; } // 0 - установка значения не поддерживается наследником
|
||||||
bool ExprAST::hasEventIdName(String eventIdName) { return false; } // по умолчанию все узлы не связаны с ИД события, для которого выполняется сценарий
|
bool ExprAST::hasEventIdName(String eventIdName) { return false; } // по умолчанию все узлы не связаны с ИД события, для которого выполняется сценарий
|
||||||
// struct IoTValue zeroIotVal;
|
// struct IoTValue zeroIotVal;
|
||||||
|
|
||||||
@@ -84,10 +85,10 @@ class VariableExprAST : public ExprAST {
|
|||||||
if (item) ItemIsLocal = item->iAmLocal;
|
if (item) ItemIsLocal = item->iAmLocal;
|
||||||
}
|
}
|
||||||
|
|
||||||
int setValue(IoTValue *val) {
|
int setValue(IoTValue *val, bool generateEvent) {
|
||||||
if (!ItemIsLocal) Item = findIoTItem(Name);
|
if (!ItemIsLocal) Item = findIoTItem(Name);
|
||||||
if (Item)
|
if (Item)
|
||||||
Item->setValue(*val);
|
Item->setValue(*val, generateEvent);
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -148,7 +149,11 @@ class BinaryExprAST : public ExprAST {
|
|||||||
IoTValue *rhs = RHS->exec(); // получаем значение правого операнда для возможного использования в операции присваивания
|
IoTValue *rhs = RHS->exec(); // получаем значение правого операнда для возможного использования в операции присваивания
|
||||||
if (rhs == nullptr) return nullptr;
|
if (rhs == nullptr) return nullptr;
|
||||||
|
|
||||||
if (Op == '=' && LHS->setValue(rhs)) { // если установка значения не поддерживается, т.е. слева не переменная, то работаем по другим комбинациям далее
|
if (Op == '=' && LHS->setValue(rhs, true)) { // если установка значения не поддерживается, т.е. слева не переменная, то работаем по другим комбинациям далее
|
||||||
|
return rhs; // иначе возвращаем присвоенное значение справа
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Op == tok_silentset && LHS->setValue(rhs, false)) { // если установка значения не поддерживается, т.е. слева не переменная, то работаем по другим комбинациям далее
|
||||||
return rhs; // иначе возвращаем присвоенное значение справа
|
return rhs; // иначе возвращаем присвоенное значение справа
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -211,10 +216,12 @@ class BinaryExprAST : public ExprAST {
|
|||||||
lhsStr = (String)lhs->valD;
|
lhsStr = (String)lhs->valD;
|
||||||
else
|
else
|
||||||
lhsStr = lhs->valS;
|
lhsStr = lhs->valS;
|
||||||
|
|
||||||
if (rhs->isDecimal)
|
if (rhs->isDecimal)
|
||||||
rhsStr = (String)rhs->valD;
|
rhsStr = (String)rhs->valD;
|
||||||
else
|
else
|
||||||
rhsStr = rhs->valS;
|
rhsStr = rhs->valS;
|
||||||
|
|
||||||
switch (Op) {
|
switch (Op) {
|
||||||
case tok_equal:
|
case tok_equal:
|
||||||
val.valD = compStr(lhsStr, rhsStr);
|
val.valD = compStr(lhsStr, rhsStr);
|
||||||
@@ -699,6 +706,15 @@ int IoTScenario::gettok() {
|
|||||||
return '=';
|
return '=';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (LastChar == ':') {
|
||||||
|
LastChar = getLastChar();
|
||||||
|
if (LastChar == '=') {
|
||||||
|
LastChar = getLastChar();
|
||||||
|
return tok_silentset;
|
||||||
|
} else
|
||||||
|
return ':';
|
||||||
|
}
|
||||||
|
|
||||||
if (LastChar == '!') {
|
if (LastChar == '!') {
|
||||||
LastChar = getLastChar();
|
LastChar = getLastChar();
|
||||||
if (LastChar == '=') {
|
if (LastChar == '=') {
|
||||||
@@ -1040,7 +1056,8 @@ void IoTScenario::exec(String eventIdName) { // посимвольно счит
|
|||||||
IoTScenario::IoTScenario() {
|
IoTScenario::IoTScenario() {
|
||||||
// Задаём стандартные бинарные операторы.
|
// Задаём стандартные бинарные операторы.
|
||||||
// 1 - наименьший приоритет.
|
// 1 - наименьший приоритет.
|
||||||
BinopPrecedence['='] = 1;
|
BinopPrecedence[tok_silentset] = 1;
|
||||||
|
BinopPrecedence['='] = 2;
|
||||||
BinopPrecedence['|'] = 5;
|
BinopPrecedence['|'] = 5;
|
||||||
BinopPrecedence['&'] = 6;
|
BinopPrecedence['&'] = 6;
|
||||||
BinopPrecedence[tok_equal] = 10; // ==
|
BinopPrecedence[tok_equal] = 10; // ==
|
||||||
|
|||||||
Reference in New Issue
Block a user