Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
   [The "BSD license"]
   Copyright (c) 2005-2009 Terence Parr
   All rights reserved.
   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions
   are met:
   1. Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.
  3. The name of the author may not be used to endorse or promote products
      derived from this software without specific prior written permission.
 package org.antlr.runtime.tree;
Return a node stream from a doubly-linked tree whose nodes know what child index they are. No remove() is supported. Emit navigation nodes (DOWN, UP, and EOF) to let show tree structure.
 public class TreeIterator implements Iterator {
     protected TreeAdaptor adaptor;
     protected Object root;
     protected Object tree;
     protected boolean firstTime = true;
     // navigation nodes to return during walk and at end
     public Object up;
     public Object down;
     public Object eof;

If we emit UP/DOWN nodes, we need to spit out multiple nodes per next() call.
     protected FastQueue nodes;
     public TreeIterator(Object tree) {
         this(new CommonTreeAdaptor(),tree);
     public TreeIterator(TreeAdaptor adaptorObject tree) {
         this. = adaptor;
         this. = tree;
         this. = tree;
          = new FastQueue();
          = adaptor.create(."DOWN");
          = adaptor.create(."UP");
          = adaptor.create(."EOF");
     public void reset() {
          = true;
          = ;
     public boolean hasNext() {
         if (  ) return !=null;
         if ( !=null && .size()>0 ) return true;
         if ( ==null ) return false;
         if ( .getChildCount()>0 ) return true;
         return .getParent()!=null// back at root?
     public Object next() {
         if (  ) { // initial condition
              = false;
             if ( .getChildCount()==0 ) { // single node tree (special)
                 return ;
             return ;
         // if any queued up, use those first
         if ( !=null && .size()>0 ) return .remove();
         // no nodes left?
         if ( ==null ) return ;
        // next node will be child 0 if any children
        if ( .getChildCount()>0 ) {
             = .getChild(, 0);
            .add(); // real node is next after DOWN
            return ;
        // if no children, look for next sibling of tree or ancestor
        Object parent = .getParent();
        // while we're out of siblings, keep popping back up towards root
        while ( parent!=null &&
                .getChildIndex()+1 >= .getChildCount(parent) )
            .add(); // we're moving back up
             = parent;
            parent = .getParent();
        // no nodes left?
        if ( parent==null ) {
             = null// back at root? nothing left then
            .add(); // add to queue, might have UP nodes in there
            return .remove();
        // must have found a node with an unvisited sibling
        // move to it and return it
        int nextSiblingIndex = .getChildIndex() + 1;
         = .getChild(parentnextSiblingIndex);
        .add(); // add to queue, might have UP nodes in there
        return .remove();
    public void remove() { throw new UnsupportedOperationException(); }
New to GrepCode? Check out our FAQ X