示例#1
0
		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;
		}
示例#2
0
        /// <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;
        }
示例#3
0
 /// <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;
 }