async Task ProcessCanonicalForAsync(ParsingScript script, string forString) { string[] forTokens = forString.Split(Constants.END_STATEMENT); if (forTokens.Length != 3) { throw new ArgumentException("Expecting: for(init; condition; loopStatement)"); } int startForCondition = script.Pointer; ParsingScript initScript = new ParsingScript(forTokens[0] + Constants.END_STATEMENT); ParsingScript condScript = new ParsingScript(forTokens[1] + Constants.END_STATEMENT); ParsingScript loopScript = new ParsingScript(forTokens[2] + Constants.END_STATEMENT); initScript.ParentScript = script; condScript.ParentScript = script; loopScript.ParentScript = script; await initScript.ExecuteFromAsync(0); int cycles = 0; bool stillValid = true; while (stillValid) { Variable condResult = await condScript.ExecuteFromAsync(0); stillValid = Convert.ToBoolean(condResult.Value); if (!stillValid) { break; } if (MAX_LOOPS > 0 && ++cycles >= MAX_LOOPS) { throw new ArgumentException("Looks like an infinite loop after " + cycles + " cycles."); } script.Pointer = startForCondition; Variable result = await ProcessBlockAsync(script); if (result.IsReturn || result.Type == Variable.VarType.BREAK) { //script.Pointer = startForCondition; //SkipBlock(script); //return; break; } await loopScript.ExecuteFromAsync(0); } script.Pointer = startForCondition; SkipBlock(script); }