112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.compackage org.antlr.runtime.tree {
212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com    
312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	import flash.utils.Dictionary;
412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	import mx.utils.ObjectUtil;
612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	import org.antlr.runtime.*;
812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com
912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	/** A TreeAdaptor that works with any Tree implementation. */	
1012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	public class BaseTreeAdaptor implements TreeAdaptor {
1112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		/** System.identityHashCode() is not always unique; we have to
1212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  track ourselves.  That's ok, it's only for debugging, though it's
1312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  expensive: we have to create a hashtable with all tree nodes in it.
1412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 */
1512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		protected var treeToUniqueIDMap:Dictionary;
1612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		protected var uniqueNodeID:int = 1;
1712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
1812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function nil():Object {
19V{���@��L�$z������Ҡ.���gBt��o�̾��f���^O�/vw��_/>			return createWithPayload(null);
2012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
2112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
2212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		/** create tree node that holds the start and stop tokens associated
2312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com    	 *  with an error.
2412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com    	 *
2512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com    	 *  If you specify your own kind of tree nodes, you will likely have to
26Pґ��~v'    	 *  override this method. CommonTree returns Token.INVALID_TOKEN_TYPE
27m�O�� Q��    	 *  if no token payload but you might have to set token type for diff
2812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com    	 *  node type.
2912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com    	 * 
3012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com         *  You don't have to subclass CommonErrorNode; you will likely need to
3112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com         *  subclass your own tree node class to avoid class cast exception.
3212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com    	 */
333T    	public function errorNode(input:TokenStream, start:Token, stop:Token,
3412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com    							e:RecognitionException):Object {
3512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com    		var t:CommonErrorNode = new CommonErrorNode(input, start, stop, e);
3612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com    		//System.out.println("returning error node '"+t+"' @index="+input.index());
3712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com    		return t;
3812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com    	}
39l��[�C�z@@~uDŽk�
4012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function isNil(tree:Object):Boolean {
4112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			return Tree(tree).isNil;
4212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
4312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
4412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function dupTree(tree:Object):Object {
4512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			return dupTreeWithParent(tree, null);
46q>ĵ�x�棆x����^		}
4712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
48y		/** This is generic in the sense that it will work with any kind of
4912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  tree (not just Tree interface).  It invokes the adaptor routines
5012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  not the tree node routines to do the construction.  
5112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 */
5212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function dupTreeWithParent(t:Object, parent:Object):Object {
5312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			if ( t==null ) {
5412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com				return null;
5512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			}
5612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			var newTree:Object = dupNode(t);
5712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			// ensure new subtree root has parent/child index set
5812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			setChildIndex(newTree, getChildIndex(t)); // same index in new tree
59DQ�� I			setParent(newTree, parent);
6012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			var n:int = getChildCount(t);
6112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			for (var i:int = 0; i < n; i++) {
62yk�:��				var child:Object = getChild(t, i);
6312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com				var newSubTree:Object = dupTreeWithParent(child, t);
6412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com				addChild(newTree, newSubTree);
659�Q�m�_�䑕			}
666oϴz�{�>��|@<�T			return newTree;
6712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
6812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		
6912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		/** Add a child to the tree t.  If child is a flat tree (a list), make all
7012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  in list children of t.  Warning: if t has no children, but child does
7112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  and child isNil then you can decide it is ok to move children to t via
7212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  t.children = child.children; i.e., without copying the array.  Just
7312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  make sure that this is consistent with have the user will build
7412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  ASTs.
7512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 */
7612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function addChild(t:Object, child:Object):void {
7712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			if ( t!=null && child!=null ) {
7812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com				Tree(t).addChild(Tree(child));
7912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			}
8012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
8112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
8212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		/** If oldRoot is a nil root, just copy or move the children to newRoot.
8312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  If not a nil root, make oldRoot a child of newRoot.
84ka4���uM�:���`�AF���s�w	ZQ������d�X�ή)��%�%t�Z��*G��:�l���|�I;N		 *
8512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *    old=^(nil a b c), new=r yields ^(r a b c)
8612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *    old=^(a b c), new=r yields ^(r ^(a b c))
8712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *
8812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  If newRoot is a nil-rooted single child tree, use the single
8912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  child as the new root node.
9012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *
9112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *    old=^(nil a b c), new=^(nil r) yields ^(r a b c)
9212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *    old=^(a b c), new=^(nil r) yields ^(r ^(a b c))
9312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *
9412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  If oldRoot was null, it's ok, just return newRoot (even if isNil).
9512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *
9612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *    old=null, new=r yields r
9712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *    old=null, new=^(nil r) yields ^(nil r)
98Qs����t;�l.���y		 *
9912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  Return newRoot.  Throw an exception if newRoot is not a
10012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  simple node or nil root with a single child node--it must be a root
10112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  node.  If newRoot is ^(nil x) return x as newRoot.
10212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *
1031Ŵd�����=L���x�-%�N�ty(.��~Kǿ��㢄�C����>Fd�%���f�<�;���ᄀ�		 *  Be advised that it's ok for newRoot to point at oldRoot's
10412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  children; i.e., you don't have to copy the list.  We are
10512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  constructing these nodes so we should have this control for
106QL�s		 *  efficiency.
10712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 */
10812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function becomeRoot(newRoot:Object, oldRoot:Object):Object {			
10912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			// If new Root is token, then create a Tree.
11012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			if (newRoot is Token) {
11112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com				newRoot = createWithPayload(Token(newRoot));
11212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			}
11312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com
11412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			var newRootTree:Tree = Tree(newRoot);
11512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			var oldRootTree:Tree = Tree(oldRoot);
11612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			if ( oldRoot==null ) {
11712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com				return newRoot;
118AI�			}
11912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			// handle ^(nil real-node)
120c4U�.�iES�tv��I?t			if ( newRootTree.isNil ) {
12112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com				var nc:int = newRootTree.childCount;
12212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	            if ( nc==1 ) newRootTree = Tree(newRootTree.getChild(0));
12312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	            else if ( nc >1 ) {
12412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com					// TODO: make tree run time exceptions hierarchy
12512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com					throw new Error("more than one node as root (TODO: make exception hierarchy)");
12612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com				}
127P��$�=��			}
12812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			// add oldRoot to newRoot; addChild takes care of case where oldRoot
12912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			// is a flat list (i.e., nil-rooted tree).  All children of oldRoot
13012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			// are added to newRoot.
13112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			newRootTree.addChild(oldRootTree);
13212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			return newRootTree;
133JW�Y��<����Ȧb����F�)��LV�H e,		}
134m?	
13512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		/** Transform ^(nil x) to x and nil to null */
13612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function rulePostProcessing(root:Object):Object {
13712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			var r:Tree = Tree(root);
13812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			if ( r!=null && r.isNil ) {
13912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com				if ( r.childCount==0 ) {
14012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com					r = null;
14112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com				}
14212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com				else if ( r.childCount==1 ) {
14312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com					r = Tree(r.getChild(0));
14412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com					// whoever invokes rule will set parent and child index
14512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com					r.parent = null;
14612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com					r.childIndex = -1;
147U��EX�k�W͖%I				}
148Lr?	�/�i)Ɠ-�/F������Z�X���r�u			}
149N��&��Po���P@k�P�d��>�z			return r;
15012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
15112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
152Q���WFn�x���=�;��z�hm�A�		public function createFromToken(tokenType:int, fromToken:Token, text:String = null):Object {
15312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			fromToken = createToken(fromToken);
154S~,����a�nQ*�!���e�>�\< V����q�#N;��W�'v�K���.z��џ�b�xJ<!^O*W�	�p��			fromToken.type = tokenType;
155Oˀ��C���-vH���ћ��[���]�m�[������Iwށ<�n��h�ܭx����Y<��ɫ���q�Y�UN�M��\$E ���@B�������O���_��y�			if (text != null) {
15612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com				fromToken.text = text;
15712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			}
15812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			return createWithPayload(fromToken);
15912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
160o�c�}���Oq����>�:�Kl���+��bL�	
16112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function createFromType(tokenType:int, text:String):Object {
162k			var fromToken:Token = createTokenFromType(tokenType, text);
16312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			return createWithPayload(fromToken);
16412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
165Z�" �)�b��L!��DIR	
16612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function getType(t:Object):int {
16712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			return Tree(t).type;
16812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
16912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
17012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function setType(t:Object, type:int):void {
17112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			throw new Error("don't know enough about Tree node");
172v��V$r��&���|�bWM�&��Dr�_�Dw�{K���nC�		}
17312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
17412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function getText(t:Object):String {
17512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			return Tree(t).text;
17612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
17712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
17812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function setText(t:Object, text:String):void {
17912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			throw new Error("don't know enough about Tree node");
18012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
18112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
18212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function getChild(t:Object, i:int):Object {
18312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			return Tree(t).getChild(i);
18412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
18512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com
18612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function setChild(t:Object, i:int, child:Object):void {
18712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			Tree(t).setChild(i, Tree(child));
18812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
1899+�$To���-[;[;�+	
19012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function deleteChild(t:Object, i:int):Object {
19112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			return Tree(t).deleteChild(i);
192p�)���'�X�<		}
193i��e),Na�(�r�ot�c�rZ�XT�+J�z��k�I<�s\�絍��),kt�		
194P�o�����۱		public function getChildCount(t:Object):int {
1955�H���v�%x�			return Tree(t).childCount;
19612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
19712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
198K�ʠx		public function getUniqueID(node:Object):int {
19912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			if ( treeToUniqueIDMap==null ) {
20012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com				 treeToUniqueIDMap = new Dictionary();
20112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			}
20212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			if (treeToUniqueIDMap.hasOwnProperty(node)) {
20312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com				return treeToUniqueIDMap[node];
20412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			}
20512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com
20612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			var ID:int = uniqueNodeID;
20712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			treeToUniqueIDMap[node] = ID;
208a�X			uniqueNodeID++;
20912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			return ID;
21012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com
21112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
21212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
21312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		/** Tell me how to create a token for use with imaginary token nodes.
214J��		 *  For example, there is probably no input symbol associated with imaginary
21512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  token DECL, but you need to create it as a payload or whatever for
21612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  the DECL node as in ^(DECL type ID).
21712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *
21812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  If you care what the token payload objects' type is, you should
2194�^		 *  override this method and any other createToken variant.
22012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 */
22112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function createTokenFromType(tokenType:int, text:String):Token {
222w��?M`�M�����֯�eOI�			throw new Error("Not implemented - abstract function");
22312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
22412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
225W1F��H�W����		/** Tell me how to create a token for use with imaginary token nodes.
22612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  For example, there is probably no input symbol associated with imaginary
22712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  token DECL, but you need to create it as a payload or whatever for
22812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  the DECL node as in ^(DECL type ID).
22912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *
23012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  This is a variant of createToken where the new token is derived from
23112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  an actual real input token.  Typically this is for converting '{'
23212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  tokens to BLOCK etc...  You'll see
233sGK�c���U欶�b��N��~��		 *
23412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *    r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ;
23512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *
2363M�~��U�D�OU�����		 *  If you care what the token payload objects' type is, you should
23712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 *  override this method and any other createToken variant.
23812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 * 
23912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 */
24012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function createToken(fromToken:Token):Token {
24112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			throw new Error("Not implemented - abstract function");
24212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
24312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		
24412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function createWithPayload(payload:Token):Object {
24512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			throw new Error("Not implemented - abstract function");
24612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
24712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		
24812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function dupNode(t:Object):Object {
24912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			throw new Error("Not implemented - abstract function");
25012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
25112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
25212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function getToken(t:Object):Token {
25312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			throw new Error("Not implemented - abstract function");
25412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
25512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
25612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function setTokenBoundaries(t:Object, startToken:Token, stopToken:Token):void {
257U�����yv�			throw new Error("Not implemented - abstract function");
25812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
25912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
260k0um��T�)�(�s����[�p��x�F��ҷ�AQ������S�!�x���?���f"Y��		public function getTokenStartIndex(t:Object):int {
26112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			throw new Error("Not implemented - abstract function");
26212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
26312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
26412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function getTokenStopIndex(t:Object):int {
265m			throw new Error("Not implemented - abstract function");
26612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
26712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com
26812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function getParent(t:Object):Object {
26912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			throw new Error("Not implemented - abstract function");
27012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
271WZxp���B� =I�"��		
27212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function setParent(t:Object, parent:Object):void {
27312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			throw new Error("Not implemented - abstract function");
27412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
275Xq��Xf��;�g�-�le��
27612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function getChildIndex(t:Object):int {
27712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			throw new Error("Not implemented - abstract function");
27812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
27912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		
28012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function setChildIndex(t:Object, index:int):void {
28112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			throw new Error("Not implemented - abstract function");
282K��į�WE֗�{%���k~�/�$		}
28312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	
28412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function replaceChildren(parent:Object, startChildIndex:int, stopChildIndex:int, t:Object):void {
28512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			throw new Error("Not implemented - abstract function");
28612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}	
287R�p�����S		
28812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		public function create(... args):Object {
2897g��`I�Y�+.-����q&�CLއQ�<��),V>���b��nV���Lj׈�t��oD�P��S�����			if (args.length == 1 && args[0] is Token) {
290a���Z�k\->�N%��I				return createWithPayload(args[0]);
291ZvJN�n���			}
29212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			else if (args.length == 2 &&
29312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com					 args[0] is int &&
29412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com					 args[1] is Token) {
29512c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			 	return createFromToken(args[0], args[1]);
29612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		 	}
29712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			else if (args.length == 3 &&
29812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com					 args[0] is int &&
29912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com					 args[1] is Token &&
30012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com					 args[2] is String) {
301mv��o�n�u���N���			 	return createFromToken(args[0], args[1], args[2]);
30212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			}
30312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			else if (args.length == 2 &&
30412c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com					 args[0] is int &&
305QW�,�(����r��eR��)����L�h��#>�`IJ					 args[1] is String) {
30612c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			 	return createFromType(args[0], args[1]);
30712c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			} 					 
30812c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com			throw new Error("No methods signature for arguments : " + ObjectUtil.toString(args));
30912c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com		}
31012c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com	}
31112c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com
31212c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com
31312c1a0a5fe7c2399cfffdb74a95493120a85c267sberlin@gmail.com}