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