1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A generic tree implementation with no payload. You must subclass to 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * actually have any user data. ANTLR v3 uses a list of children approach 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * instead of the child-sibling approach in v2. A flat tree (a list) is 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * an empty node whose children represent the list. An empty, but 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * non-null node is called "nil". 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverorg.antlr.runtime.tree.BaseTree = function() {}; 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverorg.antlr.lang.extend(org.antlr.runtime.tree.BaseTree, 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver org.antlr.runtime.tree.Tree, 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getChild: function(i) { 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !this.children || i>=this.children.length ) { 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.children[i]; 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Get the children internal List; note that if you directly mess with 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the list, do so at your own risk. 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getChildren: function() { 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.children; 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getFirstChildWithType: function(type) { 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var i, t; 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i = 0; this.children && i < this.children.length; i++) { 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = this.children[i]; 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( t.getType()===type ) { 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t; 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getChildCount: function() { 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !this.children ) { 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.children.length; 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Add t as child of this node. 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Warning: if t has no children, but child does 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and child isNil then this routine moves children to t via 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * t.children = child.children; i.e., without copying the array. 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver addChild: function(t) { 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !org.antlr.lang.isValue(t) ) { 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; // do nothing upon addChild(null) 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var childTree = t, n, i, c; 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( childTree.isNil() ) { // t is an empty node possibly with children 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.children && this.children == childTree.children ) { 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("attempt to add child list to itself"); 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // just add all of childTree's children to this 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( childTree.children ) { 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.children ) { // must copy, this has children already 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver n = childTree.children.length; 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i = 0; i < n; i++) { 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c = childTree.children[i]; 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.children.push(c); 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // handle double-link stuff for each child of nil root 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c.setParent(this); 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c.setChildIndex(this.children.length-1); 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // no children for this but t has children; just set pointer 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // call general freshener routine 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.children = childTree.children; 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.freshenParentAndChildIndexes(); 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { // child is not nil (don't care about children) 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !this.children ) { 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.children = this.createChildrenList(); // create children list on demand 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.children.push(t); 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver childTree.setParent(this); 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver childTree.setChildIndex(this.children.length-1); 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Add all elements of kids list as children of this node */ 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver addChildren: function(kids) { 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var i, t; 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i = 0; i < kids.length; i++) { 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = kids[i]; 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.addChild(t); 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setChild: function(i, t) { 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !t ) { 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( t.isNil() ) { 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("Can't set single child to a list"); 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !this.children ) { 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.children = this.createChildrenList(); 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.children[i] = t; 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t.setParent(this); 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t.setChildIndex(i); 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver deleteChild: function(i) { 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !this.children ) { 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (i<0 || i>=this.children.length) { 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("Index out of bounds."); 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var killed = this.children.splice(i, 1)[0]; 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // walk rest and decrement their child indexes 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.freshenParentAndChildIndexes(i); 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return killed; 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Delete children from start to stop and replace with t even if t is 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a list (nil-root tree). num of children can increase or decrease. 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * For huge child lists, inserting children can force walking rest of 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * children to set their childindex; could be slow. 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver replaceChildren: function(startChildIndex, stopChildIndex, t) { 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !this.children ) { 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("indexes invalid; no children in list"); 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var replacingHowMany = stopChildIndex - startChildIndex + 1; 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var replacingWithHowMany; 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var newTree = t; 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var newChildren = null; 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // normalize to a list of children to add: newChildren 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( newTree.isNil() ) { 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newChildren = newTree.children; 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newChildren = []; 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newChildren.push(newTree); 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver replacingWithHowMany = newChildren.length; 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var numNewChildren = newChildren.length; 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var delta = replacingHowMany - replacingWithHowMany; 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var j, i, child, indexToDelete, c, killed, numToInsert; 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // if same number of nodes, do direct replace 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( delta === 0 ) { 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver j = 0; // index into new children 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i=startChildIndex; i<=stopChildIndex; i++) { 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child = newChildren[j]; 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.children[i] = child; 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child.setParent(this); 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child.setChildIndex(i); 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver j++; 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if ( delta > 0 ) { // fewer new nodes than there were 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // set children and then delete extra 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (j=0; j<numNewChildren; j++) { 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.children[startChildIndex+j] = newChildren[j]; 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver indexToDelete = startChildIndex+numNewChildren; 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (c=indexToDelete; c<=stopChildIndex; c++) { 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // delete same index, shifting everybody down each time 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver killed = this.children.splice(indexToDelete, 1)[0]; 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.freshenParentAndChildIndexes(startChildIndex); 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { // more new nodes than were there before 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // fill in as many children as we can (replacingHowMany) w/o moving data 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (j=0; j<replacingHowMany; j++) { 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.children[startChildIndex+j] = newChildren[j]; 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver numToInsert = replacingWithHowMany-replacingHowMany; 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (j=replacingHowMany; j<replacingWithHowMany; j++) { 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.children.splice(startChildIndex+j, 0, newChildren[j]); 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.freshenParentAndChildIndexes(startChildIndex); 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Override in a subclass to change the impl of children list */ 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver createChildrenList: function() { 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return []; 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver isNil: function() { 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return false; 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver freshenParentAndChildIndexes: function(offset) { 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!org.antlr.lang.isNumber(offset)) { 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver offset = 0; 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var n = this.getChildCount(), 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c, 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child; 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (c = offset; c < n; c++) { 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child = this.getChild(c); 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child.setChildIndex(c); 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child.setParent(this); 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver sanityCheckParentAndChildIndexes: function(parent, i) { 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (arguments.length===0) { 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parent = null; 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i = -1; 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( parent!==this.getParent() ) { 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("parents don't match; expected "+parent+" found "+this.getParent()); 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( i!==this.getChildIndex() ) { 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("child indexes don't match; expected "+i+" found "+this.getChildIndex()); 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var n = this.getChildCount(), 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c, 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child; 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (c = 0; c < n; c++) { 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child = this.getChild(c); 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child.sanityCheckParentAndChildIndexes(this, c); 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** BaseTree doesn't track child indexes. */ 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getChildIndex: function() { 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setChildIndex: function(index) { 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** BaseTree doesn't track parent pointers. */ 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getParent: function() { 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setParent: function(t) { 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getTree: function() { 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this; 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Print out a whole tree not just a node */ 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver toStringTree: function() { 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !this.children || this.children.length===0 ) { 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.toString(); 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var buf = "", 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i, 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t; 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !this.isNil() ) { 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf += "("; 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf += this.toString(); 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf += ' '; 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i = 0; this.children && i < this.children.length; i++) { 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = this.children[i]; 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( i>0 ) { 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf += ' '; 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf += t.toStringTree(); 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !this.isNil() ) { 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf += ")"; 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return buf; 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getLine: function() { 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getCharPositionInLine: function() { 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}); 283