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}