private Expr ParseForLoop() { var stmt = new ForExpr(); var statements = new List <Expr>(); // While ( condition expression ) // Parse while condition var start = _parser.ParseStatement(); var condition = _parser.ParseExpression(Terminators.ExpSemicolonEnd); _tokenIt.Advance(); string name = _tokenIt.ExpectId(); var increment = _parser.ParseUnary(name, false); _tokenIt.Expect(Tokens.RightParenthesis); stmt.Init(start, condition, increment); ParseBlock(stmt); return(stmt); }
/// <summary> /// run step 123. /// </summary> /// <returns></returns> public override Expr Parse() { var startToken = _tokenIt.NextToken; _tokenIt.ExpectIdText("repeat"); Expr varname = null; Expr startVal = null; Expr endVal = null; Expr incVal = null; Operator op = Operator.LessThanEqual; // Case 1: repeat to 10 if (_tokenIt.NextToken.Token.Text == "to") { var result = ParseTo(); startVal = new ConstantExpr(1.0); _parser.SetScriptPosition(startVal, startToken); op = result.Item1; endVal = result.Item2; incVal = result.Item3; } // Case 2: repeat 1 to 10 else if (_tokenIt.NextToken.Token.Kind == TokenKind.LiteralNumber) { var num = _tokenIt.ExpectNumber(); var result = ParseTo(); startVal = new ConstantExpr(num); _parser.SetScriptPosition(startVal, startToken); op = result.Item1; endVal = result.Item2; incVal = result.Item3; } // Case 3: repeat ndx to 10 else if (_tokenIt.NextToken.Token.Kind == TokenKind.Ident) { var variableName = _tokenIt.ExpectId(); varname = new VariableExpr(variableName); _parser.SetScriptPosition(varname, startToken); if (_tokenIt.NextToken.Token.Type == TokenTypes.Assignment) { _tokenIt.Advance(); // Upto "to" startVal = ParseExpr(_terminatorForTo); } else { startVal = new ConstantExpr(0); _parser.SetScriptPosition(startVal, startToken); } var result = ParseTo(); op = result.Item1; endVal = result.Item2; incVal = result.Item3; } // auto-create variable name. if (varname == null) { varname = new VariableExpr("it"); _parser.SetScriptPosition(varname, startToken); } // Now setup the stmts var ctx = _parser.Context; var startStmt = new AssignExpr(true, varname, startVal); _parser.SetScriptPositionFromNode(startStmt, varname); startStmt.Ctx = ctx; var condition = new CompareExpr(varname, op, endVal); _parser.SetScriptPositionFromNode(condition, endVal); varname.Ctx = ctx; condition.Ctx = ctx; var incExp = new UnaryExpr(varname.ToQualifiedName(), incVal, Operator.PlusEqual, _parser.Context); _parser.SetScriptPositionFromNode(incExp, incVal); var incStmt = new AssignExpr(false, new VariableExpr(varname.ToQualifiedName()), incExp); _parser.SetScriptPositionFromNode(incStmt, incExp); incStmt.Ctx = ctx; var loopStmt = new ForExpr(startStmt, condition, incStmt); ParseBlock(loopStmt); return(loopStmt); }