1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[The "BSD licence"]
3324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCopyright (c) 2005-2006 Terence Parr
4324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverAll rights reserved.
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRedistribution and use in source and binary forms, with or without
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodification, are permitted provided that the following conditions
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverare met:
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver1. Redistributions of source code must retain the above copyright
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernotice, this list of conditions and the following disclaimer.
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver2. Redistributions in binary form must reproduce the above copyright
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernotice, this list of conditions and the following disclaimer in the
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdocumentation and/or other materials provided with the distribution.
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver3. The name of the author may not be used to endorse or promote products
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverderived from this software without specific prior written permission.
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
17324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage org.antlr.runtime.tree {
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	import org.antlr.runtime.IntStream;
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	import org.antlr.runtime.TokenStream;
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** A stream of tree nodes, accessing nodes from a tree of some kind */
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public interface TreeNodeStream extends IntStream {
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/** Get a tree node at an absolute index i; 0..n-1.
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  If you don't want to buffer up nodes, then this method makes no
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  sense for you.
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 */
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		function getNode(i:int):Object;
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/** Get tree node at current input pointer + i ahead where i=1 is next node.
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  i<0 indicates nodes in the past.  So LT(-1) is previous node, but
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  implementations are not required to provide results for k < -1.
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  LT(0) is undefined.  For i>=n, return null.
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  Return null for LT(0) and any index that results in an absolute address
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  that is negative.
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  This is analogus to the LT() method of the TokenStream, but this
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  returns a tree node instead of a token.  Makes code gen identical
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  for both parser and tree grammars. :)
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 */
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		function LT(k:int):Object;
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/** Where is this stream pulling nodes from?  This is not the name, but
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  the object that provides node objects.
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 */
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		function get treeSource():Object;
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/** If the tree associated with this stream was created from a TokenStream,
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  you can specify it here.  Used to do rule $text attribute in tree
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  parser.  Optional unless you use tree parser rule text attribute
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  or output=template and rewrite=true options.
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 */
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		function get tokenStream():TokenStream;
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/** What adaptor can tell me how to interpret/navigate nodes and
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  trees.  E.g., get text of a node.
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 */
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		function get treeAdaptor():TreeAdaptor;
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/** As we flatten the tree, we use UP, DOWN nodes to represent
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  the tree structure.  When debugging we need unique nodes
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  so we have to instantiate new ones.  When doing normal tree
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  parsing, it's slow and a waste of memory to create unique
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  navigation nodes.  Default should be false;
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 */
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		function set hasUniqueNavigationNodes(uniqueNavigationNodes:Boolean):void;
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/** Return the text of all nodes from start to stop, inclusive.
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  If the stream does not buffer all the nodes then it can still
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  walk recursively from start until stop.  You can always return
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  null or "" too, but users should not access $ruleLabel.text in
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  an action of course in that case.
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 */
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		function toStringWithRange(start:Object, stop:Object):String;
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// REWRITING TREES (used by tree parser)
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/** Replace from start to stop child index of parent with t, which might
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  be a list.  Number of children may be different
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  after this call.  The stream is notified because it is walking the
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  tree and might need to know you are monkeying with the underlying
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  tree.  Also, it might be able to modify the node stream to avoid
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  restreaming for future phases.
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  If parent is null, don't do anything; must be at root of overall tree.
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 *  Can't replace whatever points to the parent externally.  Do nothing.
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		 */
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		function replaceChildren(parent:Object, startChildIndex:int, stopChildIndex:int, t:Object):void;
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}