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