/// <summary> /// Ejecuta una sentencia for /// </summary> private void ExecuteFor(SentenceFor sentence) { if (string.IsNullOrWhiteSpace(sentence.Variable)) { AddError("Cant find the variable name for loop index"); } else if (string.IsNullOrWhiteSpace(sentence.StartExpression)) { AddError("Cant find the start expression for loop index"); } else if (string.IsNullOrWhiteSpace(sentence.EndExpression)) { AddError("Cant find the end expression for loop index"); } else { VariableModel start = GetVariableValue($"StartIndex_Context{Context.Actual.ScopeIndex}", sentence.StartExpression); VariableModel end = GetVariableValue($"EndIndex_Context{Context.Actual.ScopeIndex}", sentence.EndExpression); if (start.Type != end.Type) { AddError("The types of start and end variable at for loop are distinct"); } else if (start.Type != VariableModel.VariableType.Numeric && start.Type != VariableModel.VariableType.Date) { AddError("The value of start and end at for loop must be numeric or date"); } else { VariableModel step = GetVariableValue($"StepIndex_Context{Context.Actual.ScopeIndex}", NormalizeStepExpression(sentence.StepExpression)); if (step.Value == null) { AddError("Cant find any value to step in for loop"); } else { VariableModel index = new VariableModel(sentence.Variable, start.Value); bool isPositiveStep = step.IsGreaterThan(0); // Abre un nuevo contexto Context.Add(); // Añade la variable al contexto Context.Actual.VariablesTable.Add(sentence.Variable, index.Value); // Ejecuta las sentencias while (!IsEndForLoop(index, end, isPositiveStep)) { // Ejecuta las sentencias Execute(sentence.Sentences); // Incrementa / decrementa el valor al índice (el step debería ser -x si es negativo, por tanto, siempre se suma) index.Sum(step); // y lo ajusta en el contexto Context.Actual.VariablesTable.Add(index); } // Elimina el contexto Context.Pop(); } } } }
/// <summary> /// Ejecuta el contenido de un bucle for /// </summary> private async Task ExecuteForLoopAsync(SentenceFor sentence, VariableModel start, VariableModel end, VariableModel step, CancellationToken cancellationToken) { VariableModel index = new VariableModel(sentence.Variable.Name, ConvertSymbolType(sentence.Variable.Type)); bool isPositiveStep = step.IsGreaterThan(0); // Asigna el valor inicial a la variable de índice index.Value = start.Value; // Abre un nuevo contexto Context.Add(); // Añade la variable al contexto Context.Actual.VariablesTable.Add(index); // Ejecuta las sentencias while (!IsEndForLoop(index, end, isPositiveStep) && !Stopped) { // Ejecuta las sentencias await ExecuteAsync(sentence.Sentences, cancellationToken); // Incrementa / decrementa el valor al índice (el step debería ser -x si es negativo, por tanto, siempre se suma) index.Sum(step); // y lo ajusta en el contexto Context.Actual.VariablesTable.Add(index); } // Elimina el contexto Context.Pop(); }