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()); } } }