1967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org/*
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org [The "BSD license"]
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Copyright (c) 2005-2009 Terence Parr
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen All rights reserved.
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org Redistribution and use in source and binary forms, with or without
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen modification, are permitted provided that the following conditions
8f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org are met:
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1. Redistributions of source code must retain the above copyright
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     notice, this list of conditions and the following disclaimer.
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2. Redistributions in binary form must reproduce the above copyright
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     notice, this list of conditions and the following disclaimer in the
13f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org     documentation and/or other materials provided with the distribution.
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3. The name of the author may not be used to endorse or promote products
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen     derived from this software without specific prior written permission.
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
225de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255fc1eed70f85bd1e9d0833742945798d6ef49cf0machenbach@chromium.org (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
28c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.orgpackage org.antlr.runtime.tree;
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenimport org.antlr.runtime.Token;
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenimport org.antlr.runtime.TokenStream;
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenimport org.antlr.runtime.RecognitionException;
3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/** How to create and navigate trees.  Rather than have a separate factory
3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *  and adaptor, I've merged them.  Makes sense to encapsulate.
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *  This takes the place of the tree construction code generated in the
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *  generated code in 2.x and the ASTFactory.
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *
4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *  I do not need to know the type of a tree at all so they are all
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *  generic Objects.  This may increase the amount of typecasting needed. :(
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
43e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.orgpublic interface TreeAdaptor {
44e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org	// C o n s t r u c t i o n
45e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org
46e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org	/** Create a tree node from Token object; for CommonTree type trees,
47e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org	 *  then the token just becomes the payload.  This is the most
48e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org	 *  common create call.
497be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org	 *
507be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org	 *  Override if you want another kind of node to be built.
51ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org	 */
52ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org	public Object create(Token payload);
537be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
5493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org	/** Duplicate a single tree node.
5593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org	 *  Override if you want another kind of node to be built.
5693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org	 */
5793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org	public Object dupNode(Object treeNode);
5893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
5993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org	/** Duplicate tree recursively, using dupNode() for each node */
6093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org	public Object dupTree(Object tree);
6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** Return a nil node (an empty but non-null node) that can hold
6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  a list of element as the children.  If you want a flat tree (a list)
6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  use "t=adaptor.nil(); t.addChild(x); t.addChild(y);"
6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 */
6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public Object nil();
6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** Return a tree node representing an error.  This node records the
6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  tokens consumed during error recovery.  The start token indicates the
70e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org	 *  input symbol at which the error was detected.  The stop token indicates
71e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org	 *  the last symbol consumed during recovery.
72e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org	 *
73e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org	 *  You must specify the input stream so that the erroneous text can
74e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org	 *  be packaged up in the error node.  The exception could be useful
75e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org	 *  to some applications; default implementation stores ptr to it in
76e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org	 *  the CommonErrorNode.
77e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org	 *
78c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	 *  This only makes sense during token parsing, not tree parsing.
79c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	 *  Tree parsing should happen only when parsing and tree construction
80c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	 *  succeed.
81c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	 */
82c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	public Object errorNode(TokenStream input, Token start, Token stop, RecognitionException e);
83c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
84c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	/** Is tree considered a nil node used to make lists of child nodes? */
85c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	public boolean isNil(Object tree);
86c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
87c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	/** Add a child to the tree t.  If child is a flat tree (a list), make all
88c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	 *  in list children of t.  Warning: if t has no children, but child does
89c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	 *  and child isNil then you can decide it is ok to move children to t via
90c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	 *  t.children = child.children; i.e., without copying the array.  Just
91c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	 *  make sure that this is consistent with have the user will build
92c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	 *  ASTs.  Do nothing if t or child is null.
93c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	 */
94c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	public void addChild(Object t, Object child);
95c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
96c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	/** If oldRoot is a nil root, just copy or move the children to newRoot.
97c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	 *  If not a nil root, make oldRoot a child of newRoot.
98c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org	 *
99e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org	 *    old=^(nil a b c), new=r yields ^(r a b c)
10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *    old=^(a b c), new=r yields ^(r ^(a b c))
10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *
10243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  If newRoot is a nil-rooted single child tree, use the single
103c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org	 *  child as the new root node.
104c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org	 *
10543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
10643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
10741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org	 *
10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
10943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *
11043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *    old=null, new=r yields r
11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *    old=null, new=^(nil r) yields ^(nil r)
11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *
11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  Return newRoot.  Throw an exception if newRoot is not a
114c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org	 *  simple node or nil root with a single child node--it must be a root
11543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  node.  If newRoot is ^(nil x) return x as newRoot.
11643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *
11743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  Be advised that it's ok for newRoot to point at oldRoot's
11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  children; i.e., you don't have to copy the list.  We are
11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  constructing these nodes so we should have this control for
12043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  efficiency.
12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 */
12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public Object becomeRoot(Object newRoot, Object oldRoot);
12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** Given the root of the subtree created for this rule, post process
12541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org	 *  it to do any simplifications or whatever you want.  A required
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  behavior is to convert ^(nil singleSubtree) to singleSubtree
12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  as the setting of start/stop indexes relies on a single non-nil root
12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  for non-flat trees.
12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *
13043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  Flat trees such as for lists like "idlist : ID+ ;" are left alone
13143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  unless there is only one ID.  For a list, the start/stop indexes
13243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  are set in the nil node.
13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *
13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  This method is executed after all rule tree construction and right
13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  before setTokenBoundaries().
13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 */
13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public Object rulePostProcessing(Object root);
13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** For identifying trees.
14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *
14143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  How to identify nodes so we can say "add node to a prior node"?
14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  Even becomeRoot is an issue.  Use System.identityHashCode(node)
14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  usually.
14443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 */
14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public int getUniqueID(Object node);
14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	// R e w r i t e  R u l e s
14943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** Create a node for newRoot make it the root of oldRoot.
15143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  If oldRoot is a nil root, just copy or move the children to newRoot.
15243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  If not a nil root, make oldRoot a child of newRoot.
15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *
15443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  Return node created for newRoot.
15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *
15643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  Be advised: when debugging ASTs, the DebugTreeAdaptor manually
15743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  calls create(Token child) and then plain becomeRoot(node, node)
15843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  because it needs to trap calls to create, but it can't since it delegates
15943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  to not inherits from the TreeAdaptor.
16043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 */
16143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public Object becomeRoot(Token newRoot, Object oldRoot);
16243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** Create a new node derived from a token, with a new token type.
16443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  This is invoked from an imaginary node ref on right side of a
16543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  rewrite rule as IMAG[$tokenLabel].
16643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *
16743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  This should invoke createToken(Token).
16843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 */
16943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public Object create(int tokenType, Token fromToken);
17043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** Same as create(tokenType,fromToken) except set the text too.
17243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  This is invoked from an imaginary node ref on right side of a
17343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  rewrite rule as IMAG[$tokenLabel, "IMAG"].
17443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *
17543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  This should invoke createToken(Token).
17643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 */
17743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public Object create(int tokenType, Token fromToken, String text);
17843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** Create a new node derived from a token, with a new token type.
18043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  This is invoked from an imaginary node ref on right side of a
18143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  rewrite rule as IMAG["IMAG"].
18243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *
18343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  This should invoke createToken(int,String).
18443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 */
18543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public Object create(int tokenType, String text);
18643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	// C o n t e n t
18943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** For tree parsing, I need to know the token type of a node */
19143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public int getType(Object t);
19243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** Node constructors can set the type of a node */
19443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public void setType(Object t, int type);
19543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public String getText(Object t);
19743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** Node constructors can set the text of a node */
19943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public void setText(Object t, String text);
20043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** Return the token object from which this node was created.
2029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com	 *  Currently used only for printing an error message.
20343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  The error display routine in BaseRecognizer needs to
20443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  display where the input the error occurred. If your
20543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  tree of limitation does not store information that can
20643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  lead you to the token, you can create a token filled with
20743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  the appropriate information and pass that back.  See
20843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  BaseRecognizer.getErrorMessage().
20943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 */
21043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public Token getToken(Object t);
21143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
21243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** Where are the bounds in the input token stream for this node and
21343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  all children?  Each rule that creates AST nodes will call this
21443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  method right before returning.  Flat trees (i.e., lists) will
21543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  still usually have a nil root node just to hold the children list.
21643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  That node would contain the start/stop indexes then.
21743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 */
21843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public void setTokenBoundaries(Object t, Token startToken, Token stopToken);
21943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** Get the token start index for this subtree; return -1 if no such index */
22143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public int getTokenStartIndex(Object t);
22243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** Get the token stop index for this subtree; return -1 if no such index */
22443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public int getTokenStopIndex(Object t);
22543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	// N a v i g a t i o n  /  T r e e  P a r s i n g
22843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** Get a child 0..n-1 node */
23043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public Object getChild(Object t, int i);
23143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** Set ith child (0..n-1) to t; t must be non-null and non-nil node */
23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public void setChild(Object t, int i, Object child);
23441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org
23543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	/** Remove ith child and shift children down from right. */
23643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public Object deleteChild(Object t, int i);
23743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2387be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org	/** How many children?  If 0, then this is a leaf node */
2397be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org	public int getChildCount(Object t);
24068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
24193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org	/** Who is the parent node of this node; if null, implies node is root.
2427be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org	 *  If your node type doesn't handle this, it's ok but the tree rewrites
2437be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org	 *  in tree parsers need this functionality.
2447be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org	 */
245ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org	public Object getParent(Object t);
2467be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org	public void setParent(Object t, Object parent);
247ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org
248ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org	/** What index is this node in the child list? Range: 0..n-1
249ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org	 *  If your node type doesn't handle this, it's ok but the tree rewrites
250ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org	 *  in tree parsers need this functionality.
2517be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org	 */
25243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public int getChildIndex(Object t);
25343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	public void setChildIndex(Object t, int index);
25468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org
25593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org	/** Replace from start to stop child index of parent with t, which might
25693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org	 *  be a list.  Number of children may be different
25743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  after this call.
25843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *
25943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  If parent is null, don't do anything; must be at root of overall tree.
26043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen	 *  Can't replace whatever points to the parent externally.  Do nothing.
26132d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org	 */
26241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org	public void replaceChildren(Object parent, int startChildIndex, int stopChildIndex, Object t);
26343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
26443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen