Home | History | Annotate | Download | only in Framework
      1 // [The "BSD licence"]
      2 // Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
      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 "ANTLRToken.h"
     28 #import "ANTLRCommonTokenStream.h"
     29 
     30 
     31 @implementation ANTLRCommonTokenStream
     32 
     33 @synthesize channelOverride;
     34 @synthesize channel;
     35 
     36 #pragma mark Initialization
     37 
     38 + (ANTLRCommonTokenStream *)newANTLRCommonTokenStream
     39 {
     40     return [[ANTLRCommonTokenStream alloc] init];
     41 }
     42 
     43 + (ANTLRCommonTokenStream *)newANTLRCommonTokenStreamWithTokenSource:(id<ANTLRTokenSource>)theTokenSource
     44 {
     45     return [[ANTLRCommonTokenStream alloc] initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource];
     46 }
     47 
     48 + (ANTLRCommonTokenStream *)newANTLRCommonTokenStreamWithTokenSource:(id<ANTLRTokenSource>)theTokenSource Channel:(NSUInteger)aChannel
     49 {
     50     return [[ANTLRCommonTokenStream alloc] initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource Channel:aChannel];
     51 }
     52 
     53 - (id) init
     54 {
     55 	if ((self = [super init]) != nil) {
     56 		channelOverride = [[AMutableDictionary dictionaryWithCapacity:100] retain];
     57 		channel = ANTLRTokenChannelDefault;
     58 	}
     59 	return self;
     60 }
     61 
     62 - (id) initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource
     63 {
     64 	if ((self = [super initWithTokenSource:theTokenSource]) != nil) {
     65 		channelOverride = [[AMutableDictionary dictionaryWithCapacity:100] retain];
     66 		channel = ANTLRTokenChannelDefault;
     67 	}
     68 	return self;
     69 }
     70 
     71 - (id) initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource Channel:(NSUInteger)aChannel
     72 {
     73 	if ((self = [super initWithTokenSource:theTokenSource]) != nil) {
     74 		channelOverride = [[AMutableDictionary dictionaryWithCapacity:100] retain];
     75 		channel = aChannel;
     76 	}
     77 	return self;
     78 }
     79 
     80 - (void) dealloc
     81 {
     82 #ifdef DEBUG_DEALLOC
     83     NSLog( @"called dealloc in ANTLRCommonTokenStream" );
     84 #endif
     85 	if ( channelOverride ) [channelOverride release];
     86 	if ( tokens ) [tokens release];
     87 	[self setTokenSource:nil];
     88 	[super dealloc];
     89 }
     90 
     91 /** Always leave index on an on-channel token. */
     92 - (void) consume
     93 {
     94     if (index == -1) [self setup];
     95     index++;
     96     [self sync:index];
     97     while ( ((ANTLRCommonToken *)[tokens objectAtIndex:index]).channel != channel ) {
     98 		index++;
     99 		[self sync:index];
    100 	}
    101 }
    102 
    103 #pragma mark Lookahead
    104 
    105 - (id<ANTLRToken>) LB:(NSInteger)k
    106 {
    107 	if ( k == 0 || (index-k) < 0 ) {
    108 		return nil;
    109 	}
    110 	int i = index;
    111 	int n = 1;
    112     // find k good tokens looking backwards
    113 	while ( n <= k ) {
    114 		i = [self skipOffChannelTokensReverse:i-1];
    115 		n++;
    116 	}
    117 	if ( i < 0 ) {
    118 		return nil;
    119 	}
    120 	return [tokens objectAtIndex:i];
    121 }
    122 
    123 - (id<ANTLRToken>) LT:(NSInteger)k
    124 {
    125 	if ( index == -1 ) [self setup];
    126 	if ( k == 0 ) return nil;
    127 	if ( k < 0 ) return [self LB:-k];
    128 	int i = index;
    129 	int n = 1;
    130 	while ( n < k ) {
    131 		i = [self skipOffChannelTokens:i+1];
    132 		n++;
    133 	}
    134 //	if ( i >= (NSInteger)[tokens count] ) {
    135 //		return [ANTLRCommonToken eofToken];
    136 //	}
    137     if ( i > range ) range = i;
    138 	return [tokens objectAtIndex:i];
    139 }
    140 
    141 #pragma mark Channels & Skipping
    142 
    143 - (NSInteger) skipOffChannelTokens:(NSInteger) idx
    144 {
    145     [self sync:idx];
    146 	while ( ((ANTLRCommonToken *)[tokens objectAtIndex:idx]).channel != channel ) {
    147 		idx++;
    148         [self sync:idx];
    149 	}
    150 	return idx;
    151 }
    152 
    153 - (NSInteger) skipOffChannelTokensReverse:(NSInteger) i
    154 {
    155 	while ( i >= 0 && ((ANTLRCommonToken *)[tokens objectAtIndex:i]).channel != channel ) {
    156 		i--;
    157 	}
    158 	return i;
    159 }
    160 
    161 - (void) setup
    162 {
    163     index = 0;
    164     [self sync:0];
    165     int i = 0;
    166     while ( ((ANTLRCommonToken *)[tokens objectAtIndex:i]).channel != channel ) {
    167         i++;
    168         [self sync:i];
    169     }
    170 	// leave index pointing at first token on channel
    171     index = i;
    172 }
    173 
    174 - (NSInteger) getNumberOfOnChannelTokens
    175 {
    176     NSInteger n = 0;
    177     [self fill];
    178     for( int i = 0; i < [tokens count]; i++ ) {
    179         ANTLRCommonToken *t = [tokens objectAtIndex:i];
    180         if ( t.channel == channel )
    181             n++;
    182         if ( t.type == ANTLRTokenTypeEOF )
    183             break;
    184     }
    185     return n;
    186 }
    187 
    188 /** Reset this token stream by setting its token source. */
    189 - (void) setTokenSource:(id<ANTLRTokenSource>)aTokenSource
    190 {
    191     [super setTokenSource:aTokenSource];
    192     channel = ANTLRTokenChannelDefault;
    193 }
    194 
    195 - (id) copyWithZone:(NSZone *)aZone
    196 {
    197     ANTLRCommonTokenStream *copy;
    198 	
    199     //    copy = [[[self class] allocWithZone:aZone] init];
    200     copy = [super copyWithZone:aZone]; // allocation occurs in ANTLRBaseTree
    201     if ( self.channelOverride )
    202         copy.channelOverride = [channelOverride copyWithZone:aZone];
    203     copy.channel = channel;
    204     return copy;
    205 }
    206 
    207 - (NSUInteger)channel
    208 {
    209     return channel;
    210 }
    211 
    212 - (void)setChannel:(NSUInteger)aChannel
    213 {
    214     channel = aChannel;
    215 }
    216 
    217 - (AMutableDictionary *)channelOverride
    218 {
    219     return channelOverride;
    220 }
    221 
    222 - (void)setChannelOverride:(AMutableDictionary *)anOverride
    223 {
    224     channelOverride = anOverride;
    225 }
    226 
    227 #ifdef DONTUSENOMO
    228 #pragma mark Token access
    229 
    230 - (NSArray *) tokensInRange:(NSRange)aRange
    231 {
    232 	return [tokens subarrayWithRange:aRange];
    233 }
    234 
    235 #pragma mark Accessors
    236 
    237 - (id<ANTLRTokenSource>) getTokenSource
    238 {
    239     return tokenSource; 
    240 }
    241 
    242 - (NSArray *) tokensInRange:(NSRange)aRange inBitSet:(ANTLRBitSet *)aBitSet
    243 {
    244 	unsigned int startIndex = aRange.location;
    245 	unsigned int stopIndex = aRange.location+aRange.length;
    246 	if ( index == -1 ) {
    247 		[self setup];
    248 	}
    249 	if (stopIndex >= [tokens count]) {
    250 		stopIndex = [tokens count] - 1;
    251 	}
    252 	AMutableArray *filteredTokens = [AMutableArray arrayWithCapacity:100];
    253 	unsigned int i=0;
    254 	for (i = startIndex; i<=stopIndex; i++) {
    255 		id<ANTLRToken> token = [tokens objectAtIndex:i];
    256 		if (aBitSet == nil || [aBitSet member:token.type]) {
    257 			[filteredTokens addObject:token];
    258 		}
    259 	}
    260 	if ([filteredTokens count]) {
    261 		return filteredTokens;
    262 	} else {
    263 		[filteredTokens release];
    264 		return nil;
    265 	}
    266 }
    267 
    268 - (NSArray *) tokensInRange:(NSRange)aRange withTypes:(NSArray *)tokenTypes
    269 {
    270 	ANTLRBitSet *bits = [[ANTLRBitSet alloc] initWithArrayOfBits:tokenTypes];
    271 	NSArray *returnTokens = [[self tokensInRange:aRange inBitSet:bits] retain];
    272 	[bits release];
    273 	return returnTokens;
    274 }
    275 
    276 - (NSArray *) tokensInRange:(NSRange)aRange withType:(NSInteger)tokenType
    277 {
    278 	ANTLRBitSet *bits = [[ANTLRBitSet alloc] init];
    279 	[bits add:tokenType];
    280 	NSArray *returnTokens = [[self tokensInRange:aRange inBitSet:bits] retain];
    281 	[bits release];
    282 	return returnTokens;
    283 }
    284 
    285 - (id<ANTLRToken>) getToken:(NSInteger)i
    286 {
    287 	return [tokens objectAtIndex:i];
    288 }
    289 
    290 - (NSInteger) size
    291 {
    292 	return [tokens count];
    293 }
    294 
    295 - (void) rewind
    296 {
    297 	[self seek:lastMarker];
    298 }
    299 
    300 - (void) rewind:(NSInteger)marker
    301 {
    302 	[self seek:marker];
    303 }
    304 
    305 - (void) seek:(NSInteger)anIndex
    306 {
    307 	index = anIndex;
    308 }
    309 #pragma mark toString routines
    310 
    311 - (NSString *) toString
    312 {
    313 	if ( index == -1 ) {
    314 		[self setup];
    315 	}
    316 	return [self toStringFromStart:0 ToEnd:[tokens count]];
    317 }
    318 
    319 - (NSString *) toStringFromStart:(NSInteger)startIdx ToEnd:(NSInteger) stopIdx
    320 {
    321     NSMutableString *stringBuffer;
    322     id<ANTLRToken> t;
    323 
    324     if ( startIdx < 0 || stopIdx < 0 ) {
    325         return nil;
    326     }
    327     if ( index == -1 ) {
    328         [self setup];
    329     }
    330     if ( stopIdx >= [tokens count] ) {
    331         stopIdx = [tokens count]-1;
    332     }
    333     stringBuffer = [NSMutableString stringWithCapacity:30];
    334     for (int i = startIdx; i <= stopIdx; i++) {
    335         t = (id<ANTLRToken>)[tokens objectAtIndex:i];
    336         [stringBuffer appendString:[t text]];
    337     }
    338     return stringBuffer;
    339 }
    340 
    341 - (NSString *) toStringFromToken:(id<ANTLRToken>)startToken ToToken:(id<ANTLRToken>)stopToken
    342 {
    343 	if (startToken && stopToken) {
    344 		int startIdx = [startToken getTokenIndex];
    345 		int stopIdx = [stopToken getTokenIndex];
    346 		return [self toStringFromStart:startIdx ToEnd:stopIdx];
    347 	}
    348 	return nil;
    349 }
    350 #endif
    351 
    352 @end
    353