Добавляем в сценарии бесшумное присвоение :=

This commit is contained in:
2022-10-27 10:50:09 +03:00
parent f528952137
commit b347c5c0fb
2 changed files with 23 additions and 6 deletions

View File

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

View File

@@ -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; // ==