1// [The "BSD licence"] 2// Copyright (c) 2006-2007 Kay Roepke 3// All rights reserved. 4// 5// Redistribution and use in source and binary forms, with or without 6// modification, are permitted provided that the following conditions 7// are met: 8// 1. Redistributions of source code must retain the above copyright 9// notice, this list of conditions and the following disclaimer. 10// 2. Redistributions in binary form must reproduce the above copyright 11// notice, this list of conditions and the following disclaimer in the 12// documentation and/or other materials provided with the distribution. 13// 3. The name of the author may not be used to endorse or promote products 14// derived from this software without specific prior written permission. 15// 16// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 27#import "ANTLRDebugTokenStream.h" 28 29 30@implementation ANTLRDebugTokenStream 31 32 33- (id) initWithTokenStream:(id<ANTLRTokenStream>)theStream debugListener:(id<ANTLRDebugEventListener>)debugger 34{ 35 self = [super init]; 36 if (self) { 37 [self setDebugListener:debugger]; 38 [self setInput:theStream]; 39 [self.input LT:1]; // force reading first on-channel token 40 initialStreamState = YES; 41 } 42 return self; 43} 44 45- (void) dealloc 46{ 47 [self setDebugListener:nil]; 48 self.input = nil; 49 [super dealloc]; 50} 51 52 53- (id<ANTLRDebugEventListener>) debugListener 54{ 55 return debugListener; 56} 57 58- (void) setDebugListener: (id<ANTLRDebugEventListener>) aDebugListener 59{ 60 if (debugListener != aDebugListener) { 61 [(id<ANTLRDebugEventListener,NSObject>)aDebugListener retain]; 62 [(id<ANTLRDebugEventListener,NSObject>)debugListener release]; 63 debugListener = aDebugListener; 64 } 65} 66 67- (id<ANTLRTokenStream>) input 68{ 69 return input; 70} 71 72- (void) setInput: (id<ANTLRTokenStream>) aTokenStream 73{ 74 if (input != aTokenStream) { 75 if ( input ) [input release]; 76 input = aTokenStream; 77 [input retain]; 78 } 79} 80 81- (void) consumeInitialHiddenTokens 82{ 83 int firstIdx = input.index; 84 for (int i = 0; i<firstIdx; i++) 85 [debugListener consumeHiddenToken:[input getToken:i]]; 86 initialStreamState = NO; 87} 88 89#pragma mark - 90#pragma mark Proxy implementation 91 92// anything else that hasn't some debugger event assicioated with it, is simply 93// forwarded to the actual token stream 94- (void) forwardInvocation:(NSInvocation *)anInvocation 95{ 96 [anInvocation invokeWithTarget:self.input]; 97} 98 99- (void) consume 100{ 101 if ( initialStreamState ) 102 [self consumeInitialHiddenTokens]; 103 int a = input.index; 104 id<ANTLRToken> token = [input LT:1]; 105 [input consume]; 106 int b = input.index; 107 [debugListener consumeToken:token]; 108 if (b > a+1) // must have consumed hidden tokens 109 for (int i = a+1; i < b; i++) 110 [debugListener consumeHiddenToken:[input getToken:i]]; 111} 112 113- (NSInteger) mark 114{ 115 lastMarker = [input mark]; 116 [debugListener mark:lastMarker]; 117 return lastMarker; 118} 119 120- (void) rewind 121{ 122 [debugListener rewind]; 123 [input rewind]; 124} 125 126- (void) rewind:(NSInteger)marker 127{ 128 [debugListener rewind:marker]; 129 [input rewind:marker]; 130} 131 132- (id<ANTLRToken>) LT:(NSInteger)k 133{ 134 if ( initialStreamState ) 135 [self consumeInitialHiddenTokens]; 136 [debugListener LT:k foundToken:[input LT:k]]; 137 return [input LT:k]; 138} 139 140- (NSInteger) LA:(NSInteger)k 141{ 142 if ( initialStreamState ) 143 [self consumeInitialHiddenTokens]; 144 [debugListener LT:k foundToken:[input LT:k]]; 145 return [input LA:k]; 146} 147 148- (id<ANTLRToken>) getToken:(NSInteger)i 149{ 150 return [input getToken:i]; 151} 152 153- (NSInteger) getIndex 154{ 155 return input.index; 156} 157 158- (void) release:(NSInteger) marker 159{ 160} 161 162- (void) seek:(NSInteger)index 163{ 164 // TODO: implement seek in dbg interface 165 // db.seek(index); 166 [input seek:index]; 167} 168 169- (NSInteger) size 170{ 171 return [input size]; 172} 173 174- (id<ANTLRTokenSource>) getTokenSource 175{ 176 return [input getTokenSource]; 177} 178 179- (NSString *) getSourceName 180{ 181 return [[input getTokenSource] getSourceName]; 182} 183 184- (NSString *) description 185{ 186 return [input toString]; 187} 188 189- (NSString *) toString 190{ 191 return [input toString]; 192} 193 194- (NSString *) toStringFromStart:(NSInteger)startIndex ToEnd:(NSInteger)stopIndex 195{ 196 return [input toStringFromStart:startIndex ToEnd:stopIndex]; 197} 198 199- (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken 200{ 201 return [input toStringFromStart:[startToken getStart] ToEnd:[stopToken getStopToken]]; 202} 203 204@end 205