1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A buffered stream of tree nodes. Nodes can be from a tree of ANY kind. 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This node stream sucks all nodes out of the tree specified in 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the constructor during construction and makes pointers into 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the tree using an array of Object pointers. The stream necessarily 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * includes pointers to DOWN and UP and EOF nodes. 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This stream knows how to mark/release for backtracking. 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This stream is most suitable for tree interpreters that need to 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * jump around a lot or for tree parsers requiring speed (at cost of memory). 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * There is some duplicated functionality here with UnBufferedTreeNodeStream 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * but just in bookkeeping, not tree walking etc... 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @see UnBufferedTreeNodeStream 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverorg.antlr.runtime.tree.CommonTreeNodeStream = function(adaptor, 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree, 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver initialBufferSize) 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (arguments.length===1) { 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree = adaptor; 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver adaptor = new org.antlr.runtime.tree.CommonTreeAdaptor(); 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (arguments.length <= 2) { 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver initialBufferSize = 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver org.antlr.runtime.tree.CommonTreeNodeStream.DEFAULT_INITIAL_BUFFER_SIZE; 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Reuse same DOWN, UP navigation nodes unless this is true */ 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.uniqueNavigationNodes = false; 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** The index into the nodes list of the current node (next node 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to consume). If -1, nodes array not filled yet. 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.p = -1; 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var Token = org.antlr.runtime.Token; 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.root = tree; 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.adaptor = adaptor; 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.nodes = []; //new ArrayList(initialBufferSize); 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.down = this.adaptor.create(Token.DOWN, "DOWN"); 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.up = this.adaptor.create(Token.UP, "UP"); 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.eof = this.adaptor.create(Token.EOF, "EOF"); 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}; 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverorg.antlr.lang.augmentObject(org.antlr.runtime.tree.CommonTreeNodeStream, { 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DEFAULT_INITIAL_BUFFER_SIZE: 100, 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver INITIAL_CALL_STACK_SIZE: 10 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}); 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverorg.antlr.lang.extend(org.antlr.runtime.tree.CommonTreeNodeStream, 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver org.antlr.runtime.tree.TreeNodeStream, 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StreamIterator: function() { 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var i = 0, 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = this.nodes, 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver eof = this.eof; 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return { 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver hasNext: function() { 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return i<nodes.length; 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver next: function() { 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var current = i; 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i++; 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( current < nodes.length ) { 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return nodes[current]; 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return eof; 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver remove: function() { 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("cannot remove nodes from stream"); 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }; 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Walk tree with depth-first-search and fill nodes buffer. 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Don't do DOWN, UP nodes if its a list (t is isNil). 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fillBuffer: function(t) { 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var reset_p = false; 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (org.antlr.lang.isUndefined(t)) { 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = this.root; 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver reset_p = true; 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var nil = this.adaptor.isNil(t); 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !nil ) { 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.nodes.push(t); // add this node 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // add DOWN node if t has children 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var n = this.adaptor.getChildCount(t); 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !nil && n>0 ) { 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.addNavigationNode(org.antlr.runtime.Token.DOWN); 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // and now add all its children 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var c, child; 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (c=0; c<n; c++) { 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child = this.adaptor.getChild(t,c); 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.fillBuffer(child); 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // add UP node if t has children 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !nil && n>0 ) { 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.addNavigationNode(org.antlr.runtime.Token.UP); 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (reset_p) { 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.p = 0; // buffer of nodes intialized now 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getNodeIndex: function(node) { 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.p==-1 ) { 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.fillBuffer(); 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var i, t; 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i=0; i<this.nodes.length; i++) { 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = this.nodes[i]; 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( t===node ) { 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return i; 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return -1; 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** As we flatten the tree, we use UP, DOWN nodes to represent 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the tree structure. When debugging we need unique nodes 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * so instantiate new ones when uniqueNavigationNodes is true. 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver addNavigationNode: function(ttype) { 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var navNode = null; 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( ttype===org.antlr.runtime.Token.DOWN ) { 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.hasUniqueNavigationNodes() ) { 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver navNode = this.adaptor.create(org.antlr.runtime.Token.DOWN, "DOWN"); 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver navNode = this.down; 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.hasUniqueNavigationNodes() ) { 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver navNode = this.adaptor.create(org.antlr.runtime.Token.UP, "UP"); 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else { 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver navNode = this.up; 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.nodes.push(navNode); 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get: function(i) { 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.p===-1 ) { 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.fillBuffer(); 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.nodes[i]; 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver LT: function(k) { 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.p===-1 ) { 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.fillBuffer(); 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( k===0 ) { 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( k<0 ) { 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.LB(-1*k); 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( (this.p+k-1) >= this.nodes.length ) { 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.eof; 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.nodes[this.p+k-1]; 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getCurrentSymbol: function() { return this.LT(1); }, 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Look backwards k nodes */ 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver LB: function(k) { 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( k===0 ) { 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( (this.p-k)<0 ) { 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.nodes[this.p-k]; 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getTreeSource: function() { 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.root; 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getSourceName: function() { 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.getTokenStream().getSourceName(); 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getTokenStream: function() { 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.tokens; 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setTokenStream: function(tokens) { 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.tokens = tokens; 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getTreeAdaptor: function() { 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.adaptor; 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setTreeAdaptor: function(adaptor) { 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.adaptor = adaptor; 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver hasUniqueNavigationNodes: function() { 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.uniqueNavigationNodes; 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setUniqueNavigationNodes: function(uniqueNavigationNodes) { 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.uniqueNavigationNodes = uniqueNavigationNodes; 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver consume: function() { 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.p===-1 ) { 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.fillBuffer(); 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.p++; 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver LA: function(i) { 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.adaptor.getType(this.LT(i)); 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver mark: function() { 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.p===-1 ) { 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.fillBuffer(); 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.lastMarker = this.index(); 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.lastMarker; 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver release: function(marker) { 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // no resources to release 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver index: function() { 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.p; 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rewind: function(marker) { 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!org.antlr.lang.isNumber(marker)) { 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver marker = this.lastMarker; 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.seek(marker); 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver seek: function(index) { 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.p===-1 ) { 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.fillBuffer(); 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.p = index; 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Make stream jump to a new location, saving old location. 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Switch back with pop(). 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver push: function(index) { 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !this.calls ) { 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.calls = []; 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.calls.push(this.p); // save current index 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.seek(index); 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Seek back to previous index saved during last push() call. 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Return top of stack (return index). 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pop: function() { 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var ret = this.calls.pop(); 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.seek(ret); 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ret; 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver reset: function() { 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.p = 0; 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.lastMarker = 0; 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (this.calls) { 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.calls = []; 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver size: function() { 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.p===-1 ) { 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.fillBuffer(); 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.nodes.length; 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver iterator: function() { 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.p===-1 ) { 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.fillBuffer(); 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.StreamIterator(); 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver replaceChildren: function(parent, startChildIndex, stopChildIndex, t) { 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( parent ) { 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.adaptor.replaceChildren(parent, startChildIndex, stopChildIndex, t); 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Debugging */ 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver toTokenString: function(start, stop) { 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.p===-1 ) { 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.fillBuffer(); 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var buf='', i, t; 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i = start; i < this.nodes.length && i <= stop; i++) { 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = this.nodes[i]; 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf += " "+this.adaptor.getToken(t); 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return buf; 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Used for testing, just return the token type stream */ 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver toString: function(start, stop) { 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var buf = "", 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text, 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t, 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i; 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (arguments.length===0) { 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.p===-1 ) { 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.fillBuffer(); 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i = 0; i < this.nodes.length; i++) { 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = this.nodes[i]; 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf += " "; 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf += this.adaptor.getType(t); 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return buf; 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !org.antlr.lang.isNumber(start) || !org.antlr.lang.isNumber(stop) ) { 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.p===-1 ) { 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.fillBuffer(); 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // if we have the token stream, use that to dump text in order 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var beginTokenIndex, 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver endTokenIndex; 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.tokens ) { 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver beginTokenIndex = this.adaptor.getTokenStartIndex(start); 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver endTokenIndex = this.adaptor.getTokenStopIndex(stop); 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // if it's a tree, use start/stop index from start node 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // else use token range from start/stop nodes 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( this.adaptor.getType(stop)===org.antlr.runtime.Token.UP ) { 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver endTokenIndex = this.adaptor.getTokenStopIndex(start); 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if ( this.adaptor.getType(stop)==org.antlr.runtime.Token.EOF ) 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver endTokenIndex = this.size()-2; // don't use EOF 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return this.tokens.toString(beginTokenIndex, endTokenIndex); 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // walk nodes looking for start 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = null; 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i = 0; 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (; i < this.nodes.length; i++) { 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = this.nodes[i]; 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( t===start ) { 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver break; 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // now walk until we see stop, filling string buffer with text 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf = text = ""; 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = this.nodes[i]; 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ( t!==stop ) { 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text = this.adaptor.getText(t); 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !org.antlr.lang.isString(text) ) { 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text = " "+this.adaptor.getType(t).toString(); 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf += text; 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i++; 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = nodes[i]; 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // include stop node too 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text = this.adaptor.getText(stop); 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !org.antlr.lang.isString(text) ) { 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text = " "+this.adaptor.getType(stop).toString(); 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver buf += text; 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return buf; 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}); 395