1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# begin[licence]
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  [The "BSD licence"]
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  Copyright (c) 2005-2009 Terence Parr
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  All rights reserved.
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  Redistribution and use in source and binary forms, with or without
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  modification, are permitted provided that the following conditions
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  are met:
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  1. Redistributions of source code must retain the above copyright
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     notice, this list of conditions and the following disclaimer.
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  2. Redistributions in binary form must reproduce the above copyright
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     notice, this list of conditions and the following disclaimer in the
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     documentation and/or other materials provided with the distribution.
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  3. The name of the author may not be used to endorse or promote products
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     derived from this software without specific prior written permission.
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# end[licence]
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport socket
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom antlr3 import Parser, TokenStream, RecognitionException, Token
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfrom antlr3.tree import CommonTreeAdaptor, TreeAdaptor, Tree
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass DebugParser(Parser):
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __init__(self, stream, state=None, dbg=None, *args, **kwargs):
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # wrap token stream in DebugTokenStream (unless user already did so).
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if not isinstance(stream, DebugTokenStream):
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            stream = DebugTokenStream(stream, dbg)
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        super(DebugParser, self).__init__(stream, state, *args, **kwargs)
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Who to notify when events in the parser occur.
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self._dbg = None
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.setDebugListener(dbg)
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setDebugListener(self, dbg):
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""Provide a new debug event listener for this parser.  Notify the
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        input stream too that it should send events to this listener.
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if hasattr(self.input, 'dbg'):
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.input.dbg = dbg
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self._dbg = dbg
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getDebugListener(self):
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self._dbg
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    dbg = property(getDebugListener, setDebugListener)
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def beginResync(self):
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self._dbg.beginResync()
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def endResync(self):
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self._dbg.endResync()
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def beginBacktrack(self, level):
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self._dbg.beginBacktrack(level)
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def endBacktrack(self, level, successful):
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self._dbg.endBacktrack(level,successful)
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def reportError(self, exc):
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Parser.reportError(self, exc)
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if isinstance(exc, RecognitionException):
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self._dbg.recognitionException(exc)
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass DebugTokenStream(TokenStream):
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __init__(self, input, dbg=None):
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.input = input
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.initialStreamState = True
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # Track the last mark() call result value for use in rewind().
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.lastMarker = None
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self._dbg = None
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.setDebugListener(dbg)
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # force TokenStream to get at least first valid token
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # so we know if there are any hidden tokens first in the stream
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.input.LT(1)
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getDebugListener(self):
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self._dbg
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setDebugListener(self, dbg):
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self._dbg = dbg
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    dbg = property(getDebugListener, setDebugListener)
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def consume(self):
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if self.initialStreamState:
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.consumeInitialHiddenTokens()
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a = self.input.index()
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = self.input.LT(1)
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.input.consume()
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        b = self.input.index()
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self._dbg.consumeToken(t)
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if b > a+1:
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # then we consumed more than one token; must be off channel tokens
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for idx in range(a+1, b):
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._dbg.consumeHiddenToken(self.input.get(idx));
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def consumeInitialHiddenTokens(self):
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """consume all initial off-channel tokens"""
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        firstOnChannelTokenIndex = self.input.index()
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for idx in range(firstOnChannelTokenIndex):
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self._dbg.consumeHiddenToken(self.input.get(idx))
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.initialStreamState = False
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def LT(self, i):
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if self.initialStreamState:
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.consumeInitialHiddenTokens()
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = self.input.LT(i)
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self._dbg.LT(i, t)
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return t
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def LA(self, i):
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if self.initialStreamState:
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.consumeInitialHiddenTokens()
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = self.input.LT(i)
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self._dbg.LT(i, t)
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return t.type
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def get(self, i):
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.input.get(i)
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def index(self):
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.input.index()
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def mark(self):
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.lastMarker = self.input.mark()
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self._dbg.mark(self.lastMarker)
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.lastMarker
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def rewind(self, marker=None):
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self._dbg.rewind(marker)
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.input.rewind(marker)
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def release(self, marker):
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def seek(self, index):
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # TODO: implement seek in dbg interface
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # self._dbg.seek(index);
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.input.seek(index)
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def size(self):
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.input.size()
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getTokenSource(self):
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.input.getTokenSource()
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getSourceName(self):
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.getTokenSource().getSourceName()
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def toString(self, start=None, stop=None):
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.input.toString(start, stop)
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass DebugTreeAdaptor(TreeAdaptor):
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """A TreeAdaptor proxy that fires debugging events to a DebugEventListener
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    delegate and uses the TreeAdaptor delegate to do the actual work.  All
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    AST events are triggered by this adaptor; no code gen changes are needed
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    in generated rules.  Debugging events are triggered *after* invoking
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree adaptor routines.
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Trees created with actions in rewrite actions like "-> ^(ADD {foo} {bar})"
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    cannot be tracked as they might not use the adaptor to create foo, bar.
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    The debug listener has to deal with tree node IDs for which it did
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    not see a createNode event.  A single <unknown> node is sufficient even
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if it represents a whole tree.
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __init__(self, dbg, adaptor):
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.dbg = dbg
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor = adaptor
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def createWithPayload(self, payload):
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if payload.getTokenIndex() < 0:
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # could be token conjured up during error recovery
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return self.createFromType(payload.getType(), payload.getText())
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = self.adaptor.createWithPayload(payload)
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.dbg.createNode(node, payload)
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return node
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def createFromToken(self, tokenType, fromToken, text=None):
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = self.adaptor.createFromToken(tokenType, fromToken, text)
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.dbg.createNode(node)
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return node
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def createFromType(self, tokenType, text):
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = self.adaptor.createFromType(tokenType, text)
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.dbg.createNode(node)
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return node
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def errorNode(self, input, start, stop, exc):
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = selfadaptor.errorNode(input, start, stop, exc)
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if node is not None:
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            dbg.errorNode(node)
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return node
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def dupTree(self, tree):
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = self.adaptor.dupTree(tree)
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # walk the tree and emit create and add child events
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # to simulate what dupTree has done. dupTree does not call this debug
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # adapter so I must simulate.
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.simulateTreeConstruction(t)
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return t
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def simulateTreeConstruction(self, t):
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""^(A B C): emit create A, create B, add child, ..."""
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.dbg.createNode(t)
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for i in range(self.adaptor.getChildCount(t)):
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            child = self.adaptor.getChild(t, i)
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.simulateTreeConstruction(child)
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.dbg.addChild(t, child)
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def dupNode(self, treeNode):
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        d = self.adaptor.dupNode(treeNode)
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.dbg.createNode(d)
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return d
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def nil(self):
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        node = self.adaptor.nil()
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.dbg.nilNode(node)
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return node
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def isNil(self, tree):
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.adaptor.isNil(tree)
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def addChild(self, t, child):
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if isinstance(child, Token):
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            n = self.createWithPayload(child)
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.addChild(t, n)
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else:
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if t is None or child is None:
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.adaptor.addChild(t, child)
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.dbg.addChild(t, child)
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def becomeRoot(self, newRoot, oldRoot):
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if isinstance(newRoot, Token):
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            n = self.createWithPayload(newRoot)
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.adaptor.becomeRoot(n, oldRoot)
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else:
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            n = self.adaptor.becomeRoot(newRoot, oldRoot)
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.dbg.becomeRoot(newRoot, oldRoot)
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return n
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def rulePostProcessing(self, root):
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.adaptor.rulePostProcessing(root)
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getType(self, t):
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.adaptor.getType(t)
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setType(self, t, type):
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor.setType(t, type)
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getText(self, t):
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.adaptor.getText(t)
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setText(self, t, text):
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor.setText(t, text)
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getToken(self, t):
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.adaptor.getToken(t)
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setTokenBoundaries(self, t, startToken, stopToken):
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor.setTokenBoundaries(t, startToken, stopToken)
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if t is not None and startToken is not None and stopToken is not None:
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.dbg.setTokenBoundaries(
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                t, startToken.getTokenIndex(),
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                stopToken.getTokenIndex())
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getTokenStartIndex(self, t):
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.adaptor.getTokenStartIndex(t)
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getTokenStopIndex(self, t):
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.adaptor.getTokenStopIndex(t)
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getChild(self, t, i):
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.adaptor.getChild(t, i)
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setChild(self, t, i, child):
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor.setChild(t, i, child)
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def deleteChild(self, t, i):
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.adaptor.deleteChild(t, i)
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getChildCount(self, t):
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.adaptor.getChildCount(t)
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getUniqueID(self, node):
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.adaptor.getUniqueID(node)
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getParent(self, t):
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.adaptor.getParent(t)
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getChildIndex(self, t):
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.adaptor.getChildIndex(t)
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setParent(self, t, parent):
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor.setParent(t, parent)
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setChildIndex(self, t, index):
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor.setChildIndex(t, index)
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def replaceChildren(self, parent, startChildIndex, stopChildIndex, t):
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor.replaceChildren(parent, startChildIndex, stopChildIndex, t)
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ## support
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getDebugListener(self):
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return dbg
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setDebugListener(self, dbg):
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.dbg = dbg
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getTreeAdaptor(self):
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.adaptor
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass DebugEventListener(object):
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """All debugging events that a recognizer can trigger.
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    I did not create a separate AST debugging interface as it would create
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lots of extra classes and DebugParser has a dbg var defined, which makes
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    it hard to change to ASTDebugEventListener.  I looked hard at this issue
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    and it is easier to understand as one monolithic event interface for all
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    possible events.  Hopefully, adding ST debugging stuff won't be bad.  Leave
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for future. 4/26/2006.
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    # Moved to version 2 for v3.1: added grammar name to enter/exit Rule
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    PROTOCOL_VERSION = "2"
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def enterRule(self, grammarFileName, ruleName):
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""The parser has just entered a rule. No decision has been made about
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        which alt is predicted.  This is fired AFTER init actions have been
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        executed.  Attributes are defined and available etc...
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        The grammarFileName allows composite grammars to jump around among
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        multiple grammar files.
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def enterAlt(self, alt):
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""Because rules can have lots of alternatives, it is very useful to
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        know which alt you are entering.  This is 1..n for n alts.
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def exitRule(self, grammarFileName, ruleName):
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""This is the last thing executed before leaving a rule.  It is
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        executed even if an exception is thrown.  This is triggered after
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        error reporting and recovery have occurred (unless the exception is
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        not caught in this rule).  This implies an "exitAlt" event.
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        The grammarFileName allows composite grammars to jump around among
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        multiple grammar files.
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def enterSubRule(self, decisionNumber):
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""Track entry into any (...) subrule other EBNF construct"""
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def exitSubRule(self, decisionNumber):
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def enterDecision(self, decisionNumber, couldBacktrack):
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""Every decision, fixed k or arbitrary, has an enter/exit event
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        so that a GUI can easily track what LT/consume events are
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        associated with prediction.  You will see a single enter/exit
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        subrule but multiple enter/exit decision events, one for each
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        loop iteration.
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def exitDecision(self, decisionNumber):
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def consumeToken(self, t):
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""An input token was consumed; matched by any kind of element.
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Trigger after the token was matched by things like match(), matchAny().
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def consumeHiddenToken(self, t):
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""An off-channel input token was consumed.
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Trigger after the token was matched by things like match(), matchAny().
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        (unless of course the hidden token is first stuff in the input stream).
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def LT(self, i, t):
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""Somebody (anybody) looked ahead.  Note that this actually gets
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        triggered by both LA and LT calls.  The debugger will want to know
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        which Token object was examined.  Like consumeToken, this indicates
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        what token was seen at that depth.  A remote debugger cannot look
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ahead into a file it doesn't have so LT events must pass the token
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        even if the info is redundant.
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def mark(self, marker):
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""The parser is going to look arbitrarily ahead; mark this location,
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        the token stream's marker is sent in case you need it.
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def rewind(self, marker=None):
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""After an arbitrairly long lookahead as with a cyclic DFA (or with
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        any backtrack), this informs the debugger that stream should be
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        rewound to the position associated with marker.
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def beginBacktrack(self, level):
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def endBacktrack(self, level, successful):
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def location(self, line, pos):
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""To watch a parser move through the grammar, the parser needs to
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        inform the debugger what line/charPos it is passing in the grammar.
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        For now, this does not know how to switch from one grammar to the
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        other and back for island grammars etc...
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        This should also allow breakpoints because the debugger can stop
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        the parser whenever it hits this line/pos.
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def recognitionException(self, e):
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""A recognition exception occurred such as NoViableAltException.  I made
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        this a generic event so that I can alter the exception hierachy later
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        without having to alter all the debug objects.
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Upon error, the stack of enter rule/subrule must be properly unwound.
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        If no viable alt occurs it is within an enter/exit decision, which
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        also must be rewound.  Even the rewind for each mark must be unwount.
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        In the Java target this is pretty easy using try/finally, if a bit
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ugly in the generated code.  The rewind is generated in DFA.predict()
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        actually so no code needs to be generated for that.  For languages
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        w/o this "finally" feature (C++?), the target implementor will have
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        to build an event stack or something.
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Across a socket for remote debugging, only the RecognitionException
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        data fields are transmitted.  The token object or whatever that
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        caused the problem was the last object referenced by LT.  The
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        immediately preceding LT event should hold the unexpected Token or
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        char.
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Here is a sample event trace for grammar:
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        b : C ({;}A|B) // {;} is there to prevent A|B becoming a set
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          | D
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ;
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        The sequence for this rule (with no viable alt in the subrule) for
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        input 'c c' (there are 3 tokens) is:
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		commence
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		LT(1)
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		enterRule b
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		location 7 1
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		enter decision 3
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		LT(1)
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		exit decision 3
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		enterAlt1
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		location 7 5
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		LT(1)
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		consumeToken [c/<4>,1:0]
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		location 7 7
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		enterSubRule 2
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		enter decision 2
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		LT(1)
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		LT(1)
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		recognitionException NoViableAltException 2 1 2
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		exit decision 2
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		exitSubRule 2
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		beginResync
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		LT(1)
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		consumeToken [c/<4>,1:1]
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		LT(1)
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		endResync
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		LT(-1)
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		exitRule b
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		terminate
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def beginResync(self):
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""Indicates the recognizer is about to consume tokens to resynchronize
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        the parser.  Any consume events from here until the recovered event
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        are not part of the parse--they are dead tokens.
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def endResync(self):
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""Indicates that the recognizer has finished consuming tokens in order
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        to resychronize.  There may be multiple beginResync/endResync pairs
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        before the recognizer comes out of errorRecovery mode (in which
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        multiple errors are suppressed).  This will be useful
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        in a gui where you want to probably grey out tokens that are consumed
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        but not matched to anything in grammar.  Anything between
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a beginResync/endResync pair was tossed out by the parser.
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def semanticPredicate(self, result, predicate):
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""A semantic predicate was evaluate with this result and action text"""
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def commence(self):
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""Announce that parsing has begun.  Not technically useful except for
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        sending events over a socket.  A GUI for example will launch a thread
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        to connect and communicate with a remote parser.  The thread will want
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        to notify the GUI when a connection is made.  ANTLR parsers
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        trigger this upon entry to the first rule (the ruleLevel is used to
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        figure this out).
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def terminate(self):
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """Parsing is over; successfully or not.  Mostly useful for telling
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        remote debugging listeners that it's time to quit.  When the rule
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        invocation level goes to zero at the end of a rule, we are done
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parsing.
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ## T r e e  P a r s i n g
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def consumeNode(self, t):
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """Input for a tree parser is an AST, but we know nothing for sure
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        about a node except its type and text (obtained from the adaptor).
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        This is the analog of the consumeToken method.  Again, the ID is
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        the hashCode usually of the node so it only works if hashCode is
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        not implemented.  If the type is UP or DOWN, then
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        the ID is not really meaningful as it's fixed--there is
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        just one UP node and one DOWN navigation node.
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def LT(self, i, t):
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""The tree parser lookedahead.  If the type is UP or DOWN,
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        then the ID is not really meaningful as it's fixed--there is
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        just one UP node and one DOWN navigation node.
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ## A S T  E v e n t s
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def nilNode(self, t):
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""A nil was created (even nil nodes have a unique ID...
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        they are not "null" per se).  As of 4/28/2006, this
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        seems to be uniquely triggered when starting a new subtree
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        such as when entering a subrule in automatic mode and when
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        building a tree in rewrite mode.
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        If you are receiving this event over a socket via
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        RemoteDebugEventSocketListener then only t.ID is set.
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def errorNode(self, t):
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""Upon syntax error, recognizers bracket the error with an error node
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if they are building ASTs.
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def createNode(self, node, token=None):
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""Announce a new node built from token elements such as type etc...
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        If you are receiving this event over a socket via
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        RemoteDebugEventSocketListener then only t.ID, type, text are
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        set.
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def becomeRoot(self, newRoot, oldRoot):
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""Make a node the new root of an existing root.
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Note: the newRootID parameter is possibly different
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        than the TreeAdaptor.becomeRoot() newRoot parameter.
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        In our case, it will always be the result of calling
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        TreeAdaptor.becomeRoot() and not root_n or whatever.
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        The listener should assume that this event occurs
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        only when the current subrule (or rule) subtree is
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        being reset to newRootID.
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        If you are receiving this event over a socket via
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        RemoteDebugEventSocketListener then only IDs are set.
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @see antlr3.tree.TreeAdaptor.becomeRoot()
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def addChild(self, root, child):
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""Make childID a child of rootID.
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        If you are receiving this event over a socket via
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        RemoteDebugEventSocketListener then only IDs are set.
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @see antlr3.tree.TreeAdaptor.addChild()
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        """
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setTokenBoundaries(self, t, tokenStartIndex, tokenStopIndex):
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""Set the token start/stop token index for a subtree root or node.
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        If you are receiving this event over a socket via
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        RemoteDebugEventSocketListener then only t.ID is set.
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	"""
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass BlankDebugEventListener(DebugEventListener):
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """A blank listener that does nothing; useful for real classes so
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    they don't have to have lots of blank methods and are less
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    sensitive to updates to debug interface.
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Note: this class is identical to DebugEventListener and exists purely
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for compatibility with Java.
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    pass
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TraceDebugEventListener(DebugEventListener):
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """A listener that simply records text representations of the events.
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Useful for debugging the debugging facility ;)
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Subclasses can override the record() method (which defaults to printing to
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    stdout) to record the events in a different way.
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __init__(self, adaptor=None):
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        super(TraceDebugEventListener, self).__init__()
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if adaptor is None:
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            adaptor = CommonTreeAdaptor()
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor = adaptor
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def record(self, event):
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        sys.stdout.write(event + '\n')
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def enterRule(self, grammarFileName, ruleName):
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.record("enterRule "+ruleName)
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def exitRule(self, grammarFileName, ruleName):
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.record("exitRule "+ruleName)
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def enterSubRule(self, decisionNumber):
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.record("enterSubRule")
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def exitSubRule(self, decisionNumber):
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.record("exitSubRule")
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def location(self, line, pos):
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.record("location %s:%s" % (line, pos))
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ## Tree parsing stuff
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def consumeNode(self, t):
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.record("consumeNode %s %s %s" % (
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.adaptor.getUniqueID(t),
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.adaptor.getText(t),
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.adaptor.getType(t)))
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def LT(self, i, t):
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.record("LT %s %s %s %s" % (
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                i,
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.adaptor.getUniqueID(t),
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.adaptor.getText(t),
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.adaptor.getType(t)))
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ## AST stuff
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def nilNode(self, t):
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.record("nilNode %s" % self.adaptor.getUniqueID(t))
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def createNode(self, t, token=None):
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if token is None:
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.record("create %s: %s, %s" % (
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.adaptor.getUniqueID(t),
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.adaptor.getText(t),
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.adaptor.getType(t)))
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else:
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.record("create %s: %s" % (
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.adaptor.getUniqueID(t),
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    token.getTokenIndex()))
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def becomeRoot(self, newRoot, oldRoot):
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.record("becomeRoot %s, %s" % (
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.adaptor.getUniqueID(newRoot),
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.adaptor.getUniqueID(oldRoot)))
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def addChild(self, root, child):
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.record("addChild %s, %s" % (
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.adaptor.getUniqueID(root),
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.adaptor.getUniqueID(child)))
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setTokenBoundaries(self, t, tokenStartIndex, tokenStopIndex):
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.record("setTokenBoundaries %s, %s, %s" % (
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.adaptor.getUniqueID(t),
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                tokenStartIndex, tokenStopIndex))
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass RecordDebugEventListener(TraceDebugEventListener):
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """A listener that records events as strings in an array."""
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __init__(self, adaptor=None):
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        super(RecordDebugEventListener, self).__init__(adaptor)
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.events = []
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def record(self, event):
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.events.append(event)
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass DebugEventSocketProxy(DebugEventListener):
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """A proxy debug event listener that forwards events over a socket to
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a debugger (or any other listener) using a simple text-based protocol;
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    one event per line.  ANTLRWorks listens on server socket with a
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    RemoteDebugEventSocketListener instance.  These two objects must therefore
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    be kept in sync.  New events must be handled on both sides of socket.
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    DEFAULT_DEBUGGER_PORT = 49100
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def __init__(self, recognizer, adaptor=None, port=None,
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                 debug=None):
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        super(DebugEventSocketProxy, self).__init__()
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.grammarFileName = recognizer.getGrammarFileName()
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	# Almost certainly the recognizer will have adaptor set, but
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # we don't know how to cast it (Parser or TreeParser) to get
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # the adaptor field.  Must be set with a constructor. :(
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor = adaptor
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.port = port or self.DEFAULT_DEBUGGER_PORT
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.debug = debug
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.socket = None
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.connection = None
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.input = None
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.output = None
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def log(self, msg):
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if self.debug is not None:
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.debug.write(msg + '\n')
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def handshake(self):
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if self.socket is None:
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # create listening socket
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.socket.bind(('', self.port))
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.socket.listen(1)
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.log("Waiting for incoming connection on port %d" % self.port)
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # wait for an incoming connection
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.connection, addr = self.socket.accept()
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.log("Accepted connection from %s:%d" % addr)
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.connection.setblocking(1)
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.connection.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # FIXME(pink): wrap into utf8 encoding stream
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.output = self.connection.makefile('w', 0)
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.input = self.connection.makefile('r', 0)
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.write("ANTLR %s" % self.PROTOCOL_VERSION)
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.write("grammar \"%s" % self.grammarFileName)
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.ack()
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def write(self, msg):
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.log("> %s" % msg)
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.output.write("%s\n" % msg)
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.output.flush()
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def ack(self):
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t = self.input.readline()
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.log("< %s" % t.rstrip())
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def transmit(self, event):
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.write(event);
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.ack();
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def commence(self):
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # don't bother sending event; listener will trigger upon connection
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pass
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def terminate(self):
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("terminate")
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.output.close()
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.input.close()
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.connection.close()
919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.socket.close()
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def enterRule(self, grammarFileName, ruleName):
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("enterRule\t%s\t%s" % (grammarFileName, ruleName))
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def enterAlt(self, alt):
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("enterAlt\t%d" % alt)
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def exitRule(self, grammarFileName, ruleName):
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("exitRule\t%s\t%s" % (grammarFileName, ruleName))
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def enterSubRule(self, decisionNumber):
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("enterSubRule\t%d" % decisionNumber)
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def exitSubRule(self, decisionNumber):
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("exitSubRule\t%d" % decisionNumber)
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def enterDecision(self, decisionNumber, couldBacktrack):
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit(
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "enterDecision\t%d\t%d" % (decisionNumber, couldBacktrack))
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def exitDecision(self, decisionNumber):
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("exitDecision\t%d" % decisionNumber)
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def consumeToken(self, t):
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("consumeToken\t%s" % self.serializeToken(t))
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def consumeHiddenToken(self, t):
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("consumeHiddenToken\t%s" % self.serializeToken(t))
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def LT(self, i, o):
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if isinstance(o, Tree):
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return self.LT_tree(i, o)
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.LT_token(i, o)
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def LT_token(self, i, t):
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if t is not None:
967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.transmit("LT\t%d\t%s" % (i, self.serializeToken(t)))
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def mark(self, i):
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("mark\t%d" % i)
972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def rewind(self, i=None):
975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if i is not None:
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.transmit("rewind\t%d" % i)
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else:
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.transmit("rewind")
979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def beginBacktrack(self, level):
982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("beginBacktrack\t%d" % level)
983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def endBacktrack(self, level, successful):
986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("endBacktrack\t%d\t%s" % (
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                level, ['0', '1'][bool(successful)]))
988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def location(self, line, pos):
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("location\t%d\t%d" % (line, pos))
992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def recognitionException(self, exc):
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit('\t'.join([
996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    "exception",
997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    exc.__class__.__name__,
998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    str(int(exc.index)),
999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    str(int(exc.line)),
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    str(int(exc.charPositionInLine))]))
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def beginResync(self):
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("beginResync")
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def endResync(self):
1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("endResync")
1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def semanticPredicate(self, result, predicate):
1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit('\t'.join([
1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    "semanticPredicate",
1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    str(int(result)),
1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.escapeNewlines(predicate)]))
1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ## A S T  P a r s i n g  E v e n t s
1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def consumeNode(self, t):
1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FIXME(31)
1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         StringBuffer buf = new StringBuffer(50);
1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         buf.append("consumeNode");
1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         serializeNode(buf, t);
1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         transmit(buf.toString());
1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def LT_tree(self, i, t):
1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FIXME(34)
1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         int ID = adaptor.getUniqueID(t);
1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         String text = adaptor.getText(t);
1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         int type = adaptor.getType(t);
1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         StringBuffer buf = new StringBuffer(50);
1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         buf.append("LN\t"); // lookahead node; distinguish from LT in protocol
1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         buf.append(i);
1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         serializeNode(buf, t);
1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         transmit(buf.toString());
1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def serializeNode(self, buf, t):
1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FIXME(33)
1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         int ID = adaptor.getUniqueID(t);
1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         String text = adaptor.getText(t);
1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         int type = adaptor.getType(t);
1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         buf.append("\t");
1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         buf.append(ID);
1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         buf.append("\t");
1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         buf.append(type);
1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         Token token = adaptor.getToken(t);
1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         int line = -1;
1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         int pos = -1;
1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         if ( token!=null ) {
1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             line = token.getLine();
1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             pos = token.getCharPositionInLine();
1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             }
1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         buf.append("\t");
1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         buf.append(line);
1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         buf.append("\t");
1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         buf.append(pos);
1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         int tokenIndex = adaptor.getTokenStartIndex(t);
1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         buf.append("\t");
1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         buf.append(tokenIndex);
1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         serializeText(buf, text);
1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ## A S T  E v e n t s
1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def nilNode(self, t):
1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("nilNode\t%d" % self.adaptor.getUniqueID(t))
1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def errorNode(self, t):
1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("errorNode\t%d\t%d\t\"%s" % (
1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver             self.adaptor.getUniqueID(t),
1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver             Token.INVALID_TOKEN_TYPE,
1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver             self.escapeNewlines(t.toString())))
1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def createNode(self, node, token=None):
1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if token is not None:
1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.transmit("createNode\t%d\t%d" % (
1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.adaptor.getUniqueID(node),
1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    token.getTokenIndex()))
1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else:
1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.transmit("createNodeFromTokenElements\t%d\t%d\t\"%s" % (
1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.adaptor.getUniqueID(node),
1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.adaptor.getType(node),
1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    self.adaptor.getText(node)))
1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def becomeRoot(self, newRoot, oldRoot):
1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("becomeRoot\t%d\t%d" % (
1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.adaptor.getUniqueID(newRoot),
1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.adaptor.getUniqueID(oldRoot)))
1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def addChild(self, root, child):
1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("addChild\t%d\t%d" % (
1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.adaptor.getUniqueID(root),
1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.adaptor.getUniqueID(child)))
1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setTokenBoundaries(self, t, tokenStartIndex, tokenStopIndex):
1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.transmit("setTokenBoundaries\t%d\t%d\t%d" % (
1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.adaptor.getUniqueID(t),
1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                tokenStartIndex, tokenStopIndex))
1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ## support
1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def setTreeAdaptor(self, adaptor):
1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.adaptor = adaptor
1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def getTreeAdaptor(self):
1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return self.adaptor
1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def serializeToken(self, t):
1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        buf = [str(int(t.getTokenIndex())),
1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver               str(int(t.getType())),
1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver               str(int(t.getChannel())),
1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver               str(int(t.getLine() or 0)),
1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver               str(int(t.getCharPositionInLine() or 0)),
1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver               '\"' + self.escapeNewlines(t.getText())]
1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return '\t'.join(buf)
1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def escapeNewlines(self, txt):
1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if txt is None:
1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return ''
1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        txt = txt.replace("%","%25")   # escape all escape char ;)
1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        txt = txt.replace("\n","%0A")  # escape \n
1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        txt = txt.replace("\r","%0D")  # escape \r
1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return txt
1138