public void Visit(AstVisitor astVisitor) { Queue <Ast> queue = new Queue <Ast>(); queue.Enqueue(this); while (queue.Any()) { var nextItem = queue.Dequeue(); AstVisitAction astVisitAction = DispatchVisitor(astVisitor, nextItem); switch (astVisitAction) { case AstVisitAction.Continue: foreach (var item in nextItem.Children) { queue.Enqueue(item); } break; case AstVisitAction.SkipChildren: break; case AstVisitAction.StopVisit: return; default: throw new InvalidOperationException(astVisitAction.ToString()); } } }
public void Visit(AstVisitor astVisitor) { Queue <Ast> queue = new Queue <Ast>(); queue.Enqueue(this); while (queue.Any()) { var nextAst = queue.Dequeue(); AstVisitAction astVisitAction = astVisitor.Visit(nextAst); switch (astVisitAction) { case AstVisitAction.Continue: queue.EnqueueAll(nextAst.Children); break; case AstVisitAction.SkipChildren: break; case AstVisitAction.StopVisit: return; default: throw new InvalidOperationException(astVisitAction.ToString()); } } }