示例#1
0
        private Statement ProcessForStatement(ForNode node)
        {
            ForStatement statement = new ForStatement();

            symbolTable.PushScope();

            if (node.Initializer != null)
            {
                if (node.Initializer is VariableDeclarationNode)
                {
                    VariableDeclarationStatement initializer =
                        (VariableDeclarationStatement)BuildStatement((StatementNode)node.Initializer);
                    statement.AddInitializer(initializer);
                }
                else
                {
                    Debug.Assert(node.Initializer is ExpressionListNode);

                    ICollection <Expression> initializers =
                        expressionBuilder.BuildExpressionList((ExpressionListNode)node.Initializer);
                    foreach (Expression initializer in initializers)
                    {
                        statement.AddInitializer(initializer);
                    }
                }
            }

            if (node.Condition != null)
            {
                Expression condition = expressionBuilder.BuildExpression(node.Condition);

                if (condition is MemberExpression)
                {
                    condition = expressionBuilder.TransformMemberExpression((MemberExpression)condition);
                }

                statement.AddCondition(condition);
            }

            if (node.Increment != null)
            {
                Debug.Assert(node.Increment is ExpressionListNode);

                ICollection <Expression> increments =
                    expressionBuilder.BuildExpressionList((ExpressionListNode)node.Increment);
                foreach (Expression increment in increments)
                {
                    statement.AddIncrement(increment);
                }
            }

            Statement body = BuildStatement((StatementNode)node.Body);

            statement.AddBody(body);

            symbolTable.PopScope();

            return(statement);
        }