/// <summary> /// Transforma una sentencia do...while /// </summary> /// <remarks> /// Python no tiene una sentencia do... while, por tanto, lo tenemos que hacer más o menos así /// while True: /// print(i) /// i = i + 1 /// if(i > 5): /// break /// </remarks> private void TransformDo(SentenceDo sentence) { // Añade la sentencia while true AddSentence(string.Empty); AddSentence("while True:"); // Añade las sentencias hija AddIndent(); Transform(sentence.Sentences); // Añade el if con el break AddSentence("if not (" + TransformExpressions(sentence.Condition) + "):"); AddIndent(); AddSentence("break"); // Quita las indentaciones, dos veces: una para el if y la otra para el while RemoveIndent(); RemoveIndent(); }
/// <summary> /// Ejecuta un bucle do ... while /// </summary> private async Task ExecuteDoAsync(SentenceDo sentence, CancellationToken cancellationToken) { if (sentence.Condition.Empty) { AddError("Cant find condition for do ... while loop"); } else { bool end = false; // Ejecuta el bucle do { VariableModel result; // Ejecuta las sentencias del bucle await ExecuteWithContextAsync(sentence.Sentences, cancellationToken); // Ejecuta la condición result = await ExecuteExpressionAsync(sentence.Condition, cancellationToken); // Comprueba el resultado if (result != null) { if (result.Type != VariableModel.VariableType.Boolean || !(result.Value is bool resultLogical)) { AddError("Do while condition result is not a logical value"); } else if (!resultLogical) { end = true; } } }while (!end && !Stopped); } }