/// <summary> /// Execute /// </summary> public object VisitWhile(WhileExpr expr) { expr.DoContinueRunning = true; expr.DoBreakLoop = false; expr.DoContinueLoop = false; var result = expr.Condition.Evaluate(this) as LObject; expr.DoContinueRunning = EvalHelper.IsTrue(result); while (expr.DoContinueRunning) { if (expr.Statements != null && expr.Statements.Count > 0) { foreach (var stmt in expr.Statements) { stmt.Evaluate(this); this.Ctx.Limits.CheckLoop(expr); // If Break statment executed. if (expr.DoBreakLoop) { expr.DoContinueRunning = false; break; } // Continue statement. else if (expr.DoContinueLoop) break; } } else break; // Break loop here. if (expr.DoContinueRunning == false) break; result = expr.Condition.Evaluate(this) as LObject; expr.DoContinueRunning = EvalHelper.IsTrue(result); } return LObjects.Null; }
public Expr OnParseWhile() { var tokenIt = this._parser.TokenIt; var initiatorToken = tokenIt.NextToken; var expr = new WhileExpr(); // <codeWhile> tokenIt.Expect(Tokens.While); ParseConditionalBlock(expr); // </codeWhile> this._parser.SetupContext(expr, initiatorToken); return expr; }