1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage org.antlr.runtime.tree { 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import flash.utils.Dictionary; 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import mx.utils.ObjectUtil; 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver import org.antlr.runtime.*; 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** A TreeAdaptor that works with any Tree implementation. */ 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public class BaseTreeAdaptor implements TreeAdaptor { 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** System.identityHashCode() is not always unique; we have to 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * track ourselves. That's ok, it's only for debugging, though it's 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * expensive: we have to create a hashtable with all tree nodes in it. 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected var treeToUniqueIDMap:Dictionary; 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected var uniqueNodeID:int = 1; 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function nil():Object { 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return createWithPayload(null); 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** create tree node that holds the start and stop tokens associated 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * with an error. 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If you specify your own kind of tree nodes, you will likely have to 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * override this method. CommonTree returns Token.INVALID_TOKEN_TYPE 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * if no token payload but you might have to set token type for diff 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * node type. 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * You don't have to subclass CommonErrorNode; you will likely need to 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * subclass your own tree node class to avoid class cast exception. 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function errorNode(input:TokenStream, start:Token, stop:Token, 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver e:RecognitionException):Object { 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var t:CommonErrorNode = new CommonErrorNode(input, start, stop, e); 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //System.out.println("returning error node '"+t+"' @index="+input.index()); 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t; 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function isNil(tree:Object):Boolean { 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return Tree(tree).isNil; 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function dupTree(tree:Object):Object { 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return dupTreeWithParent(tree, null); 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** This is generic in the sense that it will work with any kind of 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * tree (not just Tree interface). It invokes the adaptor routines 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * not the tree node routines to do the construction. 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function dupTreeWithParent(t:Object, parent:Object):Object { 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( t==null ) { 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var newTree:Object = dupNode(t); 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // ensure new subtree root has parent/child index set 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setChildIndex(newTree, getChildIndex(t)); // same index in new tree 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setParent(newTree, parent); 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var n:int = getChildCount(t); 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (var i:int = 0; i < n; i++) { 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var child:Object = getChild(t, i); 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var newSubTree:Object = dupTreeWithParent(child, t); 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver addChild(newTree, newSubTree); 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return newTree; 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Add a child to the tree t. If child is a flat tree (a list), make all 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in list children of t. Warning: if t has no children, but child does 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and child isNil then you can decide it is ok to move children to t via 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * t.children = child.children; i.e., without copying the array. Just 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * make sure that this is consistent with have the user will build 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * ASTs. 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function addChild(t:Object, child:Object):void { 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( t!=null && child!=null ) { 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tree(t).addChild(Tree(child)); 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** If oldRoot is a nil root, just copy or move the children to newRoot. 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If not a nil root, make oldRoot a child of newRoot. 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=^(nil a b c), new=r yields ^(r a b c) 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=^(a b c), new=r yields ^(r ^(a b c)) 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If newRoot is a nil-rooted single child tree, use the single 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * child as the new root node. 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=^(nil a b c), new=^(nil r) yields ^(r a b c) 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=^(a b c), new=^(nil r) yields ^(r ^(a b c)) 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If oldRoot was null, it's ok, just return newRoot (even if isNil). 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=null, new=r yields r 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * old=null, new=^(nil r) yields ^(nil r) 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Return newRoot. Throw an exception if newRoot is not a 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * simple node or nil root with a single child node--it must be a root 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * node. If newRoot is ^(nil x) return x as newRoot. 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Be advised that it's ok for newRoot to point at oldRoot's 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * children; i.e., you don't have to copy the list. We are 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * constructing these nodes so we should have this control for 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * efficiency. 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function becomeRoot(newRoot:Object, oldRoot:Object):Object { 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // If new Root is token, then create a Tree. 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (newRoot is Token) { 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newRoot = createWithPayload(Token(newRoot)); 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var newRootTree:Tree = Tree(newRoot); 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var oldRootTree:Tree = Tree(oldRoot); 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( oldRoot==null ) { 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return newRoot; 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // handle ^(nil real-node) 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( newRootTree.isNil ) { 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var nc:int = newRootTree.childCount; 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( nc==1 ) newRootTree = Tree(newRootTree.getChild(0)); 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if ( nc >1 ) { 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // TODO: make tree run time exceptions hierarchy 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("more than one node as root (TODO: make exception hierarchy)"); 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // add oldRoot to newRoot; addChild takes care of case where oldRoot 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // is a flat list (i.e., nil-rooted tree). All children of oldRoot 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // are added to newRoot. 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newRootTree.addChild(oldRootTree); 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return newRootTree; 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Transform ^(nil x) to x and nil to null */ 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function rulePostProcessing(root:Object):Object { 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var r:Tree = Tree(root); 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( r!=null && r.isNil ) { 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( r.childCount==0 ) { 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = null; 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if ( r.childCount==1 ) { 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = Tree(r.getChild(0)); 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // whoever invokes rule will set parent and child index 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r.parent = null; 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r.childIndex = -1; 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return r; 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function createFromToken(tokenType:int, fromToken:Token, text:String = null):Object { 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fromToken = createToken(fromToken); 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fromToken.type = tokenType; 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (text != null) { 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver fromToken.text = text; 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return createWithPayload(fromToken); 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function createFromType(tokenType:int, text:String):Object { 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var fromToken:Token = createTokenFromType(tokenType, text); 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return createWithPayload(fromToken); 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function getType(t:Object):int { 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return Tree(t).type; 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function setType(t:Object, type:int):void { 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("don't know enough about Tree node"); 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function getText(t:Object):String { 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return Tree(t).text; 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function setText(t:Object, text:String):void { 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("don't know enough about Tree node"); 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function getChild(t:Object, i:int):Object { 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return Tree(t).getChild(i); 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function setChild(t:Object, i:int, child:Object):void { 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tree(t).setChild(i, Tree(child)); 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function deleteChild(t:Object, i:int):Object { 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return Tree(t).deleteChild(i); 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function getChildCount(t:Object):int { 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return Tree(t).childCount; 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function getUniqueID(node:Object):int { 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( treeToUniqueIDMap==null ) { 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeToUniqueIDMap = new Dictionary(); 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (treeToUniqueIDMap.hasOwnProperty(node)) { 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return treeToUniqueIDMap[node]; 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var ID:int = uniqueNodeID; 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeToUniqueIDMap[node] = ID; 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver uniqueNodeID++; 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ID; 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Tell me how to create a token for use with imaginary token nodes. 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * For example, there is probably no input symbol associated with imaginary 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * token DECL, but you need to create it as a payload or whatever for 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the DECL node as in ^(DECL type ID). 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If you care what the token payload objects' type is, you should 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * override this method and any other createToken variant. 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function createTokenFromType(tokenType:int, text:String):Token { 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("Not implemented - abstract function"); 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Tell me how to create a token for use with imaginary token nodes. 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * For example, there is probably no input symbol associated with imaginary 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * token DECL, but you need to create it as a payload or whatever for 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the DECL node as in ^(DECL type ID). 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is a variant of createToken where the new token is derived from 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * an actual real input token. Typically this is for converting '{' 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * tokens to BLOCK etc... You'll see 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ; 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If you care what the token payload objects' type is, you should 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * override this method and any other createToken variant. 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function createToken(fromToken:Token):Token { 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("Not implemented - abstract function"); 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function createWithPayload(payload:Token):Object { 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("Not implemented - abstract function"); 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function dupNode(t:Object):Object { 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("Not implemented - abstract function"); 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function getToken(t:Object):Token { 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("Not implemented - abstract function"); 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function setTokenBoundaries(t:Object, startToken:Token, stopToken:Token):void { 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("Not implemented - abstract function"); 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function getTokenStartIndex(t:Object):int { 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("Not implemented - abstract function"); 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function getTokenStopIndex(t:Object):int { 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("Not implemented - abstract function"); 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function getParent(t:Object):Object { 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("Not implemented - abstract function"); 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function setParent(t:Object, parent:Object):void { 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("Not implemented - abstract function"); 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function getChildIndex(t:Object):int { 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("Not implemented - abstract function"); 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function setChildIndex(t:Object, index:int):void { 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("Not implemented - abstract function"); 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function replaceChildren(parent:Object, startChildIndex:int, stopChildIndex:int, t:Object):void { 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("Not implemented - abstract function"); 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public function create(... args):Object { 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (args.length == 1 && args[0] is Token) { 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return createWithPayload(args[0]); 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args.length == 2 && 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver args[0] is int && 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver args[1] is Token) { 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return createFromToken(args[0], args[1]); 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args.length == 3 && 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver args[0] is int && 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver args[1] is Token && 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver args[2] is String) { 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return createFromToken(args[0], args[1], args[2]); 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (args.length == 2 && 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver args[0] is int && 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver args[1] is String) { 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return createFromType(args[0], args[1]); 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new Error("No methods signature for arguments : " + ObjectUtil.toString(args)); 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}