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.RecognitionException;
00033
00034 import java.util.HashMap;
00035 import java.util.Map;
00036
00038 public abstract class BaseTreeAdaptor implements TreeAdaptor {
00043 protected Map treeToUniqueIDMap;
00044 protected int uniqueNodeID = 1;
00045
00046 public Object nil() {
00047 return create(null);
00048 }
00049
00061 public Object errorNode(TokenStream input, Token start, Token stop,
00062 RecognitionException e)
00063 {
00064 CommonErrorNode t = new CommonErrorNode(input, start, stop, e);
00065
00066 return t;
00067 }
00068
00069 public boolean isNil(Object tree) {
00070 return ((Tree)tree).isNil();
00071 }
00072
00073 public Object dupTree(Object tree) {
00074 return dupTree(tree, null);
00075 }
00076
00081 public Object dupTree(Object t, Object parent) {
00082 if ( t==null ) {
00083 return null;
00084 }
00085 Object newTree = dupNode(t);
00086
00087 setChildIndex(newTree, getChildIndex(t));
00088 setParent(newTree, parent);
00089 int n = getChildCount(t);
00090 for (int i = 0; i < n; i++) {
00091 Object child = getChild(t, i);
00092 Object newSubTree = dupTree(child, t);
00093 addChild(newTree, newSubTree);
00094 }
00095 return newTree;
00096 }
00097
00105 public void addChild(Object t, Object child) {
00106 if ( t!=null && child!=null ) {
00107 ((Tree)t).addChild((Tree)child);
00108 }
00109 }
00110
00137 public Object becomeRoot(Object newRoot, Object oldRoot) {
00138
00139 Tree newRootTree = (Tree)newRoot;
00140 Tree oldRootTree = (Tree)oldRoot;
00141 if ( oldRoot==null ) {
00142 return newRoot;
00143 }
00144
00145 if ( newRootTree.isNil() ) {
00146 int nc = newRootTree.getChildCount();
00147 if ( nc==1 ) newRootTree = (Tree)newRootTree.getChild(0);
00148 else if ( nc >1 ) {
00149
00150 throw new RuntimeException("more than one node as root (TODO: make exception hierarchy)");
00151 }
00152 }
00153
00154
00155
00156 newRootTree.addChild(oldRootTree);
00157 return newRootTree;
00158 }
00159
00161 public Object rulePostProcessing(Object root) {
00162
00163 Tree r = (Tree)root;
00164 if ( r!=null && r.isNil() ) {
00165 if ( r.getChildCount()==0 ) {
00166 r = null;
00167 }
00168 else if ( r.getChildCount()==1 ) {
00169 r = (Tree)r.getChild(0);
00170
00171 r.setParent(null);
00172 r.setChildIndex(-1);
00173 }
00174 }
00175 return r;
00176 }
00177
00178 public Object becomeRoot(Token newRoot, Object oldRoot) {
00179 return becomeRoot(create(newRoot), oldRoot);
00180 }
00181
00182 public Object create(int tokenType, Token fromToken) {
00183 fromToken = createToken(fromToken);
00184
00185 fromToken.setType(tokenType);
00186 Tree t = (Tree)create(fromToken);
00187 return t;
00188 }
00189
00190 public Object create(int tokenType, Token fromToken, String text) {
00191 if (fromToken == null) return create(tokenType, text);
00192 fromToken = createToken(fromToken);
00193 fromToken.setType(tokenType);
00194 fromToken.setText(text);
00195 Tree t = (Tree)create(fromToken);
00196 return t;
00197 }
00198
00199 public Object create(int tokenType, String text) {
00200 Token fromToken = createToken(tokenType, text);
00201 Tree t = (Tree)create(fromToken);
00202 return t;
00203 }
00204
00205 public int getType(Object t) {
00206 return ((Tree)t).getType();
00207 }
00208
00209 public void setType(Object t, int type) {
00210 throw new NoSuchMethodError("don't know enough about Tree node");
00211 }
00212
00213 public String getText(Object t) {
00214 return ((Tree)t).getText();
00215 }
00216
00217 public void setText(Object t, String text) {
00218 throw new NoSuchMethodError("don't know enough about Tree node");
00219 }
00220
00221 public Object getChild(Object t, int i) {
00222 return ((Tree)t).getChild(i);
00223 }
00224
00225 public void setChild(Object t, int i, Object child) {
00226 ((Tree)t).setChild(i, (Tree)child);
00227 }
00228
00229 public Object deleteChild(Object t, int i) {
00230 return ((Tree)t).deleteChild(i);
00231 }
00232
00233 public int getChildCount(Object t) {
00234 return ((Tree)t).getChildCount();
00235 }
00236
00237 public int getUniqueID(Object node) {
00238 if ( treeToUniqueIDMap==null ) {
00239 treeToUniqueIDMap = new HashMap();
00240 }
00241 Integer prevID = (Integer)treeToUniqueIDMap.get(node);
00242 if ( prevID!=null ) {
00243 return prevID.intValue();
00244 }
00245 int ID = uniqueNodeID;
00246 treeToUniqueIDMap.put(node, new Integer(ID));
00247 uniqueNodeID++;
00248 return ID;
00249
00250
00251 }
00252
00261 public abstract Token createToken(int tokenType, String text);
00262
00277 public abstract Token createToken(Token fromToken);
00278 }
00279