Exemple #1
0
        /// <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();
        }
Exemple #3
0
 /// <summary>
 ///		Comprueba si se ha terminado un bucle for
 /// </summary>
 private bool IsEndForLoop(VariableModel index, VariableModel end, bool isPositiveStep)
 {
     if (isPositiveStep)
     {
         return(index.IsGreaterThan(end));
     }
     else
     {
         return(index.IsLessThan(end));
     }
 }