Пример #1
0
        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);
        }
Пример #2
0
        /// <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);
        }