// $ANTLR 3.0 Test.gl 2007-08-04 15:59:43

#import "TestLexer.h"

/** As per Terence: No returns for lexer rules!
#pragma mark Rule return scopes start
#pragma mark Rule return scopes end
*/
@implementation TestLexer

- (id) initWithCharStream:(id<ANTLRCharStream>)anInput
{
	if ((self = [super initWithCharStream:anInput]) != nil) {
	}
	return self;
}

- (void) dealloc
{
	[super dealloc];
}

+ (NSString *) tokenNameForType:(NSInteger)aTokenType
{
    return nil;
}

- (NSString *) grammarFileName
{
	return @"Test.gl";
}


- (void) mID
{
    @try {
        ruleNestingLevel++;
        int _type = TestLexer_ID;
        // Test.gl:8:6: ( LETTER ( LETTER | DIGIT )* ) // ruleBlockSingleAlt
        // Test.gl:8:6: LETTER ( LETTER | DIGIT )* // alt
        {
        [self mLETTER];


        do {
            int alt1=2;
            {
            	int LA1_0 = [input LA:1];
            	if ( (LA1_0>='0' && LA1_0<='9')||(LA1_0>='A' && LA1_0<='Z')||(LA1_0>='a' && LA1_0<='z') ) {
            		alt1 = 1;
            	}

            }
            switch (alt1) {
        	case 1 :
        	    // Test.gl: // alt
        	    {
        	    if (([input LA:1]>='0' && [input LA:1]<='9')||([input LA:1]>='A' && [input LA:1]<='Z')||([input LA:1]>='a' && [input LA:1]<='z')) {
        	    	[input consume];

        	    } else {
        	    	ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
        	    	[self recover:mse];	@throw mse;
        	    }


        	    }
        	    break;

        	default :
        	    goto loop1;
            }
        } while (YES); loop1: ;


        }

        self->_tokenType = _type;
    }
    @finally {
        ruleNestingLevel--;
        // rule cleanup
        // token+rule list labels

    }
    return;
}
// $ANTLR end ID


- (void) mDIGIT
{
    @try {
        ruleNestingLevel++;
        // Test.gl:11:18: ( '0' .. '9' ) // ruleBlockSingleAlt
        // Test.gl:11:18: '0' .. '9' // alt
        {
        [self matchRangeFromChar:'0' to:'9'];

        }

    }
    @finally {
        ruleNestingLevel--;
        // rule cleanup
        // token+rule list labels

    }
    return;
}
// $ANTLR end DIGIT


- (void) mLETTER
{
    @try {
        ruleNestingLevel++;
        // Test.gl:15:4: ( 'a' .. 'z' | 'A' .. 'Z' ) // ruleBlockSingleAlt
        // Test.gl: // alt
        {
        if (([input LA:1]>='A' && [input LA:1]<='Z')||([input LA:1]>='a' && [input LA:1]<='z')) {
        	[input consume];

        } else {
        	ANTLRMismatchedSetException *mse = [ANTLRMismatchedSetException exceptionWithSet:nil stream:input];
        	[self recover:mse];	@throw mse;
        }


        }

    }
    @finally {
        ruleNestingLevel--;
        // rule cleanup
        // token+rule list labels

    }
    return;
}
// $ANTLR end LETTER

- (void) mTokens
{
    // Test.gl:1:10: ( ID ) // ruleBlockSingleAlt
    // Test.gl:1:10: ID // alt
    {
    [self mID];



    }


}

@end