⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 antlrcommontokenstream.m

📁 antlr最新版本V3源代码
💻 M
字号:
// [The "BSD licence"]// Copyright (c) 2006-2007 Kay Roepke// All rights reserved.//// Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions// are met:// 1. Redistributions of source code must retain the above copyright//    notice, this list of conditions and the following disclaimer.// 2. Redistributions in binary form must reproduce the above copyright//    notice, this list of conditions and the following disclaimer in the//    documentation and/or other materials provided with the distribution.// 3. The name of the author may not be used to endorse or promote products//    derived from this software without specific prior written permission.//// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.#import "ANTLRCommonTokenStream.h"@implementation ANTLRCommonTokenStream#pragma mark Initialization- (id) init{	if ((self = [self initWithTokenSource:nil])) {	}	return self;}- (id) initWithTokenSource:(id<ANTLRTokenSource>)theTokenSource{	if ((self = [super init])) {		[self setTokenSource:theTokenSource];		p = -1;		discardOffChannelTokens = NO;		tokens = [[NSMutableArray alloc] initWithCapacity:500];		channelOverride = [[NSMutableDictionary alloc] init];		discardSet = [[NSMutableSet alloc] init];		channel = ANTLRTokenChannelDefault;	}	return self;}- (void) dealloc{	[discardSet release];	[channelOverride release];	[tokens release];	[self setTokenSource:nil];	[super dealloc];}- (void) fillBuffer{	int index = 0;	ANTLRToken *token = [tokenSource nextToken];	while ( token && [token type] != ANTLRTokenTypeEOF ) {		BOOL discard = NO;		NSNumber *tokenType = [NSNumber numberWithInt:[token type]];		if ([discardSet containsObject:tokenType])		{			discard = YES;		} else if ( discardOffChannelTokens && [token channel] != channel ) {			discard = YES;		} else {			NSNumber *channelI = [channelOverride objectForKey:tokenType];			if (channelI) {				[token setChannel:[channelI intValue]];			}		}		if ( !discard )	{			[token setTokenIndex:index];			[tokens addObject:token];			index++;		}		token = [tokenSource nextToken];	}	// leave p pointing at first token on channel	p = 0;	p = [self skipOffChannelTokens:p];}#pragma mark Accessors- (id<ANTLRTokenSource>) tokenSource{    return tokenSource; }- (void) setTokenSource: (id<ANTLRTokenSource>) aTokenSource{    if (tokenSource != aTokenSource) {        [(id<NSObject>)aTokenSource retain];        [(id<NSObject>)tokenSource release];        tokenSource = aTokenSource;		p = -1;		channel = ANTLRTokenChannelDefault;    }}#pragma mark Channels & Skipping- (int) skipOffChannelTokens:(int) i{	int n = [tokens count];	int tmp = i;	while ( tmp < n && [(ANTLRToken *)[tokens objectAtIndex:tmp] channel] != channel ) {		tmp++;	}	return tmp;}- (int) skipOffChannelTokensReverse:(int) i{	int tmp = i;	while ( tmp >= 0 && [(ANTLRToken *)[tokens objectAtIndex:tmp] channel] != channel ) {		tmp--;	}	return tmp;}- (void) setTokenType:(int)ttype toChannel:(int)theChannel{	[channelOverride setObject:[NSNumber numberWithInt:theChannel] forKey:[NSNumber numberWithInt:ttype]];}- (void) discardTokenType:(int)ttype{	[discardSet addObject:[NSNumber numberWithInt:ttype]];}- (void) discardOffChannelTokens:(BOOL)flag{	discardOffChannelTokens = flag;}#pragma mark Token access- (NSArray *) tokens{	if ( p == -1 ) {		[self fillBuffer];	}	return tokens;}- (NSArray *) tokensInRange:(NSRange)aRange{	return [tokens subarrayWithRange:aRange];}- (NSArray *) tokensInRange:(NSRange)aRange inBitSet:(ANTLRBitSet *)aBitSet{	int start = aRange.location;	int stop = aRange.location+aRange.length;	if ( p == -1 ) {		[self fillBuffer];	}	if (stop >= [tokens count]) {		stop = [tokens count] - 1;	}	NSMutableArray *filteredTokens = [[NSMutableArray alloc] init];	int i=0;	for (i = start; i<=stop; i++) {		ANTLRToken *token = [tokens objectAtIndex:i];		if (aBitSet == nil || [aBitSet isMember:[token type]]) {			[filteredTokens addObject:token];		}	}	if ([filteredTokens count]) {		return [filteredTokens autorelease];	} else {		[filteredTokens release];		return nil;	}}- (NSArray *) tokensInRange:(NSRange)aRange withTypes:(NSArray *)tokenTypes{	ANTLRBitSet *bits = [[ANTLRBitSet alloc] initWithArrayOfBits:tokenTypes];	NSArray *returnTokens = [self tokensInRange:aRange inBitSet:bits];	[bits release];	return returnTokens;}- (NSArray *) tokensInRange:(NSRange)aRange withType:(int)tokenType{	ANTLRBitSet *bits = [[ANTLRBitSet alloc] init];	[bits add:tokenType];	NSArray *returnTokens = [self tokensInRange:aRange inBitSet:bits];	[bits release];	return returnTokens;}- (ANTLRToken *) tokenAtIndex:(int)i{	return [tokens objectAtIndex:i];}- (int) count{	return [tokens count];}#pragma mark Lookahead- (ANTLRToken *) LT:(int)k{	if ( p == -1 ) {		[self fillBuffer];	}	if ( k == 0 ) {		return nil;	}	if ( k < 0 ) {		return [self LB:k];	}	if ( (p+k-1) >= [tokens count] ) {		return [ANTLRToken eofToken];	}	int i = p;	int n = 1;	while ( n < k ) {		i = [self skipOffChannelTokens:i+1];		n++;	}	if ( i >= [tokens count] ) {		return [ANTLRToken eofToken];	}	return [tokens objectAtIndex:i];}- (ANTLRToken *) LB:(int)k{	if ( p == -1 ) {		[self fillBuffer];	}	if ( k == 0 ) {		return nil;	}	if ( (p-k)<0 ) {		return nil;	}	if ( (p+k-1) >= [tokens count] ) {		return [ANTLRToken eofToken];	}	int i = p;	int n = 1;	while ( n <= k ) {		i = [self skipOffChannelTokensReverse:i-1];		n++;	}	if ( i-1 < 0 ) {		return nil;	}	return [tokens objectAtIndex:i-1];}- (int) LA:(int)k{	return [[self LT:k] type];}#pragma mark Stream Seeking- (void) consume{	if (p < [tokens count]) {		p++;		p = [self skipOffChannelTokens:p];	}}- (int) mark{	lastMarker = [self index];	return lastMarker;}- (void) release:(int)marker{	// empty}- (int) index{	return p;}- (void) rewind{	[self seek:lastMarker];}- (void) rewind:(int)marker{	[self seek:marker];}- (void) seek:(int)index{	p = index;}#pragma mark Stringvalues- (NSString *) stringValue{	if ( p == -1 ) {		[self fillBuffer];	}	return [self stringValueWithRange:NSMakeRange(0,[self count])];}- (NSString *) stringValueWithRange:(NSRange) aRange{	if ( p == -1 ) {		[self fillBuffer];	}	NSArray *tokensInRange = [self tokensInRange:aRange];	NSEnumerator *tokenEnum = [tokensInRange objectEnumerator];	ANTLRToken *token;	NSMutableString *stringValue = [[NSMutableString alloc] init];	while ((token = [tokenEnum nextObject])) {		[stringValue appendString:[token text]];	}	return [stringValue autorelease];}- (NSString *) stringValueFromToken:(ANTLRToken *)startToken toToken:(ANTLRToken *)stopToken{	if (startToken && stopToken) {		int start = [startToken tokenIndex];		int stop = [stopToken tokenIndex];		return [self stringValueWithRange:NSMakeRange(start,stop-start)];	}	return nil;}@end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -