Exemplo n.º 1
0
        public Expr OnParseFor()
        {
            var tokenIt        = _parser.TokenIt;
            var initiatorToken = tokenIt.NextToken;

            // <codeFor>

            if (initiatorToken.Token == Tokens.For)
            {
                tokenIt.ExpectMany(Tokens.For, Tokens.LeftParenthesis);
                var ahead = tokenIt.Peek(1);
                if (ahead.Token == Tokens.In)
                {
                    return(OnParseForEach());
                }
            }

            var start     = _parser.ParseStatement();
            var condition = _parser.ParseExpression(Terminators.ExpSemicolonEnd);

            tokenIt.Advance();
            var name      = tokenIt.ExpectId();
            var increment = _parser.ParseUnary(name, false);

            tokenIt.Expect(Tokens.RightParenthesis);
            var expr = Exprs.For(start, condition, increment, initiatorToken) as BlockExpr;

            ParseBlock(expr);

            // </codeFor>
            _parser.SetupContext(expr, initiatorToken);
            return(expr);
        }
Exemplo n.º 2
0
        public Expr OnParseForEach()
        {
            var tokenIt        = _parser.TokenIt;
            var initiatorToken = tokenIt.NextToken;

            // <codeForEach>

            if (initiatorToken.Token == Tokens.For)
            {
                tokenIt.ExpectMany(Tokens.For, Tokens.LeftParenthesis);
                var ahead = tokenIt.Peek(1);
                if (ahead.Token != Tokens.In)
                {
                    return(OnParseFor());
                }
            }

            var varname = tokenIt.ExpectId();

            tokenIt.Expect(Tokens.In);

            var sourceExpr = _parser.ParseExpression(Terminators.ExpParenthesisNewLineEnd, true, false, true, false, false);

            tokenIt.Expect(Tokens.RightParenthesis);
            var expr = Exprs.ForEach(varname, sourceExpr, initiatorToken) as BlockExpr;

            ParseBlock(expr);

            // </codeForEach>
            _parser.SetupContext(expr, initiatorToken);
            return(expr);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Parses a block by first pushing symbol scope and then popping after completion.
        /// </summary>
        public void ParseBlock(IBlockExpr expr)
        {
            _parser.Context.Symbols.Push(new SymbolsNested(string.Empty), true);
            expr.SymScope = _parser.Context.Symbols.Current;
            var withPush = false;

            if (expr is ForEachExpr)
            {
                var foreachExpr = expr as ForEachExpr;
                if (foreachExpr.EnableAutoVariable)
                {
                    var name = foreachExpr.VarName;
                    Exprs.WithPush(name);
                    withPush = true;
                }
            }
            _parser.ParseBlock(expr);
            _parser.Context.Symbols.Pop();
            if (withPush)
            {
                Exprs.WithPop();
            }
        }