/** \file
 *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
 *
 *     -  From the grammar source file : T.g
 *     -                            On : 2011-05-06 19:14:23
 *     -                for the parser : TParserParser
 *
 * Editing it, at least manually, is not wise.
 *
 * ObjC language generator and runtime by Alan Condit, acondit|hereisanat|ipns|dotgoeshere|com.
 *
 *
*/
// $ANTLR ${project.version} ${buildNumber} T.g 2011-05-06 19:14:23


/* -----------------------------------------
 * Include the ANTLR3 generated header file.
 */
#import "TParser.h"
/* ----------------------------------------- */

/** Demonstrates how semantic predicates get hoisted out of the rule in 
 *  which they are found and used in other decisions.  This grammar illustrates
 *  how predicates can be used to distinguish between enum as a keyword and
 *  an ID *dynamically*. :)

 * Run "java org.antlr.Tool -dfa t.g" to generate DOT (graphviz) files.  See
 * the T_dec-1.dot file to see the predicates in action.
 */

/* ============================================================================= */
/* =============================================================================
 * Start of recognizer
 */

#pragma mark Bitsets
static ANTLRBitSet *FOLLOW_identifier_in_stat34;
static const unsigned long long FOLLOW_identifier_in_stat34_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_enumAsKeyword_in_stat47;
static const unsigned long long FOLLOW_enumAsKeyword_in_stat47_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_ID_in_identifier66;
static const unsigned long long FOLLOW_ID_in_identifier66_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_enumAsID_in_identifier74;
static const unsigned long long FOLLOW_enumAsID_in_identifier74_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_7_in_enumAsKeyword89;
static const unsigned long long FOLLOW_7_in_enumAsKeyword89_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_7_in_enumAsID100;
static const unsigned long long FOLLOW_7_in_enumAsID100_data[] = { 0x0000000000000002LL};


#pragma mark Dynamic Global Scopes

#pragma mark Dynamic Rule Scopes

#pragma mark Rule Return Scopes start
//#pragma mark Rule return scopes start
//

#pragma mark Rule return scopes start

@implementation TParser  // line 637

/* ObjC start of ruleAttributeScope */
#pragma mark Dynamic Rule Scopes
/* ObjC end of ruleAttributeScope */
#pragma mark global Attribute Scopes
/* ObjC start globalAttributeScope */
/* ObjC end globalAttributeScope */
/* ObjC start actions.(actionScope).synthesize */
/* ObjC end actions.(actionScope).synthesize */
/* ObjC start synthesize() */
/* ObjC end synthesize() */

+ (void) initialize
{
    #pragma mark Bitsets
    FOLLOW_identifier_in_stat34 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_identifier_in_stat34_data Count:(NSUInteger)1] retain];
    FOLLOW_enumAsKeyword_in_stat47 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_enumAsKeyword_in_stat47_data Count:(NSUInteger)1] retain];
    FOLLOW_ID_in_identifier66 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_identifier66_data Count:(NSUInteger)1] retain];
    FOLLOW_enumAsID_in_identifier74 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_enumAsID_in_identifier74_data Count:(NSUInteger)1] retain];
    FOLLOW_7_in_enumAsKeyword89 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_enumAsKeyword89_data Count:(NSUInteger)1] retain];
    FOLLOW_7_in_enumAsID100 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_enumAsID100_data Count:(NSUInteger)1] retain];

    [ANTLRBaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
 @"ID", @"INT", @"WS", @"'enum'", nil] retain]];
    [ANTLRBaseRecognizer setGrammarFileName:@"T.g"];
}

+ (TParser *)newTParser:(id<ANTLRTokenStream>)aStream
{
    return [[TParser alloc] initWithTokenStream:aStream];


}

- (id) initWithTokenStream:(id<ANTLRTokenStream>)aStream
{
    self = [super initWithTokenStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:4+1] retain]];
    if ( self != nil ) {


        /* start of actions-actionScope-init */

        enableEnum = NO;

        /* start of init */
    }
    return self;
}

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

/* ObjC start members */
/* ObjC end members */
/* ObjC start actions.(actionScope).methods */
/* ObjC end actions.(actionScope).methods */
/* ObjC start methods() */
/* ObjC end methods() */
/* ObjC start rules */
/*
 * $ANTLR start stat
 * T.g:24:1: stat : ( identifier | enumAsKeyword );
 */
- (void) stat
{
    /* my ruleScopeSetUp */
    /* Terence's stuff */

    @try {
        // T.g:24:5: ( identifier | enumAsKeyword ) //ruleblock
        NSInteger alt1=2;
        NSInteger LA1_0 = [input LA:1];

        if ( (LA1_0==ID) ) {
            alt1=1;
        }
        else if ( (LA1_0==7) ) {
            NSInteger LA1_2 = [input LA:2];

            if ( ((!enableEnum)) ) {
                alt1=1;
            }
            else if ( ((enableEnum)) ) {
                alt1=2;
            }
            else {
                ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:1 state:2 stream:input];
                nvae.c = LA1_2;
                @throw nvae;

            }
        }
        else {
            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:1 state:0 stream:input];
            nvae.c = LA1_0;
            @throw nvae;

        }
        switch (alt1) {
            case 1 : ;
                // T.g:24:7: identifier // alt
                {
                /* ruleRef */
                [self pushFollow:FOLLOW_identifier_in_stat34];
                [self identifier];

                [self popFollow];



                NSLog(@"enum is an ID");


                }
                break;
            case 2 : ;
                // T.g:25:7: enumAsKeyword // alt
                {
                /* ruleRef */
                [self pushFollow:FOLLOW_enumAsKeyword_in_stat47];
                [self enumAsKeyword];

                [self popFollow];



                NSLog(@"enum is a keyword");


                }
                break;

        }
        // token+rule list labels

    }
    @catch (ANTLRRecognitionException *re) {
        [self reportError:re];
        [self recover:input Exception:re];
    }

    @finally {
        /* Terence's stuff */

    }
    return ;
}
/* $ANTLR end stat */

/*
 * $ANTLR start identifier
 * T.g:28:1: identifier : ( ID | enumAsID );
 */
- (void) identifier
{
    /* my ruleScopeSetUp */
    /* Terence's stuff */

    @try {
        // T.g:29:5: ( ID | enumAsID ) //ruleblock
        NSInteger alt2=2;
        NSInteger LA2_0 = [input LA:1];

        if ( (LA2_0==ID) ) {
            alt2=1;
        }
        else if ( (LA2_0==7) ) {
            alt2=2;
        }
        else {
            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:2 state:0 stream:input];
            nvae.c = LA2_0;
            @throw nvae;

        }
        switch (alt2) {
            case 1 : ;
                // T.g:29:7: ID // alt
                {
                [self match:input TokenType:ID Follow:FOLLOW_ID_in_identifier66]; 

                }
                break;
            case 2 : ;
                // T.g:30:7: enumAsID // alt
                {
                /* ruleRef */
                [self pushFollow:FOLLOW_enumAsID_in_identifier74];
                [self enumAsID];

                [self popFollow];



                }
                break;

        }
        // token+rule list labels

    }
    @catch (ANTLRRecognitionException *re) {
        [self reportError:re];
        [self recover:input Exception:re];
    }

    @finally {
        /* Terence's stuff */

    }
    return ;
}
/* $ANTLR end identifier */

/*
 * $ANTLR start enumAsKeyword
 * T.g:33:1: enumAsKeyword :{...}? 'enum' ;
 */
- (void) enumAsKeyword
{
    /* my ruleScopeSetUp */
    /* Terence's stuff */

    @try {
        // T.g:33:15: ({...}? 'enum' ) // ruleBlockSingleAlt
        // T.g:33:17: {...}? 'enum' // alt
        {
        if ( !((enableEnum)) ) {
            @throw [ANTLRFailedPredicateException newException:@"enumAsKeyword" predicate:@"enableEnum" stream:input];
        }

        [self match:input TokenType:7 Follow:FOLLOW_7_in_enumAsKeyword89]; 

        }

        // token+rule list labels

    }
    @catch (ANTLRRecognitionException *re) {
        [self reportError:re];
        [self recover:input Exception:re];
    }

    @finally {
        /* Terence's stuff */

    }
    return ;
}
/* $ANTLR end enumAsKeyword */

/*
 * $ANTLR start enumAsID
 * T.g:35:1: enumAsID :{...}? 'enum' ;
 */
- (void) enumAsID
{
    /* my ruleScopeSetUp */
    /* Terence's stuff */

    @try {
        // T.g:35:10: ({...}? 'enum' ) // ruleBlockSingleAlt
        // T.g:35:12: {...}? 'enum' // alt
        {
        if ( !((!enableEnum)) ) {
            @throw [ANTLRFailedPredicateException newException:@"enumAsID" predicate:@"!enableEnum" stream:input];
        }

        [self match:input TokenType:7 Follow:FOLLOW_7_in_enumAsID100]; 

        }

        // token+rule list labels

    }
    @catch (ANTLRRecognitionException *re) {
        [self reportError:re];
        [self recover:input Exception:re];
    }

    @finally {
        /* Terence's stuff */

    }
    return ;
}
/* $ANTLR end enumAsID */
/* ObjC end rules */

@end /* end of TParser implementation line 692 */