1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A TreeAdaptor that works with any Tree implementation. It provides 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * really just factory methods; all the work is done by BaseTreeAdaptor. 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If you would like to have different tokens created than ClassicToken 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * objects, you need to override this and then set the parser tree adaptor to 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * use your subclass. 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * To get your parser to build nodes of a different type, override 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * create(Token). 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverorg.antlr.runtime.tree.CommonTreeAdaptor = function() {}; 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverorg.antlr.lang.extend(org.antlr.runtime.tree.CommonTreeAdaptor, 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver org.antlr.runtime.tree.BaseTreeAdaptor, { 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Duplicate a node. This is part of the factory; 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * override if you want another kind of node to be built. 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * I could use reflection to prevent having to override this 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * but reflection is slow. 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dupNode: function(t) { 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !org.antlr.lang.isValue(t) ) { 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t.dupNode(); 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver create: function(payload) { 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (arguments.length>1) { 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return org.antlr.runtime.tree.CommonTreeAdaptor.superclass.create.apply(this, arguments); 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new org.antlr.runtime.tree.CommonTree(payload); 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Tell me how to create a token for use with imaginary token nodes. 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * For example, there is probably no input symbol associated with imaginary 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * token DECL, but you need to create it as a payload or whatever for 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the DECL node as in ^(DECL type ID). 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If you care what the token payload objects' type is, you should 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * override this method and any other createToken variant. 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Tell me how to create a token for use with imaginary token nodes. 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * For example, there is probably no input symbol associated with imaginary 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * token DECL, but you need to create it as a payload or whatever for 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * the DECL node as in ^(DECL type ID). 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * This is a variant of createToken where the new token is derived from 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * an actual real input token. Typically this is for converting '{' 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * tokens to BLOCK etc... You'll see 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * r : lc='{' ID+ '}' -> ^(BLOCK[$lc] ID+) ; 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * If you care what the token payload objects' type is, you should 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * override this method and any other createToken variant. 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver createToken: function(fromToken) { 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (arguments.length===2) { 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new org.antlr.runtime.CommonToken(arguments[0], arguments[1]); 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new org.antlr.runtime.CommonToken(arguments[0]); 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Track start/stop token for subtree root created for a rule. 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Only works with Tree nodes. For rules that match nothing, 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * seems like this will yield start=i and stop=i-1 in a nil node. 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Might be useful info so I'll not force to be i..i. 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setTokenBoundaries: function(t, startToken, stopToken) { 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( !org.antlr.lang.isValue(t) ) { 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver var start = 0, 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver stop = 0; 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( org.antlr.lang.isValue(startToken) ) { 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (startToken.getTokenIndex) { 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver start = startToken.getTokenIndex(); 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else if (startToken.getStartIndex) { 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver start = startToken.getStartIndex(); 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver start = startToken.getTokenStartIndex(); 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( org.antlr.lang.isValue(stopToken) ) { 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (stop.getTokenIndex) { 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver stop = stopToken.getTokenIndex(); 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else if (stopToken.getStopIndex) { 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver stop = stopToken.getStopIndex(); 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver stop = stopToken.getTokenStopIndex(); 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t.setTokenStartIndex(start); 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t.setTokenStopIndex(stop); 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getTokenStartIndex: function(t) { 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!t) { 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return -1; 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t.getTokenStartIndex(); 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getTokenStopIndex: function(t) { 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!t) { 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return -1; 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t.getTokenStopIndex(); 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getText: function(t) { 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!t) { 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t.getText(); 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getType: function(t) { 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!t) { 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return org.antlr.runtime.Token.INVALID_TOKEN_TYPE; 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t.getType(); 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** What is the Token associated with this node? If 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * you are not using CommonTree, then you must 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * override this in your own adaptor. 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getToken: function(t) { 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( t instanceof org.antlr.runtime.tree.CommonTree ) { 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t.getToken(); 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; // no idea what to do 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getChild: function(t, i) { 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!t) { 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return null; 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t.getChild(i); 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getChildCount: function(t) { 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (!t) { 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t.getChildCount(); 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getParent: function(t) { 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t.getParent(); 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setParent: function(t, parent) { 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t.setParent(parent); 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getChildIndex: function(t) { 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return t.getChildIndex(); 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver setChildIndex: function(t, index) { 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t.setChildIndex(index); 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver }, 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver replaceChildren: function(parent, startChildIndex, stopChildIndex, t) { 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( parent ) { 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parent.replaceChildren(startChildIndex, stopChildIndex, t); 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}); 172