00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 package org.antlr.runtime.tree;
00029
00030 import org.antlr.runtime.Token;
00031 import org.antlr.runtime.TokenStream;
00032 import org.antlr.runtime.misc.LookaheadStream;
00033 import org.antlr.runtime.misc.IntArray;
00034
00035 import java.util.*;
00036
00037 public class CommonTreeNodeStream extends LookaheadStream<Object> implements TreeNodeStream {
00038 public static final int DEFAULT_INITIAL_BUFFER_SIZE = 100;
00039 public static final int INITIAL_CALL_STACK_SIZE = 10;
00040
00042 protected Object root;
00043
00045 protected TokenStream tokens;
00046
00048 TreeAdaptor adaptor;
00049
00051 protected TreeIterator it;
00052
00054 protected IntArray calls;
00055
00057 protected boolean hasNilRoot = false;
00058
00060 protected int level = 0;
00061
00062 public CommonTreeNodeStream(Object tree) {
00063 this(new CommonTreeAdaptor(), tree);
00064 }
00065
00066 public CommonTreeNodeStream(TreeAdaptor adaptor, Object tree) {
00067 this.root = tree;
00068 this.adaptor = adaptor;
00069 it = new TreeIterator(adaptor,root);
00070 }
00071
00072 public void reset() {
00073 super.reset();
00074 it.reset();
00075 hasNilRoot = false;
00076 level = 0;
00077 if ( calls != null ) calls.clear();
00078 }
00079
00083 public Object nextElement() {
00084 Object t = it.next();
00085
00086 if ( t == it.up ) {
00087 level--;
00088 if ( level==0 && hasNilRoot ) return it.next();
00089 }
00090 else if ( t == it.down ) level++;
00091 if ( level==0 && adaptor.isNil(t) ) {
00092 hasNilRoot = true;
00093 t = it.next();
00094 level++;
00095 t = it.next();
00096 }
00097 return t;
00098 }
00099
00100 public boolean isEOF(Object o) { return adaptor.getType(o) == Token.EOF; }
00101
00102 public void setUniqueNavigationNodes(boolean uniqueNavigationNodes) { }
00103
00104 public Object getTreeSource() { return root; }
00105
00106 public String getSourceName() { return getTokenStream().getSourceName(); }
00107
00108 public TokenStream getTokenStream() { return tokens; }
00109
00110 public void setTokenStream(TokenStream tokens) { this.tokens = tokens; }
00111
00112 public TreeAdaptor getTreeAdaptor() { return adaptor; }
00113
00114 public void setTreeAdaptor(TreeAdaptor adaptor) { this.adaptor = adaptor; }
00115
00116 public Object get(int i) {
00117 throw new UnsupportedOperationException("Absolute node indexes are meaningless in an unbuffered stream");
00118 }
00119
00120 public int LA(int i) { return adaptor.getType(LT(i)); }
00121
00125 public void push(int index) {
00126 if ( calls==null ) {
00127 calls = new IntArray();
00128 }
00129 calls.push(p);
00130 seek(index);
00131 }
00132
00136 public int pop() {
00137 int ret = calls.pop();
00138 seek(ret);
00139 return ret;
00140 }
00141
00142
00143
00144 public void replaceChildren(Object parent, int startChildIndex, int stopChildIndex, Object t) {
00145 if ( parent!=null ) {
00146 adaptor.replaceChildren(parent, startChildIndex, stopChildIndex, t);
00147 }
00148 }
00149
00150 public String toString(Object start, Object stop) {
00151
00152
00153 return "n/a";
00154 }
00155
00157 public String toTokenTypeString() {
00158 reset();
00159 StringBuffer buf = new StringBuffer();
00160 Object o = LT(1);
00161 int type = adaptor.getType(o);
00162 while ( type!=Token.EOF ) {
00163 buf.append(" ");
00164 buf.append(type);
00165 consume();
00166 o = LT(1);
00167 type = adaptor.getType(o);
00168 }
00169 return buf.toString();
00170 }
00171 }