public override void visit(yield_node yn)
 {
     yn.visit(mids);
     // mids.vars - надо установить, какие из них - локальные, какие - из этого класса, какие - являются параметрами функции, а какие - глобальные (все остальные)
     // те, которые являются параметрами, надо скопировать в локальные переменные и переименовать использование везде по ходу данной функции
     // самое сложное - переменные-поля этого класса - они требуют в создаваемом классе, реализующем итератор, хранить Self текущего класса и добавлять это Self везде по ходу алгоритма
     // вначале будем считать, что переменные-поля этого класса и переменные-параметры не захватываются yield
     //base.visit(yn);
 }
Example #2
0
 public override void visit(yield_node yn)
 {
     hasYields = true;
     if (mids != null) // если мы - внутри процедуры
     {
         yn.visit(mids);
     }
     else
     {
         throw new SyntaxError("Yield must be in functions only", "", yn.source_context, yn);
     }
     // mids.vars - надо установить, какие из них - локальные, какие - из этого класса, какие - являются параметрами функции, а какие - глобальные (все остальные)
     // те, которые являются параметрами, надо скопировать в локальные переменные и переименовать использование везде по ходу данной функции
     // самое сложное - переменные-поля этого класса - они требуют в создаваемом классе, реализующем итератор, хранить Self текущего класса и добавлять это Self везде по ходу алгоритма
     // вначале будем считать, что переменные-поля этого класса и переменные-параметры не захватываются yield
     //base.visit(yn);
 }
Example #3
0
        public override void visit(yield_node yn)
        {
            var VarIdent = this.NewVarName();

            VarIdent.source_context = yn.ex.source_context;
            var_statement vs;

            if (yn.ex is nil_const)
            {
                vs = new var_statement(VarIdent, new named_type_reference("System.Object"), yn.ex);
            }
            else
            {
                vs = new var_statement(VarIdent, yn.ex);
            }
            vs.source_context = yn.ex.source_context;
            ReplaceStatement(yn, SeqStatements(vs, new yield_node(VarIdent, yn.ex.source_context)));
        }
        public override void visit(yield_node yn)
        {
            if (yn.ex is function_lambda_definition)
            {
                syntax_tree_node sn = yn;
                do
                {
                    sn = sn.Parent;
                } while (sn != null && !(sn is procedure_definition));
                procedure_definition pd = sn as procedure_definition;

                if (sn == null)
                {
                    // этого не будет
                }
                var fh = pd.proc_header as function_header;
                if (fh == null)
                {
                    // этого тоже не будет
                }
                var sq = fh.return_type as sequence_type;
                if (sq == null)
                {
                    // и этого не будет
                }

                var lst   = new List <statement>();
                var newid = new ident(CreateNameForLambdaInYield(), yn.ex.source_context);
                var vs    = new var_statement(newid, sq.elements_type, yn.ex);
                vs.source_context = yn.ex.source_context;
                var newyn = new yield_node(newid, newid.source_context);
                lst.Add(vs);
                lst.Add(newyn);
                ReplaceStatementUsingParent(yn, lst);
            }
        }
Example #5
0
 public virtual void visit(yield_node _yield_node)
 {
     DefaultVisit(_yield_node);
 }
		public override void visit(yield_node _yield_node)
		{
			DefaultVisit(_yield_node);
			pre_do_visit(_yield_node);
			visit(yield_node.ex);
			post_do_visit(_yield_node);
		}
		public virtual void post_do_visit(yield_node _yield_node)
		{
		}
		public virtual void visit(yield_node _yield_node)
		{
			DefaultVisit(_yield_node);
		}
Example #9
0
 public override void visit(yield_node yn)
 {
     visit_yield_helper(yn);
     base.visit(yn);
 }