/** \file
 *  This OBJC source file was generated by $ANTLR version 3.4
 *
 *     -  From the grammar source file : /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g
 *     -                            On : 2012-02-16 17:41:10
 *     -           for the tree parser : SimpleCTPTreeParser
 *
 * Editing it, at least manually, is not wise.
 *
 * ObjC language generator and runtime by Alan Condit, acondit|hereisanat|ipns|dotgoeshere|com.
 *
 *
*/
// $ANTLR 3.4 /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g 2012-02-16 17:41:10


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


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

#pragma mark Bitsets
static ANTLRBitSet *FOLLOW_declaration_in_program56;
static const unsigned long long FOLLOW_declaration_in_program56_data[] = { 0x00000000020000C2LL};
static ANTLRBitSet *FOLLOW_variable_in_declaration76;
static const unsigned long long FOLLOW_variable_in_declaration76_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_FUNC_DECL_in_declaration87;
static const unsigned long long FOLLOW_FUNC_DECL_in_declaration87_data[] = { 0x0000000000000004LL};
static ANTLRBitSet *FOLLOW_functionHeader_in_declaration89;
static const unsigned long long FOLLOW_functionHeader_in_declaration89_data[] = { 0x0000000000000008LL};
static ANTLRBitSet *FOLLOW_FUNC_DEF_in_declaration101;
static const unsigned long long FOLLOW_FUNC_DEF_in_declaration101_data[] = { 0x0000000000000004LL};
static ANTLRBitSet *FOLLOW_functionHeader_in_declaration103;
static const unsigned long long FOLLOW_functionHeader_in_declaration103_data[] = { 0x0000000000000020LL};
static ANTLRBitSet *FOLLOW_block_in_declaration105;
static const unsigned long long FOLLOW_block_in_declaration105_data[] = { 0x0000000000000008LL};
static ANTLRBitSet *FOLLOW_VAR_DEF_in_variable126;
static const unsigned long long FOLLOW_VAR_DEF_in_variable126_data[] = { 0x0000000000000004LL};
static ANTLRBitSet *FOLLOW_type_in_variable128;
static const unsigned long long FOLLOW_type_in_variable128_data[] = { 0x0000000000004000LL};
static ANTLRBitSet *FOLLOW_declarator_in_variable130;
static const unsigned long long FOLLOW_declarator_in_variable130_data[] = { 0x0000000000000008LL};
static ANTLRBitSet *FOLLOW_K_ID_in_declarator150;
static const unsigned long long FOLLOW_K_ID_in_declarator150_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_FUNC_HDR_in_functionHeader171;
static const unsigned long long FOLLOW_FUNC_HDR_in_functionHeader171_data[] = { 0x0000000000000004LL};
static ANTLRBitSet *FOLLOW_type_in_functionHeader173;
static const unsigned long long FOLLOW_type_in_functionHeader173_data[] = { 0x0000000000004000LL};
static ANTLRBitSet *FOLLOW_K_ID_in_functionHeader175;
static const unsigned long long FOLLOW_K_ID_in_functionHeader175_data[] = { 0x0000000000000010LL};
static ANTLRBitSet *FOLLOW_formalParameter_in_functionHeader177;
static const unsigned long long FOLLOW_formalParameter_in_functionHeader177_data[] = { 0x0000000000000018LL};
static ANTLRBitSet *FOLLOW_ARG_DEF_in_formalParameter199;
static const unsigned long long FOLLOW_ARG_DEF_in_formalParameter199_data[] = { 0x0000000000000004LL};
static ANTLRBitSet *FOLLOW_type_in_formalParameter201;
static const unsigned long long FOLLOW_type_in_formalParameter201_data[] = { 0x0000000000004000LL};
static ANTLRBitSet *FOLLOW_declarator_in_formalParameter203;
static const unsigned long long FOLLOW_declarator_in_formalParameter203_data[] = { 0x0000000000000008LL};
static ANTLRBitSet *FOLLOW_BLOCK_in_block283;
static const unsigned long long FOLLOW_BLOCK_in_block283_data[] = { 0x0000000000000004LL};
static ANTLRBitSet *FOLLOW_variable_in_block285;
static const unsigned long long FOLLOW_variable_in_block285_data[] = { 0x000000000218F828LL};
static ANTLRBitSet *FOLLOW_stat_in_block288;
static const unsigned long long FOLLOW_stat_in_block288_data[] = { 0x000000000018F828LL};
static ANTLRBitSet *FOLLOW_forStat_in_stat302;
static const unsigned long long FOLLOW_forStat_in_stat302_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_expr_in_stat310;
static const unsigned long long FOLLOW_expr_in_stat310_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_block_in_stat318;
static const unsigned long long FOLLOW_block_in_stat318_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_K_FOR_in_forStat338;
static const unsigned long long FOLLOW_K_FOR_in_forStat338_data[] = { 0x0000000000000004LL};
static ANTLRBitSet *FOLLOW_expr_in_forStat340;
static const unsigned long long FOLLOW_expr_in_forStat340_data[] = { 0x000000000018D800LL};
static ANTLRBitSet *FOLLOW_expr_in_forStat342;
static const unsigned long long FOLLOW_expr_in_forStat342_data[] = { 0x000000000018D800LL};
static ANTLRBitSet *FOLLOW_expr_in_forStat344;
static const unsigned long long FOLLOW_expr_in_forStat344_data[] = { 0x0000000000000020LL};
static ANTLRBitSet *FOLLOW_block_in_forStat346;
static const unsigned long long FOLLOW_block_in_forStat346_data[] = { 0x0000000000000008LL};
static ANTLRBitSet *FOLLOW_K_EQEQ_in_expr362;
static const unsigned long long FOLLOW_K_EQEQ_in_expr362_data[] = { 0x0000000000000004LL};
static ANTLRBitSet *FOLLOW_expr_in_expr364;
static const unsigned long long FOLLOW_expr_in_expr364_data[] = { 0x000000000018D800LL};
static ANTLRBitSet *FOLLOW_expr_in_expr366;
static const unsigned long long FOLLOW_expr_in_expr366_data[] = { 0x0000000000000008LL};
static ANTLRBitSet *FOLLOW_K_LT_in_expr378;
static const unsigned long long FOLLOW_K_LT_in_expr378_data[] = { 0x0000000000000004LL};
static ANTLRBitSet *FOLLOW_expr_in_expr380;
static const unsigned long long FOLLOW_expr_in_expr380_data[] = { 0x000000000018D800LL};
static ANTLRBitSet *FOLLOW_expr_in_expr382;
static const unsigned long long FOLLOW_expr_in_expr382_data[] = { 0x0000000000000008LL};
static ANTLRBitSet *FOLLOW_K_PLUS_in_expr394;
static const unsigned long long FOLLOW_K_PLUS_in_expr394_data[] = { 0x0000000000000004LL};
static ANTLRBitSet *FOLLOW_expr_in_expr396;
static const unsigned long long FOLLOW_expr_in_expr396_data[] = { 0x000000000018D800LL};
static ANTLRBitSet *FOLLOW_expr_in_expr398;
static const unsigned long long FOLLOW_expr_in_expr398_data[] = { 0x0000000000000008LL};
static ANTLRBitSet *FOLLOW_K_EQ_in_expr410;
static const unsigned long long FOLLOW_K_EQ_in_expr410_data[] = { 0x0000000000000004LL};
static ANTLRBitSet *FOLLOW_K_ID_in_expr412;
static const unsigned long long FOLLOW_K_ID_in_expr412_data[] = { 0x000000000018D800LL};
static ANTLRBitSet *FOLLOW_expr_in_expr416;
static const unsigned long long FOLLOW_expr_in_expr416_data[] = { 0x0000000000000008LL};
static ANTLRBitSet *FOLLOW_atom_in_expr429;
static const unsigned long long FOLLOW_atom_in_expr429_data[] = { 0x0000000000000002LL};


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

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

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

/* start of iterate get and set functions */
- (ANTLRCommonTree *)gettree { return( tree ); }
- (void)settree:(ANTLRCommonTree *)aVal { tree = aVal; }

/* End of iterate get and set functions */
@end /* end of Symbols_Scope implementation */



#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation

#pragma mark Rule Return Scopes returnScopeImplementation
@implementation SimpleCTP_expr_return /* returnScopeImplementation */
 /* start of synthesize -- OBJC-Line 1837 */
+ (SimpleCTP_expr_return *)newSimpleCTP_expr_return
{
return [[[SimpleCTP_expr_return alloc] init] retain];
}

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



@end /* end of returnScope implementation */



@implementation SimpleCTP  // line 637

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

+ (void) initialize
{
    #pragma mark Bitsets
    FOLLOW_declaration_in_program56 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declaration_in_program56_data Count:(NSUInteger)1] retain];
    FOLLOW_variable_in_declaration76 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_declaration76_data Count:(NSUInteger)1] retain];
    FOLLOW_FUNC_DECL_in_declaration87 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_FUNC_DECL_in_declaration87_data Count:(NSUInteger)1] retain];
    FOLLOW_functionHeader_in_declaration89 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration89_data Count:(NSUInteger)1] retain];
    FOLLOW_FUNC_DEF_in_declaration101 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_FUNC_DEF_in_declaration101_data Count:(NSUInteger)1] retain];
    FOLLOW_functionHeader_in_declaration103 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration103_data Count:(NSUInteger)1] retain];
    FOLLOW_block_in_declaration105 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_declaration105_data Count:(NSUInteger)1] retain];
    FOLLOW_VAR_DEF_in_variable126 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_VAR_DEF_in_variable126_data Count:(NSUInteger)1] retain];
    FOLLOW_type_in_variable128 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_variable128_data Count:(NSUInteger)1] retain];
    FOLLOW_declarator_in_variable130 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_variable130_data Count:(NSUInteger)1] retain];
    FOLLOW_K_ID_in_declarator150 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_declarator150_data Count:(NSUInteger)1] retain];
    FOLLOW_FUNC_HDR_in_functionHeader171 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_FUNC_HDR_in_functionHeader171_data Count:(NSUInteger)1] retain];
    FOLLOW_type_in_functionHeader173 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_functionHeader173_data Count:(NSUInteger)1] retain];
    FOLLOW_K_ID_in_functionHeader175 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_functionHeader175_data Count:(NSUInteger)1] retain];
    FOLLOW_formalParameter_in_functionHeader177 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader177_data Count:(NSUInteger)1] retain];
    FOLLOW_ARG_DEF_in_formalParameter199 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ARG_DEF_in_formalParameter199_data Count:(NSUInteger)1] retain];
    FOLLOW_type_in_formalParameter201 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_formalParameter201_data Count:(NSUInteger)1] retain];
    FOLLOW_declarator_in_formalParameter203 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_formalParameter203_data Count:(NSUInteger)1] retain];
    FOLLOW_BLOCK_in_block283 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_BLOCK_in_block283_data Count:(NSUInteger)1] retain];
    FOLLOW_variable_in_block285 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_block285_data Count:(NSUInteger)1] retain];
    FOLLOW_stat_in_block288 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_stat_in_block288_data Count:(NSUInteger)1] retain];
    FOLLOW_forStat_in_stat302 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_forStat_in_stat302_data Count:(NSUInteger)1] retain];
    FOLLOW_expr_in_stat310 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_stat310_data Count:(NSUInteger)1] retain];
    FOLLOW_block_in_stat318 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_stat318_data Count:(NSUInteger)1] retain];
    FOLLOW_K_FOR_in_forStat338 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_FOR_in_forStat338_data Count:(NSUInteger)1] retain];
    FOLLOW_expr_in_forStat340 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat340_data Count:(NSUInteger)1] retain];
    FOLLOW_expr_in_forStat342 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat342_data Count:(NSUInteger)1] retain];
    FOLLOW_expr_in_forStat344 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat344_data Count:(NSUInteger)1] retain];
    FOLLOW_block_in_forStat346 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_forStat346_data Count:(NSUInteger)1] retain];
    FOLLOW_K_EQEQ_in_expr362 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_EQEQ_in_expr362_data Count:(NSUInteger)1] retain];
    FOLLOW_expr_in_expr364 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr364_data Count:(NSUInteger)1] retain];
    FOLLOW_expr_in_expr366 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr366_data Count:(NSUInteger)1] retain];
    FOLLOW_K_LT_in_expr378 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_LT_in_expr378_data Count:(NSUInteger)1] retain];
    FOLLOW_expr_in_expr380 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr380_data Count:(NSUInteger)1] retain];
    FOLLOW_expr_in_expr382 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr382_data Count:(NSUInteger)1] retain];
    FOLLOW_K_PLUS_in_expr394 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_PLUS_in_expr394_data Count:(NSUInteger)1] retain];
    FOLLOW_expr_in_expr396 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr396_data Count:(NSUInteger)1] retain];
    FOLLOW_expr_in_expr398 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr398_data Count:(NSUInteger)1] retain];
    FOLLOW_K_EQ_in_expr410 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_EQ_in_expr410_data Count:(NSUInteger)1] retain];
    FOLLOW_K_ID_in_expr412 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_K_ID_in_expr412_data Count:(NSUInteger)1] retain];
    FOLLOW_expr_in_expr416 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_expr416_data Count:(NSUInteger)1] retain];
    FOLLOW_atom_in_expr429 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_expr429_data Count:(NSUInteger)1] retain];

    [BaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
 @"ARG_DEF", @"BLOCK", @"FUNC_DECL", @"FUNC_DEF", @"FUNC_HDR", @"K_CHAR", 
 @"K_COMMA", @"K_EQ", @"K_EQEQ", @"K_FOR", @"K_ID", @"K_INT", @"K_INT_TYPE", 
 @"K_LCURLY", @"K_LCURVE", @"K_LT", @"K_PLUS", @"K_RCURLY", @"K_RCURVE", 
 @"K_SEMICOLON", @"K_VOID", @"VAR_DEF", @"WS", nil] retain]];
    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g"];
}

+ (SimpleCTP *)newSimpleCTP:(id<TreeNodeStream>)aStream
{
    return [[SimpleCTP alloc] initWithStream:aStream];
}

- (id) initWithStream:(id<TreeNodeStream>)aStream
{
    self = [super initWithStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:12+1] retain]];
    if ( self != nil ) {
        /* globalAttributeScopeInit */

        Symbols_scope = [Symbols_Scope newSymbols_Scope];

        Symbols_stack = [SymbolStack newSymbolStackWithLen:30];

        /* start of actions-actionScope-init */
        /* start of init */
    }
    return self;
}

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

/* ObjC start actions.(actionScope).methods */
/* ObjC end actions.(actionScope).methods */
/* ObjC start methods() */
/* ObjC end methods() */
/* ObjC start rules */
/*
 * $ANTLR start program
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:13:1: program : ( declaration )+ ;
 */
- (void) program
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:14:5: ( ( declaration )+ ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:14:9: ( declaration )+ // alt
        {

        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:14:9: ( declaration )+ // positiveClosureBlock
        NSInteger cnt1 = 0;
        do {
            NSInteger alt1 = 2;
            NSInteger LA1_0 = [input LA:1];
            if ( ((LA1_0 >= FUNC_DECL && LA1_0 <= FUNC_DEF)||LA1_0==VAR_DEF) ) {
                alt1=1;
            }


            switch (alt1) {
                case 1 : ;
                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:14:9: declaration // alt
                    {

                    /* ruleRef */
                    [self pushFollow:FOLLOW_declaration_in_program56];
                    [self declaration];

                    [self popFollow];


                     
                    }
                    break;

                default :
                    if ( cnt1 >= 1 )
                        goto loop1;
                    EarlyExitException *eee =
                        [EarlyExitException newException:input decisionNumber:1];
                    @throw eee;
            }
            cnt1++;
        } while (YES);
        loop1: ;

         
        }

        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

/*
 * $ANTLR start declaration
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:17:1: declaration : ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) );
 */
- (void) declaration
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:18:5: ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) ) //ruleblock
        NSInteger alt2=3;
        unichar charLA2 = [input LA:1];
        switch (charLA2) {
            case VAR_DEF: ;
                {
                alt2=1;
                }
                break;
            case FUNC_DECL: ;
                {
                alt2=2;
                }
                break;
            case FUNC_DEF: ;
                {
                alt2=3;
                }
                break;

        default: ;
            NoViableAltException *nvae = [NoViableAltException newException:2 state:0 stream:input];
            nvae.c = charLA2;
            @throw nvae;

        }

        switch (alt2) {
            case 1 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:18:9: variable // alt
                {

                /* ruleRef */
                [self pushFollow:FOLLOW_variable_in_declaration76];
                [self variable];

                [self popFollow];


                 
                }
                break;
            case 2 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:19:9: ^( FUNC_DECL functionHeader ) // alt
                {


                [self match:input TokenType:FUNC_DECL Follow:FOLLOW_FUNC_DECL_in_declaration87]; 
                 
                    [self match:input TokenType:DOWN Follow:nil]; 

                    /* ruleRef */
                    [self pushFollow:FOLLOW_functionHeader_in_declaration89];
                    [self functionHeader];

                    [self popFollow];


                     
                    [self match:input TokenType:UP Follow:nil]; 

                 
                }
                break;
            case 3 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:20:9: ^( FUNC_DEF functionHeader block ) // alt
                {


                [self match:input TokenType:FUNC_DEF Follow:FOLLOW_FUNC_DEF_in_declaration101]; 
                 
                    [self match:input TokenType:DOWN Follow:nil]; 

                    /* ruleRef */
                    [self pushFollow:FOLLOW_functionHeader_in_declaration103];
                    [self functionHeader];

                    [self popFollow];


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

                    [self popFollow];


                     
                    [self match:input TokenType:UP Follow:nil]; 

                 
                }
                break;

        }
        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

/*
 * $ANTLR start variable
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:23:1: variable : ^( VAR_DEF type declarator ) ;
 */
- (void) variable
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:24:5: ( ^( VAR_DEF type declarator ) ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:24:9: ^( VAR_DEF type declarator ) // alt
        {


        [self match:input TokenType:VAR_DEF Follow:FOLLOW_VAR_DEF_in_variable126]; 
         
            [self match:input TokenType:DOWN Follow:nil]; 

            /* ruleRef */
            [self pushFollow:FOLLOW_type_in_variable128];
            [self type];

            [self popFollow];


             
            /* ruleRef */
            [self pushFollow:FOLLOW_declarator_in_variable130];
            [self declarator];

            [self popFollow];


             
            [self match:input TokenType:UP Follow:nil]; 

         
        }

        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

/*
 * $ANTLR start declarator
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:27:1: declarator : K_ID ;
 */
- (void) declarator
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:28:5: ( K_ID ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:28:9: K_ID // alt
        {

        [self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_declarator150]; 
         
        }

        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

/*
 * $ANTLR start functionHeader
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:31:1: functionHeader : ^( FUNC_HDR type K_ID ( formalParameter )+ ) ;
 */
- (void) functionHeader
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:32:5: ( ^( FUNC_HDR type K_ID ( formalParameter )+ ) ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:32:9: ^( FUNC_HDR type K_ID ( formalParameter )+ ) // alt
        {


        [self match:input TokenType:FUNC_HDR Follow:FOLLOW_FUNC_HDR_in_functionHeader171]; 
         
            [self match:input TokenType:DOWN Follow:nil]; 

            /* ruleRef */
            [self pushFollow:FOLLOW_type_in_functionHeader173];
            [self type];

            [self popFollow];


             
            [self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_functionHeader175]; 
             
            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:32:30: ( formalParameter )+ // positiveClosureBlock
            NSInteger cnt3 = 0;
            do {
                NSInteger alt3 = 2;
                NSInteger LA3_0 = [input LA:1];
                if ( (LA3_0==ARG_DEF) ) {
                    alt3=1;
                }


                switch (alt3) {
                    case 1 : ;
                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:32:30: formalParameter // alt
                        {

                        /* ruleRef */
                        [self pushFollow:FOLLOW_formalParameter_in_functionHeader177];
                        [self formalParameter];

                        [self popFollow];


                         
                        }
                        break;

                    default :
                        if ( cnt3 >= 1 )
                            goto loop3;
                        EarlyExitException *eee =
                            [EarlyExitException newException:input decisionNumber:3];
                        @throw eee;
                }
                cnt3++;
            } while (YES);
            loop3: ;

             
            [self match:input TokenType:UP Follow:nil]; 

         
        }

        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

/*
 * $ANTLR start formalParameter
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:35:1: formalParameter : ^( ARG_DEF type declarator ) ;
 */
- (void) formalParameter
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:36:5: ( ^( ARG_DEF type declarator ) ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:36:9: ^( ARG_DEF type declarator ) // alt
        {


        [self match:input TokenType:ARG_DEF Follow:FOLLOW_ARG_DEF_in_formalParameter199]; 
         
            [self match:input TokenType:DOWN Follow:nil]; 

            /* ruleRef */
            [self pushFollow:FOLLOW_type_in_formalParameter201];
            [self type];

            [self popFollow];


             
            /* ruleRef */
            [self pushFollow:FOLLOW_declarator_in_formalParameter203];
            [self declarator];

            [self popFollow];


             
            [self match:input TokenType:UP Follow:nil]; 

         
        }

        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

/*
 * $ANTLR start type
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:39:1: type : ( K_INT_TYPE | K_CHAR | K_VOID | K_ID );
 */
- (void) type
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:40:5: ( K_INT_TYPE | K_CHAR | K_VOID | K_ID ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g: // alt
        {

        if ([input LA:1] == K_CHAR||[input LA:1] == K_ID||[input LA:1] == K_INT_TYPE||[input LA:1] == K_VOID) {
            [input consume];
            [state setIsErrorRecovery:NO];
        } else {
            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
            @throw mse;
        }

         
        }

        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

/*
 * $ANTLR start block
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:46:1: block : ^( BLOCK ( variable )* ( stat )* ) ;
 */
- (void) block
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:47:5: ( ^( BLOCK ( variable )* ( stat )* ) ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:47:9: ^( BLOCK ( variable )* ( stat )* ) // alt
        {


        [self match:input TokenType:BLOCK Follow:FOLLOW_BLOCK_in_block283]; 
         
        if ( [input LA:1] == DOWN ) {
            [self match:input TokenType:DOWN Follow:nil]; 


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


                switch (alt4) {
                    case 1 : ;
                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:47:17: variable // alt
                        {

                        /* ruleRef */
                        [self pushFollow:FOLLOW_variable_in_block285];
                        [self variable];

                        [self popFollow];


                         
                        }
                        break;

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

             

            do {
                NSInteger alt5=2;
                NSInteger LA5_0 = [input LA:1];
                if ( (LA5_0==BLOCK||(LA5_0 >= K_EQ && LA5_0 <= K_INT)||(LA5_0 >= K_LT && LA5_0 <= K_PLUS)) ) {
                    alt5=1;
                }


                switch (alt5) {
                    case 1 : ;
                        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:47:27: stat // alt
                        {

                        /* ruleRef */
                        [self pushFollow:FOLLOW_stat_in_block288];
                        [self stat];

                        [self popFollow];


                         
                        }
                        break;

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

             
            [self match:input TokenType:UP Follow:nil]; 
        }

         
        }

        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

/*
 * $ANTLR start stat
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:50:1: stat : ( forStat | expr | block );
 */
- (void) stat
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:50:5: ( forStat | expr | block ) //ruleblock
        NSInteger alt6=3;
        unichar charLA6 = [input LA:1];
        switch (charLA6) {
            case K_FOR: ;
                {
                alt6=1;
                }
                break;
            case K_EQ: ;
            case K_EQEQ: ;
            case K_ID: ;
            case K_INT: ;
            case K_LT: ;
            case K_PLUS: ;
                {
                alt6=2;
                }
                break;
            case BLOCK: ;
                {
                alt6=3;
                }
                break;

        default: ;
            NoViableAltException *nvae = [NoViableAltException newException:6 state:0 stream:input];
            nvae.c = charLA6;
            @throw nvae;

        }

        switch (alt6) {
            case 1 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:50:7: forStat // alt
                {

                /* ruleRef */
                [self pushFollow:FOLLOW_forStat_in_stat302];
                [self forStat];

                [self popFollow];


                 
                }
                break;
            case 2 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:51:7: expr // alt
                {

                /* ruleRef */
                [self pushFollow:FOLLOW_expr_in_stat310];
                [self expr];

                [self popFollow];


                 
                }
                break;
            case 3 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:52:7: block // alt
                {

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

                [self popFollow];


                 
                }
                break;

        }
        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

/*
 * $ANTLR start forStat
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:55:1: forStat : ^( K_FOR expr expr expr block ) ;
 */
- (void) forStat
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:56:5: ( ^( K_FOR expr expr expr block ) ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:56:9: ^( K_FOR expr expr expr block ) // alt
        {


        [self match:input TokenType:K_FOR Follow:FOLLOW_K_FOR_in_forStat338]; 
         
            [self match:input TokenType:DOWN Follow:nil]; 

            /* ruleRef */
            [self pushFollow:FOLLOW_expr_in_forStat340];
            [self expr];

            [self popFollow];


             
            /* ruleRef */
            [self pushFollow:FOLLOW_expr_in_forStat342];
            [self expr];

            [self popFollow];


             
            /* ruleRef */
            [self pushFollow:FOLLOW_expr_in_forStat344];
            [self expr];

            [self popFollow];


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

            [self popFollow];


             
            [self match:input TokenType:UP Follow:nil]; 

         
        }

        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

/*
 * $ANTLR start expr
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:59:1: expr : ( ^( K_EQEQ expr expr ) | ^( K_LT expr expr ) | ^( K_PLUS expr expr ) | ^( K_EQ K_ID e= expr ) | atom );
 */
- (SimpleCTP_expr_return *) expr
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */
    SimpleCTP_expr_return * retval = [SimpleCTP_expr_return newSimpleCTP_expr_return];
    [retval setStart:[input LT:1]];


    @try {
        /* ruleLabelDefs entry */
        ANTLRCommonTree *K_ID1 = nil;SimpleCTP_expr_return * e = nil ;


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:59:5: ( ^( K_EQEQ expr expr ) | ^( K_LT expr expr ) | ^( K_PLUS expr expr ) | ^( K_EQ K_ID e= expr ) | atom ) //ruleblock
        NSInteger alt7=5;
        unichar charLA7 = [input LA:1];
        switch (charLA7) {
            case K_EQEQ: ;
                {
                alt7=1;
                }
                break;
            case K_LT: ;
                {
                alt7=2;
                }
                break;
            case K_PLUS: ;
                {
                alt7=3;
                }
                break;
            case K_EQ: ;
                {
                alt7=4;
                }
                break;
            case K_ID: ;
            case K_INT: ;
                {
                alt7=5;
                }
                break;

        default: ;
            NoViableAltException *nvae = [NoViableAltException newException:7 state:0 stream:input];
            nvae.c = charLA7;
            @throw nvae;

        }

        switch (alt7) {
            case 1 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:59:9: ^( K_EQEQ expr expr ) // alt
                {


                [self match:input TokenType:K_EQEQ Follow:FOLLOW_K_EQEQ_in_expr362]; 
                 
                    [self match:input TokenType:DOWN Follow:nil]; 

                    /* ruleRef */
                    [self pushFollow:FOLLOW_expr_in_expr364];
                    [self expr];

                    [self popFollow];


                     
                    /* ruleRef */
                    [self pushFollow:FOLLOW_expr_in_expr366];
                    [self expr];

                    [self popFollow];


                     
                    [self match:input TokenType:UP Follow:nil]; 

                 
                }
                break;
            case 2 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:60:9: ^( K_LT expr expr ) // alt
                {


                [self match:input TokenType:K_LT Follow:FOLLOW_K_LT_in_expr378]; 
                 
                    [self match:input TokenType:DOWN Follow:nil]; 

                    /* ruleRef */
                    [self pushFollow:FOLLOW_expr_in_expr380];
                    [self expr];

                    [self popFollow];


                     
                    /* ruleRef */
                    [self pushFollow:FOLLOW_expr_in_expr382];
                    [self expr];

                    [self popFollow];


                     
                    [self match:input TokenType:UP Follow:nil]; 

                 
                }
                break;
            case 3 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:61:9: ^( K_PLUS expr expr ) // alt
                {


                [self match:input TokenType:K_PLUS Follow:FOLLOW_K_PLUS_in_expr394]; 
                 
                    [self match:input TokenType:DOWN Follow:nil]; 

                    /* ruleRef */
                    [self pushFollow:FOLLOW_expr_in_expr396];
                    [self expr];

                    [self popFollow];


                     
                    /* ruleRef */
                    [self pushFollow:FOLLOW_expr_in_expr398];
                    [self expr];

                    [self popFollow];


                     
                    [self match:input TokenType:UP Follow:nil]; 

                 
                }
                break;
            case 4 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:62:9: ^( K_EQ K_ID e= expr ) // alt
                {


                [self match:input TokenType:K_EQ Follow:FOLLOW_K_EQ_in_expr410]; 
                 
                    [self match:input TokenType:DOWN Follow:nil]; 

                    K_ID1=(ANTLRCommonTree *)[self match:input TokenType:K_ID Follow:FOLLOW_K_ID_in_expr412]; 
                     
                    /* ruleRef */
                    [self pushFollow:FOLLOW_expr_in_expr416];
                    e = [self expr];

                    [self popFollow];


                     
                    [self match:input TokenType:UP Follow:nil]; 

                 

                 NSLog(@"assigning %@ to variable %@", (e!=nil?[[input getTokenStream] toStringFromStart:[[input getTreeAdaptor] getTokenStartIndex:[e getStart]]ToEnd:[[input getTreeAdaptor] getTokenStopIndex:[e getStart]]]:0), (K_ID1!=nil?K_ID1.text:nil)); 

                 
                }
                break;
            case 5 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:63:9: atom // alt
                {

                /* ruleRef */
                [self pushFollow:FOLLOW_atom_in_expr429];
                [self atom];

                [self popFollow];


                 
                }
                break;

        }
        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

    }
    return retval;
}
/* $ANTLR end expr */

/*
 * $ANTLR start atom
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:66:1: atom : ( K_ID | K_INT );
 */
- (void) atom
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g:67:5: ( K_ID | K_INT ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/simplecTreeParser/SimpleCTP.g: // alt
        {

        if ((([input LA:1] >= K_ID) && ([input LA:1] <= K_INT))) {
            [input consume];
            [state setIsErrorRecovery:NO];
        } else {
            MismatchedSetException *mse = [MismatchedSetException newException:nil stream:input];
            @throw mse;
        }

         
        }

        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

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