/** \file
 *  This OBJC source file was generated by $ANTLR version ${project.version} ${buildNumber}
 *
 *     -  From the grammar source file : SymbolTable.g
 *     -                            On : 2011-05-06 15:04:42
 *     -                for the parser : SymbolTableParserParser
 *
 * 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} SymbolTable.g 2011-05-06 15:04:42


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


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

#pragma mark Bitsets
static ANTLRBitSet *FOLLOW_globals_in_prog50;
static const unsigned long long FOLLOW_globals_in_prog50_data[] = { 0x0000000000001002LL};
static ANTLRBitSet *FOLLOW_method_in_prog53;
static const unsigned long long FOLLOW_method_in_prog53_data[] = { 0x0000000000001002LL};
static ANTLRBitSet *FOLLOW_decl_in_globals85;
static const unsigned long long FOLLOW_decl_in_globals85_data[] = { 0x0000000000000802LL};
static ANTLRBitSet *FOLLOW_12_in_method116;
static const unsigned long long FOLLOW_12_in_method116_data[] = { 0x0000000000000010LL};
static ANTLRBitSet *FOLLOW_ID_in_method118;
static const unsigned long long FOLLOW_ID_in_method118_data[] = { 0x0000000000000080LL};
static ANTLRBitSet *FOLLOW_7_in_method120;
static const unsigned long long FOLLOW_7_in_method120_data[] = { 0x0000000000000100LL};
static ANTLRBitSet *FOLLOW_8_in_method122;
static const unsigned long long FOLLOW_8_in_method122_data[] = { 0x0000000000002000LL};
static ANTLRBitSet *FOLLOW_block_in_method124;
static const unsigned long long FOLLOW_block_in_method124_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_13_in_block153;
static const unsigned long long FOLLOW_13_in_block153_data[] = { 0x0000000000006810LL};
static ANTLRBitSet *FOLLOW_decl_in_block156;
static const unsigned long long FOLLOW_decl_in_block156_data[] = { 0x0000000000006810LL};
static ANTLRBitSet *FOLLOW_stat_in_block161;
static const unsigned long long FOLLOW_stat_in_block161_data[] = { 0x0000000000006010LL};
static ANTLRBitSet *FOLLOW_14_in_block165;
static const unsigned long long FOLLOW_14_in_block165_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_ID_in_stat189;
static const unsigned long long FOLLOW_ID_in_stat189_data[] = { 0x0000000000000400LL};
static ANTLRBitSet *FOLLOW_10_in_stat191;
static const unsigned long long FOLLOW_10_in_stat191_data[] = { 0x0000000000000020LL};
static ANTLRBitSet *FOLLOW_INT_in_stat193;
static const unsigned long long FOLLOW_INT_in_stat193_data[] = { 0x0000000000000200LL};
static ANTLRBitSet *FOLLOW_9_in_stat195;
static const unsigned long long FOLLOW_9_in_stat195_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_block_in_stat205;
static const unsigned long long FOLLOW_block_in_stat205_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_11_in_decl219;
static const unsigned long long FOLLOW_11_in_decl219_data[] = { 0x0000000000000010LL};
static ANTLRBitSet *FOLLOW_ID_in_decl221;
static const unsigned long long FOLLOW_ID_in_decl221_data[] = { 0x0000000000000200LL};
static ANTLRBitSet *FOLLOW_9_in_decl223;
static const unsigned long long FOLLOW_9_in_decl223_data[] = { 0x0000000000000002LL};


#pragma mark Dynamic Global Scopes
@implementation Symbols_Scope  /* globalAttributeScopeImplementation */
/* start of synthesize -- OBJC-Line 1750 */

@synthesize names;

+ (Symbols_Scope *)newSymbols_Scope
{
    return [[[Symbols_Scope alloc] init] retain];
}

- (id) init
{
    self = [super init];
    return self;
}

/* start of iterate get and set functions */

- (ANTLRPtrBuffer *)getnames { return( names ); }

- (void)setnames:(ANTLRPtrBuffer *)aVal { names = aVal; }

/* End of iterate get and set functions */

@end /* end of Symbols_Scope implementation */


#pragma mark Dynamic Rule Scopes

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

#pragma mark Rule return scopes start

@implementation SymbolTableParser  // line 637

/* ObjC start of ruleAttributeScope */
#pragma mark Dynamic Rule Scopes
/* ObjC end of ruleAttributeScope */
#pragma mark global Attribute Scopes
/* ObjC start globalAttributeScope */
static _stack;

/* 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_globals_in_prog50 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_globals_in_prog50_data Count:(NSUInteger)1] retain];
    FOLLOW_method_in_prog53 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_method_in_prog53_data Count:(NSUInteger)1] retain];
    FOLLOW_decl_in_globals85 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_decl_in_globals85_data Count:(NSUInteger)1] retain];
    FOLLOW_12_in_method116 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_12_in_method116_data Count:(NSUInteger)1] retain];
    FOLLOW_ID_in_method118 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_method118_data Count:(NSUInteger)1] retain];
    FOLLOW_7_in_method120 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_method120_data Count:(NSUInteger)1] retain];
    FOLLOW_8_in_method122 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_method122_data Count:(NSUInteger)1] retain];
    FOLLOW_block_in_method124 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_method124_data Count:(NSUInteger)1] retain];
    FOLLOW_13_in_block153 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_13_in_block153_data Count:(NSUInteger)1] retain];
    FOLLOW_decl_in_block156 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_decl_in_block156_data Count:(NSUInteger)1] retain];
    FOLLOW_stat_in_block161 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_stat_in_block161_data Count:(NSUInteger)1] retain];
    FOLLOW_14_in_block165 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_14_in_block165_data Count:(NSUInteger)1] retain];
    FOLLOW_ID_in_stat189 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_stat189_data Count:(NSUInteger)1] retain];
    FOLLOW_10_in_stat191 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_10_in_stat191_data Count:(NSUInteger)1] retain];
    FOLLOW_INT_in_stat193 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_stat193_data Count:(NSUInteger)1] retain];
    FOLLOW_9_in_stat195 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_9_in_stat195_data Count:(NSUInteger)1] retain];
    FOLLOW_block_in_stat205 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_stat205_data Count:(NSUInteger)1] retain];
    FOLLOW_11_in_decl219 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_decl219_data Count:(NSUInteger)1] retain];
    FOLLOW_ID_in_decl221 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_decl221_data Count:(NSUInteger)1] retain];
    FOLLOW_9_in_decl223 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_9_in_decl223_data Count:(NSUInteger)1] retain];

    [ANTLRBaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
 @"ID", @"INT", @"WS", @"'('", @"')'", @"';'", @"'='", @"'int'", @"'method'", 
 @"'{'", @"'}'", nil] retain]];
    [ANTLRBaseRecognizer setGrammarFileName:@"SymbolTable.g"];
}

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


}

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


        /* globalAttributeScopeInit */
        Symbols_scope = [Symbols_Scope newSymbols_Scope];
        Symbols_stack = [ANTLRSymbolStack newANTLRSymbolStackWithLen:30];
        /* start of actions-actionScope-init */

        level = 0;

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

- (void) dealloc
{
    [Symbols_stack release];
    [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 prog
 * SymbolTable.g:25:1: prog : globals ( method )* ;
 */
- (void) prog
{
    /* my ruleScopeSetUp */
    /* Terence's stuff */

    @try {
        // SymbolTable.g:27:5: ( globals ( method )* ) // ruleBlockSingleAlt
        // SymbolTable.g:27:9: globals ( method )* // alt
        {
        /* ruleRef */
        [self pushFollow:FOLLOW_globals_in_prog50];
        [self globals];

        [self popFollow];



        do {
            NSInteger alt1=2;
            NSInteger LA1_0 = [input LA:1];
            if ( (LA1_0==12) ) {
                alt1=1;
            }


            switch (alt1) {
                case 1 : ;
                    // SymbolTable.g:27:18: method // alt
                    {
                    /* ruleRef */
                    [self pushFollow:FOLLOW_method_in_prog53];
                    [self method];

                    [self popFollow];



                    }
                    break;

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


        }

        // token+rule list labels

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

    @finally {
        /* Terence's stuff */

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

/*
 * $ANTLR start globals
 * SymbolTable.g:30:1: globals : ( decl )* ;
 */
- (void) globals
{
    /* my ruleScopeSetUp */
    /* Terence's stuff */
    [Symbols_stack push:[[Symbols_Scope newSymbols_Scope] retain]];


        level++;
        /* scopeSetAttributeRef */((Symbols_Scope *)[Symbols_stack peek]).names =  [ANTLRPtrBuffer newANTLRPtrBufferWithLen:10];

    @try {
        // SymbolTable.g:36:5: ( ( decl )* ) // ruleBlockSingleAlt
        // SymbolTable.g:36:9: ( decl )* // alt
        {
        do {
            NSInteger alt2=2;
            NSInteger LA2_0 = [input LA:1];
            if ( (LA2_0==11) ) {
                alt2=1;
            }


            switch (alt2) {
                case 1 : ;
                    // SymbolTable.g:36:10: decl // alt
                    {
                    /* ruleRef */
                    [self pushFollow:FOLLOW_decl_in_globals85];
                    [self decl];

                    [self popFollow];



                    }
                    break;

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



                    NSLog( @"globals: %@", [((Symbols_Scope *)[Symbols_stack peek]).names toString] );
                    level--;
                


        }

        // token+rule list labels

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

    @finally {
        /* Terence's stuff */
        [Symbols_stack pop];

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

/*
 * $ANTLR start method
 * SymbolTable.g:43:1: method : 'method' ID '(' ')' block ;
 */
- (void) method
{
    /* my ruleScopeSetUp */
    /* Terence's stuff */

    @try {
        // SymbolTable.g:44:5: ( 'method' ID '(' ')' block ) // ruleBlockSingleAlt
        // SymbolTable.g:44:9: 'method' ID '(' ')' block // alt
        {
        [self match:input TokenType:12 Follow:FOLLOW_12_in_method116]; 

        [self match:input TokenType:ID Follow:FOLLOW_ID_in_method118]; 

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

        [self match:input TokenType:8 Follow:FOLLOW_8_in_method122]; 

        /* ruleRef */
        [self pushFollow:FOLLOW_block_in_method124];
        [self block];

        [self popFollow];



        }

        // token+rule list labels

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

    @finally {
        /* Terence's stuff */

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

/*
 * $ANTLR start block
 * SymbolTable.g:47:1: block : '{' ( decl )* ( stat )* '}' ;
 */
- (void) block
{
    /* my ruleScopeSetUp */
    /* Terence's stuff */
    [Symbols_stack push:[[Symbols_Scope newSymbols_Scope] retain]];


        level++;
        /* scopeSetAttributeRef */((Symbols_Scope *)[Symbols_stack peek]).names =  [ANTLRPtrBuffer newANTLRPtrBufferWithLen:10];

    @try {
        // SymbolTable.g:53:5: ( '{' ( decl )* ( stat )* '}' ) // ruleBlockSingleAlt
        // SymbolTable.g:53:9: '{' ( decl )* ( stat )* '}' // alt
        {
        [self match:input TokenType:13 Follow:FOLLOW_13_in_block153]; 

        do {
            NSInteger alt3=2;
            NSInteger LA3_0 = [input LA:1];
            if ( (LA3_0==11) ) {
                alt3=1;
            }


            switch (alt3) {
                case 1 : ;
                    // SymbolTable.g:53:14: decl // alt
                    {
                    /* ruleRef */
                    [self pushFollow:FOLLOW_decl_in_block156];
                    [self decl];

                    [self popFollow];



                    }
                    break;

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


        do {
            NSInteger alt4=2;
            NSInteger LA4_0 = [input LA:1];
            if ( (LA4_0==ID||LA4_0==13) ) {
                alt4=1;
            }


            switch (alt4) {
                case 1 : ;
                    // SymbolTable.g:53:22: stat // alt
                    {
                    /* ruleRef */
                    [self pushFollow:FOLLOW_stat_in_block161];
                    [self stat];

                    [self popFollow];



                    }
                    break;

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


        [self match:input TokenType:14 Follow:FOLLOW_14_in_block165]; 


                    NSLog( @"level %d symbols: %@", level, [((Symbols_Scope *)[Symbols_stack peek]).names toString] );
                    level--;
                


        }

        // token+rule list labels

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

    @finally {
        /* Terence's stuff */
        [Symbols_stack pop];

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

/*
 * $ANTLR start stat
 * SymbolTable.g:60:1: stat : ( ID '=' INT ';' | block );
 */
- (void) stat
{
    /* my ruleScopeSetUp */
    /* Terence's stuff */

    @try {
        // SymbolTable.g:60:5: ( ID '=' INT ';' | block ) //ruleblock
        NSInteger alt5=2;
        NSInteger LA5_0 = [input LA:1];

        if ( (LA5_0==ID) ) {
            alt5=1;
        }
        else if ( (LA5_0==13) ) {
            alt5=2;
        }
        else {
            ANTLRNoViableAltException *nvae = [ANTLRNoViableAltException newException:5 state:0 stream:input];
            nvae.c = LA5_0;
            @throw nvae;

        }
        switch (alt5) {
            case 1 : ;
                // SymbolTable.g:60:9: ID '=' INT ';' // alt
                {
                [self match:input TokenType:ID Follow:FOLLOW_ID_in_stat189]; 

                [self match:input TokenType:10 Follow:FOLLOW_10_in_stat191]; 

                [self match:input TokenType:INT Follow:FOLLOW_INT_in_stat193]; 

                [self match:input TokenType:9 Follow:FOLLOW_9_in_stat195]; 

                }
                break;
            case 2 : ;
                // SymbolTable.g:61:9: block // alt
                {
                /* ruleRef */
                [self pushFollow:FOLLOW_block_in_stat205];
                [self block];

                [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 stat */

/*
 * $ANTLR start decl
 * SymbolTable.g:64:1: decl : 'int' ID ';' ;
 */
- (void) decl
{
    /* my ruleScopeSetUp */
    /* Terence's stuff */

    @try {
        ANTLRCommonToken *ID1 = nil;

        // SymbolTable.g:64:5: ( 'int' ID ';' ) // ruleBlockSingleAlt
        // SymbolTable.g:64:9: 'int' ID ';' // alt
        {
        [self match:input TokenType:11 Follow:FOLLOW_11_in_decl219]; 

        ID1=(ANTLRCommonToken *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_decl221]; 

        [self match:input TokenType:9 Follow:FOLLOW_9_in_decl223]; 

        [((Symbols_Scope *)[Symbols_stack peek]).names addObject:ID1];


        }

        // token+rule list labels

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

    @finally {
        /* Terence's stuff */

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

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