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