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; }
/// <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; }
/// <summary> /// Visits the while statement tree. /// </summary> /// <param name="whileExpr"></param> public object VisitWhile(WhileExpr expr) { _callBackOnNodeStart(expr); expr.Condition.Visit(this); foreach (var stmt in expr.Statements) { stmt.Visit(this); } return null; }