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) { 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) { 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 void write_yield_node(yield_node _yield_node) { write_statement(_yield_node); if (_yield_node.ex == null) { bw.Write((byte)0); } else { bw.Write((byte)1); _yield_node.ex.visit(this); } }
public void visit(yield_node _yield_node) { bw.Write((Int16)201); write_yield_node(_yield_node); }
public void read_yield_node(yield_node _yield_node) { read_statement(_yield_node); _yield_node.ex = _read_node() as expression; }
public void visit(yield_node _yield_node) { read_yield_node(_yield_node); }
public override void visit(yield_node yn) { sb.Append("yield "); visit_node(yn.ex); }
public override void visit(yield_node yn) { visit_yield_helper(yn); base.visit(yn); }
public override void visit(yield_node _yield_node) { _yield_node.ex.visit(this); }