Merge pull request #171 from biveraxe/ver4dev

Вложенные ифы
This commit is contained in:
2022-08-27 22:01:32 +03:00
committed by GitHub
3 changed files with 27 additions and 27 deletions

View File

@@ -45,16 +45,16 @@ class IoTScenario {
/// identifierexpr
/// ::= identifier
/// ::= identifier '(' expression* ')'
ExprAST *ParseIdentifierExpr(String *IDNames);
ExprAST *ParseIdentifierExpr(String *IDNames, bool callFromCondition);
/// numberexpr ::= number
ExprAST *ParseNumberExpr();
/// parenexpr ::= '(' expression ')'
ExprAST *ParseParenExpr();
ExprAST *ParseParenExpr(String *IDNames, bool callFromCondition);
/// bracketsexpr ::= '{' expression '}'
ExprAST *ParseBracketsExpr();
ExprAST *ParseBracketsExpr(String *IDNames, bool callFromCondition);
/// quotesexpr ::= '"' expression '"'
ExprAST *ParseQuotesExpr();
@@ -66,16 +66,16 @@ class IoTScenario {
/// ::= identifierexpr
/// ::= numberexpr
/// ::= parenexpr
ExprAST *ParsePrimary(String *IDNames);
ExprAST *ParsePrimary(String *IDNames, bool callFromCondition);
/// binoprhs
/// ::= ('+' primary)*
ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames);
ExprAST *ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames, bool callFromCondition);
/// expression
/// ::= primary binoprhs
///
ExprAST *ParseExpression(String *IDNames);
ExprAST *ParseExpression(String *IDNames, bool callFromCondition);
std::vector<ExprAST *> ScenarioElements; // корневые элементы дерава

View File

@@ -720,7 +720,7 @@ ExprAST *IoTScenario::Error(const char *Str) {
/// identifierexpr
/// ::= identifier
/// ::= identifier '(' expression* ')'
ExprAST *IoTScenario::ParseIdentifierExpr(String *IDNames) {
ExprAST *IoTScenario::ParseIdentifierExpr(String *IDNames, bool callFromCondition) {
String IdName = IdentifierStr;
String Cmd = "";
IoTItem *tmpItem = findIoTItem(IdName);
@@ -746,7 +746,7 @@ ExprAST *IoTScenario::ParseIdentifierExpr(String *IDNames) {
std::vector<ExprAST *> Args;
if (CurTok != ')') {
while (1) {
ExprAST *Arg = ParseExpression(IDNames);
ExprAST *Arg = ParseExpression(IDNames, callFromCondition);
if (!Arg) return 0;
Args.push_back(Arg);
@@ -775,9 +775,9 @@ ExprAST *IoTScenario::ParseNumberExpr() {
}
/// parenexpr ::= '(' expression ')'
ExprAST *IoTScenario::ParseParenExpr() {
ExprAST *IoTScenario::ParseParenExpr(String *IDNames, bool callFromCondition) {
getNextToken(); // получаем (.
ExprAST *V = ParseExpression(nullptr);
ExprAST *V = ParseExpression(IDNames, callFromCondition);
if (!V) return 0;
if (CurTok != ')')
@@ -787,12 +787,12 @@ ExprAST *IoTScenario::ParseParenExpr() {
}
/// bracketsexpr ::= '{' expression '}'
ExprAST *IoTScenario::ParseBracketsExpr() {
ExprAST *IoTScenario::ParseBracketsExpr(String *IDNames, bool callFromCondition) {
getNextToken(); // получаем {.
std::vector<ExprAST *> bracketsList;
if (CurTok != '}') {
while (1) {
ExprAST *Expr = ParseExpression(nullptr);
ExprAST *Expr = ParseExpression(IDNames, callFromCondition);
if (!Expr) return 0;
bracketsList.push_back(Expr);
@@ -825,14 +825,14 @@ ExprAST *IoTScenario::ParseIfExpr(String *IDNames) {
getNextToken(); // Получаем if.
// условие.
ExprAST *Cond = ParseExpression(IDNames);
ExprAST *Cond = ParseExpression(IDNames, true);
if (!Cond) return 0;
if (CurTok != tok_then)
return Error("expected then");
getNextToken(); // Получаем then
ExprAST *Then = ParseExpression(nullptr);
ExprAST *Then = ParseExpression(IDNames, false);
if (!Then) return 0;
// if (CurTok != tok_else)
@@ -840,7 +840,7 @@ ExprAST *IoTScenario::ParseIfExpr(String *IDNames) {
ExprAST *Else = nullptr;
if (CurTok == tok_else) {
getNextToken();
Else = ParseExpression(nullptr);
Else = ParseExpression(IDNames, false);
}
return new IfExprAST(Cond, Then, Else, IDNames);
@@ -850,23 +850,23 @@ ExprAST *IoTScenario::ParseIfExpr(String *IDNames) {
/// ::= identifierexpr
/// ::= numberexpr
/// ::= parenexpr
ExprAST *IoTScenario::ParsePrimary(String *IDNames) {
ExprAST *IoTScenario::ParsePrimary(String *IDNames, bool callFromCondition) {
switch (CurTok) {
default:
return Error("unknown token when expecting an expression");
case tok_identifier: {
if (IDNames) {
if (callFromCondition && IDNames) {
String tmpstr = *IDNames;
*IDNames = tmpstr + " " + IdentifierStr + " ";
}
return ParseIdentifierExpr(IDNames);
return ParseIdentifierExpr(IDNames, callFromCondition);
}
case tok_number:
return ParseNumberExpr();
case '(':
return ParseParenExpr();
return ParseParenExpr(IDNames, callFromCondition);
case '{':
return ParseBracketsExpr();
return ParseBracketsExpr(IDNames, callFromCondition);
case tok_string:
return ParseQuotesExpr();
case tok_if:
@@ -876,7 +876,7 @@ ExprAST *IoTScenario::ParsePrimary(String *IDNames) {
/// binoprhs
/// ::= ('+' primary)*
ExprAST *IoTScenario::ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames) {
ExprAST *IoTScenario::ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames, bool callFromCondition) {
// Если это бинарный оператор, получаем его приоритет
while (1) {
int TokPrec = GetTokPrecedence();
@@ -891,14 +891,14 @@ ExprAST *IoTScenario::ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames)
getNextToken(); // eat binop
// Разобрать первичное выражение после бинарного оператора
ExprAST *RHS = ParsePrimary(IDNames);
ExprAST *RHS = ParsePrimary(IDNames, callFromCondition);
if (!RHS) return 0;
// Если BinOp связан с RHS меньшим приоритетом, чем оператор после RHS,
// то берём часть вместе с RHS как LHS.
int NextPrec = GetTokPrecedence();
if (TokPrec < NextPrec) {
RHS = ParseBinOpRHS(TokPrec + 1, RHS, IDNames);
RHS = ParseBinOpRHS(TokPrec + 1, RHS, IDNames, callFromCondition);
if (RHS == 0) return 0;
}
@@ -910,10 +910,10 @@ ExprAST *IoTScenario::ParseBinOpRHS(int ExprPrec, ExprAST *LHS, String *IDNames)
/// expression
/// ::= primary binoprhs
///
ExprAST *IoTScenario::ParseExpression(String *IDNames) {
ExprAST *LHS = ParsePrimary(IDNames);
ExprAST *IoTScenario::ParseExpression(String *IDNames, bool callFromCondition) {
ExprAST *LHS = ParsePrimary(IDNames, callFromCondition);
if (!LHS) return 0;
return ParseBinOpRHS(0, LHS, IDNames);
return ParseBinOpRHS(0, LHS, IDNames, callFromCondition);
}
void IoTScenario::clearScenarioElements() { // удаляем все корневые элементы дерева AST

View File

@@ -27,7 +27,7 @@
"moduleDesc": "Добавляет инструмент таймеров обратного отсчета для организации периодичных операций или логических конструкций. Часто используется как вспомогательный элемент для автоматизации.",
"propInfo": {
"int": "Задает размер в секундах одного шага(тика) таймера.",
"countDown": "Начальное значение таймера, с которого начинается обратный отсчет.",
"countDown": "Начальное значение таймера, с которого начинается обратный отсчет. countDown=0 - бесконечный счет (имеет смысл при ticker=1, иначе таймер будет выключен), countDown=-1 - отключает таймер совсем (используется для запуска системы с выключенным таймером)",
"ticker": "Генерировать(1) или нет(0) события при каждом тике таймера.",
"repeat": "Сбрасывать(1) или нет(0) таймер в начальное состояние при достижении нуля.",
"needSave": "Требуется сохранять(1) или нет(0) состояние в энерго независимую память. Функция находится в разработке."