CommonTreeAdaptor.js revision 324c4644fee44b9898524c09511bd33c3f12e2df
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