public override void visit(yield_node yn) { yn.visit(mids); // mids.vars - надо установить, какие из них - локальные, какие - из этого класса, какие - являются параметрами функции, а какие - глобальные (все остальные) // те, которые являются параметрами, надо скопировать в локальные переменные и переименовать использование везде по ходу данной функции // самое сложное - переменные-поля этого класса - они требуют в создаваемом классе, реализующем итератор, хранить Self текущего класса и добавлять это Self везде по ходу алгоритма // вначале будем считать, что переменные-поля этого класса и переменные-параметры не захватываются yield //base.visit(yn); }
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); }
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); } }
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 override void visit(yield_node yn) { visit_yield_helper(yn); base.visit(yn); }