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