/** \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/LL-star/SimpleC.g
 *     -                            On : 2012-02-16 17:39:18
 *     -                for the parser : SimpleCParserParser
 *
 * 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/LL-star/SimpleC.g 2012-02-16 17:39:18


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


/* ============================================================================= */
/* =============================================================================
 * Start of recognizer
 */
#pragma mark Cyclic DFA implementation start DFA2

@implementation DFA2
const static NSInteger dfa2_eot[13] =
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
const static NSInteger dfa2_eof[13] =
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
const static unichar dfa2_min[13] =
    {4,4,7,4,-1,4,11,8,-1,-1,4,4,8};
const static unichar dfa2_max[13] =
    {18,4,11,18,-1,4,19,10,-1,-1,18,4,10};
const static NSInteger dfa2_accept[13] =
    {-1,-1,-1,-1,1,-1,-1,-1,2,3,-1,-1,-1};
const static NSInteger dfa2_special[13] =
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};

/** Used when there is no transition table entry for a particular state */
#define dfa2_T_empty	    nil

const static NSInteger dfa2_T0[] =
{
     3, -1, -1, -1, 4
};
const static NSInteger dfa2_T1[] =
{
     6, -1, 10
};
const static NSInteger dfa2_T2[] =
{
     8, -1, -1, -1, -1, -1, -1, -1, 9
};
const static NSInteger dfa2_T3[] =
{
     2
};
const static NSInteger dfa2_T4[] =
{
     1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, 1, 1
};
const static NSInteger dfa2_T5[] =
{
     7
};
const static NSInteger dfa2_T6[] =
{
     11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11, -1, 11, 11
};
const static NSInteger dfa2_T7[] =
{
     12
};
const static NSInteger dfa2_T8[] =
{
     5, -1, -1, -1, 6, -1, -1, -1, -1, -1, -1, 5, -1, 5, 5
};


const static NSInteger *dfa2_transition[] =
{
    dfa2_T4, dfa2_T3, dfa2_T0, dfa2_T8, nil, dfa2_T5, dfa2_T2, dfa2_T1, 
    nil, nil, dfa2_T6, dfa2_T7, dfa2_T1
};

//const static NSInteger dfa2_transition[] = {};

+ (DFA2 *) newDFA2WithRecognizer:(BaseRecognizer *)aRecognizer
{
    return [[[DFA2 alloc] initWithRecognizer:aRecognizer] retain];
}

- (id) initWithRecognizer:(BaseRecognizer *) theRecognizer
{
    self = [super initWithRecognizer:theRecognizer];
    if ( self != nil ) {
        decisionNumber = 2;
        eot = dfa2_eot;
        eof = dfa2_eof;
        min = dfa2_min;
        max = dfa2_max;
        accept = dfa2_accept;
        special = dfa2_special;
        transition = dfa2_transition;
/*
        if (!(transition = calloc(13, sizeof(void*)))) {
            [self release];
            return nil;
        }
        len = 13;
        transition[0] = dfa2_transition4;
        transition[1] = dfa2_transition3;
        transition[2] = dfa2_transition0;
        transition[3] = dfa2_transition8;

        transition[4] = dfa2_transition5;
        transition[5] = dfa2_transition2;
        transition[6] = dfa2_transition1;


        transition[7] = dfa2_transition6;
        transition[8] = dfa2_transition7;
        transition[9] = dfa2_transition1;
 */
    }
    return self;
}

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

- (NSString *) description
{
    return @"20:1: declaration : ( variable | functionHeader ';' | functionHeader block );";
}


@end /* end DFA2 implementation */

#pragma mark Cyclic DFA implementation end DFA2



#pragma mark Bitsets
static ANTLRBitSet *FOLLOW_declaration_in_program28;
static const unsigned long long FOLLOW_declaration_in_program28_data[] = { 0x0000000000068012LL};
static ANTLRBitSet *FOLLOW_variable_in_declaration50;
static const unsigned long long FOLLOW_variable_in_declaration50_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_functionHeader_in_declaration60;
static const unsigned long long FOLLOW_functionHeader_in_declaration60_data[] = { 0x0000000000000800LL};
static ANTLRBitSet *FOLLOW_11_in_declaration62;
static const unsigned long long FOLLOW_11_in_declaration62_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_functionHeader_in_declaration75;
static const unsigned long long FOLLOW_functionHeader_in_declaration75_data[] = { 0x0000000000080000LL};
static ANTLRBitSet *FOLLOW_block_in_declaration77;
static const unsigned long long FOLLOW_block_in_declaration77_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_type_in_variable99;
static const unsigned long long FOLLOW_type_in_variable99_data[] = { 0x0000000000000010LL};
static ANTLRBitSet *FOLLOW_declarator_in_variable101;
static const unsigned long long FOLLOW_declarator_in_variable101_data[] = { 0x0000000000000800LL};
static ANTLRBitSet *FOLLOW_11_in_variable103;
static const unsigned long long FOLLOW_11_in_variable103_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_ID_in_declarator122;
static const unsigned long long FOLLOW_ID_in_declarator122_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_type_in_functionHeader151;
static const unsigned long long FOLLOW_type_in_functionHeader151_data[] = { 0x0000000000000010LL};
static ANTLRBitSet *FOLLOW_ID_in_functionHeader153;
static const unsigned long long FOLLOW_ID_in_functionHeader153_data[] = { 0x0000000000000080LL};
static ANTLRBitSet *FOLLOW_7_in_functionHeader155;
static const unsigned long long FOLLOW_7_in_functionHeader155_data[] = { 0x0000000000068110LL};
static ANTLRBitSet *FOLLOW_formalParameter_in_functionHeader159;
static const unsigned long long FOLLOW_formalParameter_in_functionHeader159_data[] = { 0x0000000000000500LL};
static ANTLRBitSet *FOLLOW_10_in_functionHeader163;
static const unsigned long long FOLLOW_10_in_functionHeader163_data[] = { 0x0000000000068010LL};
static ANTLRBitSet *FOLLOW_formalParameter_in_functionHeader165;
static const unsigned long long FOLLOW_formalParameter_in_functionHeader165_data[] = { 0x0000000000000500LL};
static ANTLRBitSet *FOLLOW_8_in_functionHeader173;
static const unsigned long long FOLLOW_8_in_functionHeader173_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_type_in_formalParameter195;
static const unsigned long long FOLLOW_type_in_formalParameter195_data[] = { 0x0000000000000010LL};
static ANTLRBitSet *FOLLOW_declarator_in_formalParameter197;
static const unsigned long long FOLLOW_declarator_in_formalParameter197_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_19_in_block286;
static const unsigned long long FOLLOW_19_in_block286_data[] = { 0x00000000001F88B0LL};
static ANTLRBitSet *FOLLOW_variable_in_block300;
static const unsigned long long FOLLOW_variable_in_block300_data[] = { 0x00000000001F88B0LL};
static ANTLRBitSet *FOLLOW_stat_in_block315;
static const unsigned long long FOLLOW_stat_in_block315_data[] = { 0x00000000001908B0LL};
static ANTLRBitSet *FOLLOW_20_in_block326;
static const unsigned long long FOLLOW_20_in_block326_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_forStat_in_stat338;
static const unsigned long long FOLLOW_forStat_in_stat338_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_expr_in_stat346;
static const unsigned long long FOLLOW_expr_in_stat346_data[] = { 0x0000000000000800LL};
static ANTLRBitSet *FOLLOW_11_in_stat348;
static const unsigned long long FOLLOW_11_in_stat348_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_block_in_stat362;
static const unsigned long long FOLLOW_block_in_stat362_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_assignStat_in_stat370;
static const unsigned long long FOLLOW_assignStat_in_stat370_data[] = { 0x0000000000000800LL};
static ANTLRBitSet *FOLLOW_11_in_stat372;
static const unsigned long long FOLLOW_11_in_stat372_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_11_in_stat380;
static const unsigned long long FOLLOW_11_in_stat380_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_16_in_forStat399;
static const unsigned long long FOLLOW_16_in_forStat399_data[] = { 0x0000000000000080LL};
static ANTLRBitSet *FOLLOW_7_in_forStat401;
static const unsigned long long FOLLOW_7_in_forStat401_data[] = { 0x0000000000000010LL};
static ANTLRBitSet *FOLLOW_assignStat_in_forStat403;
static const unsigned long long FOLLOW_assignStat_in_forStat403_data[] = { 0x0000000000000800LL};
static ANTLRBitSet *FOLLOW_11_in_forStat405;
static const unsigned long long FOLLOW_11_in_forStat405_data[] = { 0x00000000000000B0LL};
static ANTLRBitSet *FOLLOW_expr_in_forStat407;
static const unsigned long long FOLLOW_expr_in_forStat407_data[] = { 0x0000000000000800LL};
static ANTLRBitSet *FOLLOW_11_in_forStat409;
static const unsigned long long FOLLOW_11_in_forStat409_data[] = { 0x0000000000000010LL};
static ANTLRBitSet *FOLLOW_assignStat_in_forStat411;
static const unsigned long long FOLLOW_assignStat_in_forStat411_data[] = { 0x0000000000000100LL};
static ANTLRBitSet *FOLLOW_8_in_forStat413;
static const unsigned long long FOLLOW_8_in_forStat413_data[] = { 0x0000000000080000LL};
static ANTLRBitSet *FOLLOW_block_in_forStat415;
static const unsigned long long FOLLOW_block_in_forStat415_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_ID_in_assignStat442;
static const unsigned long long FOLLOW_ID_in_assignStat442_data[] = { 0x0000000000002000LL};
static ANTLRBitSet *FOLLOW_13_in_assignStat444;
static const unsigned long long FOLLOW_13_in_assignStat444_data[] = { 0x00000000000000B0LL};
static ANTLRBitSet *FOLLOW_expr_in_assignStat446;
static const unsigned long long FOLLOW_expr_in_assignStat446_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_condExpr_in_expr468;
static const unsigned long long FOLLOW_condExpr_in_expr468_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_aexpr_in_condExpr487;
static const unsigned long long FOLLOW_aexpr_in_condExpr487_data[] = { 0x0000000000005002LL};
static ANTLRBitSet *FOLLOW_set_in_condExpr491;
static const unsigned long long FOLLOW_set_in_condExpr491_data[] = { 0x00000000000000B0LL};
static ANTLRBitSet *FOLLOW_aexpr_in_condExpr499;
static const unsigned long long FOLLOW_aexpr_in_condExpr499_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_atom_in_aexpr521;
static const unsigned long long FOLLOW_atom_in_aexpr521_data[] = { 0x0000000000000202LL};
static ANTLRBitSet *FOLLOW_9_in_aexpr525;
static const unsigned long long FOLLOW_9_in_aexpr525_data[] = { 0x00000000000000B0LL};
static ANTLRBitSet *FOLLOW_atom_in_aexpr527;
static const unsigned long long FOLLOW_atom_in_aexpr527_data[] = { 0x0000000000000202LL};
static ANTLRBitSet *FOLLOW_ID_in_atom547;
static const unsigned long long FOLLOW_ID_in_atom547_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_INT_in_atom561;
static const unsigned long long FOLLOW_INT_in_atom561_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_7_in_atom575;
static const unsigned long long FOLLOW_7_in_atom575_data[] = { 0x00000000000000B0LL};
static ANTLRBitSet *FOLLOW_expr_in_atom577;
static const unsigned long long FOLLOW_expr_in_atom577_data[] = { 0x0000000000000100LL};
static ANTLRBitSet *FOLLOW_8_in_atom579;
static const unsigned long long FOLLOW_8_in_atom579_data[] = { 0x0000000000000002LL};


#pragma mark Dynamic Global globalAttributeScopeImplementation

#pragma mark Dynamic Rule Scopes ruleAttributeScopeImplementation

#pragma mark Rule Return Scopes returnScopeImplementation

@implementation SimpleCParser  // 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 */
/* ObjC end globalAttributeScope */
/* ObjC start actions.(actionScope).synthesize */
/* ObjC start synthesize() */

+ (void) initialize
{
    #pragma mark Bitsets
    FOLLOW_declaration_in_program28 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declaration_in_program28_data Count:(NSUInteger)1] retain];
    FOLLOW_variable_in_declaration50 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_declaration50_data Count:(NSUInteger)1] retain];
    FOLLOW_functionHeader_in_declaration60 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration60_data Count:(NSUInteger)1] retain];
    FOLLOW_11_in_declaration62 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_declaration62_data Count:(NSUInteger)1] retain];
    FOLLOW_functionHeader_in_declaration75 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_functionHeader_in_declaration75_data Count:(NSUInteger)1] retain];
    FOLLOW_block_in_declaration77 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_declaration77_data Count:(NSUInteger)1] retain];
    FOLLOW_type_in_variable99 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_variable99_data Count:(NSUInteger)1] retain];
    FOLLOW_declarator_in_variable101 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_variable101_data Count:(NSUInteger)1] retain];
    FOLLOW_11_in_variable103 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_variable103_data Count:(NSUInteger)1] retain];
    FOLLOW_ID_in_declarator122 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_declarator122_data Count:(NSUInteger)1] retain];
    FOLLOW_type_in_functionHeader151 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_functionHeader151_data Count:(NSUInteger)1] retain];
    FOLLOW_ID_in_functionHeader153 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_functionHeader153_data Count:(NSUInteger)1] retain];
    FOLLOW_7_in_functionHeader155 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_functionHeader155_data Count:(NSUInteger)1] retain];
    FOLLOW_formalParameter_in_functionHeader159 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader159_data Count:(NSUInteger)1] retain];
    FOLLOW_10_in_functionHeader163 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_10_in_functionHeader163_data Count:(NSUInteger)1] retain];
    FOLLOW_formalParameter_in_functionHeader165 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_formalParameter_in_functionHeader165_data Count:(NSUInteger)1] retain];
    FOLLOW_8_in_functionHeader173 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_functionHeader173_data Count:(NSUInteger)1] retain];
    FOLLOW_type_in_formalParameter195 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_type_in_formalParameter195_data Count:(NSUInteger)1] retain];
    FOLLOW_declarator_in_formalParameter197 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_declarator_in_formalParameter197_data Count:(NSUInteger)1] retain];
    FOLLOW_19_in_block286 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_19_in_block286_data Count:(NSUInteger)1] retain];
    FOLLOW_variable_in_block300 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_variable_in_block300_data Count:(NSUInteger)1] retain];
    FOLLOW_stat_in_block315 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_stat_in_block315_data Count:(NSUInteger)1] retain];
    FOLLOW_20_in_block326 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_20_in_block326_data Count:(NSUInteger)1] retain];
    FOLLOW_forStat_in_stat338 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_forStat_in_stat338_data Count:(NSUInteger)1] retain];
    FOLLOW_expr_in_stat346 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_stat346_data Count:(NSUInteger)1] retain];
    FOLLOW_11_in_stat348 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_stat348_data Count:(NSUInteger)1] retain];
    FOLLOW_block_in_stat362 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_stat362_data Count:(NSUInteger)1] retain];
    FOLLOW_assignStat_in_stat370 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_stat370_data Count:(NSUInteger)1] retain];
    FOLLOW_11_in_stat372 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_stat372_data Count:(NSUInteger)1] retain];
    FOLLOW_11_in_stat380 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_stat380_data Count:(NSUInteger)1] retain];
    FOLLOW_16_in_forStat399 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_16_in_forStat399_data Count:(NSUInteger)1] retain];
    FOLLOW_7_in_forStat401 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_forStat401_data Count:(NSUInteger)1] retain];
    FOLLOW_assignStat_in_forStat403 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_forStat403_data Count:(NSUInteger)1] retain];
    FOLLOW_11_in_forStat405 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_forStat405_data Count:(NSUInteger)1] retain];
    FOLLOW_expr_in_forStat407 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_forStat407_data Count:(NSUInteger)1] retain];
    FOLLOW_11_in_forStat409 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_11_in_forStat409_data Count:(NSUInteger)1] retain];
    FOLLOW_assignStat_in_forStat411 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_assignStat_in_forStat411_data Count:(NSUInteger)1] retain];
    FOLLOW_8_in_forStat413 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_forStat413_data Count:(NSUInteger)1] retain];
    FOLLOW_block_in_forStat415 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_block_in_forStat415_data Count:(NSUInteger)1] retain];
    FOLLOW_ID_in_assignStat442 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_assignStat442_data Count:(NSUInteger)1] retain];
    FOLLOW_13_in_assignStat444 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_13_in_assignStat444_data Count:(NSUInteger)1] retain];
    FOLLOW_expr_in_assignStat446 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_assignStat446_data Count:(NSUInteger)1] retain];
    FOLLOW_condExpr_in_expr468 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_condExpr_in_expr468_data Count:(NSUInteger)1] retain];
    FOLLOW_aexpr_in_condExpr487 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_aexpr_in_condExpr487_data Count:(NSUInteger)1] retain];
    FOLLOW_set_in_condExpr491 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_set_in_condExpr491_data Count:(NSUInteger)1] retain];
    FOLLOW_aexpr_in_condExpr499 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_aexpr_in_condExpr499_data Count:(NSUInteger)1] retain];
    FOLLOW_atom_in_aexpr521 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_aexpr521_data Count:(NSUInteger)1] retain];
    FOLLOW_9_in_aexpr525 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_9_in_aexpr525_data Count:(NSUInteger)1] retain];
    FOLLOW_atom_in_aexpr527 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_atom_in_aexpr527_data Count:(NSUInteger)1] retain];
    FOLLOW_ID_in_atom547 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_atom547_data Count:(NSUInteger)1] retain];
    FOLLOW_INT_in_atom561 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_atom561_data Count:(NSUInteger)1] retain];
    FOLLOW_7_in_atom575 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_7_in_atom575_data Count:(NSUInteger)1] retain];
    FOLLOW_expr_in_atom577 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_expr_in_atom577_data Count:(NSUInteger)1] retain];
    FOLLOW_8_in_atom579 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_atom579_data Count:(NSUInteger)1] retain];

    [BaseRecognizer setTokenNames:[[AMutableArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
 @"ID", @"INT", @"WS", @"'('", @"')'", @"'+'", @"','", @"';'", @"'<'", @"'='", 
 @"'=='", @"'char'", @"'for'", @"'int'", @"'void'", @"'{'", @"'}'", nil] retain]];
    [BaseRecognizer setGrammarFileName:@"/Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g"];
}

+ (SimpleCParser *)newSimpleCParser:(id<TokenStream>)aStream
{
    return [[SimpleCParser alloc] initWithTokenStream:aStream];
}

- (id) initWithTokenStream:(id<TokenStream>)aStream
{
    self = [super initWithTokenStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:15+1] retain]];
    if ( self != nil ) {
        dfa2 = [DFA2 newDFA2WithRecognizer:self];
        /* start of actions-actionScope-init */
        /* start of init */
    }
    return self;
}

- (void) dealloc
{
    [dfa2 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/LL-star/SimpleC.g:7:1: program : ( declaration )+ ;
 */
- (void) program
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:8:5: ( ( declaration )+ ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:8:9: ( declaration )+ // alt
        {

        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:8:9: ( declaration )+ // positiveClosureBlock
        NSInteger cnt1 = 0;
        do {
            NSInteger alt1 = 2;
            NSInteger LA1_0 = [input LA:1];
            if ( (LA1_0==ID||LA1_0==15||(LA1_0 >= 17 && LA1_0 <= 18)) ) {
                alt1=1;
            }


            switch (alt1) {
                case 1 : ;
                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:8:9: declaration // alt
                    {

                    /* ruleRef */
                    [self pushFollow:FOLLOW_declaration_in_program28];
                    [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/LL-star/SimpleC.g:20:1: declaration : ( variable | functionHeader ';' | functionHeader block );
 */
- (void) declaration
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */
        NSString * functionHeader1 = nil ;

        NSString * functionHeader2 = nil ;


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:21:5: ( variable | functionHeader ';' | functionHeader block ) //ruleblock
        NSInteger alt2=3;
        alt2 = [dfa2 predict:input];
        switch (alt2) {
            case 1 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:21:9: variable // alt
                {

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

                [self popFollow];


                 
                }
                break;
            case 2 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:22:9: functionHeader ';' // alt
                {

                /* ruleRef */
                [self pushFollow:FOLLOW_functionHeader_in_declaration60];
                functionHeader1 = [self functionHeader];

                [self popFollow];


                 
                [self match:input TokenType:11 Follow:FOLLOW_11_in_declaration62]; 
                 

                 NSLog(@"%@ is a declaration\n", functionHeader1
                ); 

                 
                }
                break;
            case 3 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:24:9: functionHeader block // alt
                {

                /* ruleRef */
                [self pushFollow:FOLLOW_functionHeader_in_declaration75];
                functionHeader2 = [self functionHeader];

                [self popFollow];


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

                [self popFollow];


                 

                 NSLog(@"%@ is a definition\n", functionHeader2
                ); 

                 
                }
                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/LL-star/SimpleC.g:28:1: variable : type declarator ';' ;
 */
- (void) variable
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:29:5: ( type declarator ';' ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:29:9: type declarator ';' // alt
        {

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

        [self popFollow];


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

        [self popFollow];


         
        [self match:input TokenType:11 Follow:FOLLOW_11_in_variable103]; 
         
        }

        /* 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/LL-star/SimpleC.g:32:1: declarator : ID ;
 */
- (void) declarator
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:33:5: ( ID ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:33:9: ID // alt
        {

        [self match:input TokenType:ID Follow:FOLLOW_ID_in_declarator122]; 
         
        }

        /* 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/LL-star/SimpleC.g:36:1: functionHeader returns [NSString *name] : type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' ;
 */
- (NSString *) functionHeader
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */
    NSString * name = nil ;



        name=nil; // for now you must init here rather than in 'returns'

    @try {
        /* ruleLabelDefs entry */
        CommonToken *ID3 = nil;

        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:40:5: ( type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:40:9: type ID '(' ( formalParameter ( ',' formalParameter )* )? ')' // alt
        {

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

        [self popFollow];


         
        ID3=(CommonToken *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_functionHeader153]; 
         
        [self match:input TokenType:7 Follow:FOLLOW_7_in_functionHeader155]; 
         
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:40:21: ( formalParameter ( ',' formalParameter )* )? // block
        NSInteger alt4=2;
        NSInteger LA4_0 = [input LA:1];

        if ( (LA4_0==ID||LA4_0==15||(LA4_0 >= 17 && LA4_0 <= 18)) ) {
            alt4=1;
        }
        switch (alt4) {
            case 1 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:40:23: formalParameter ( ',' formalParameter )* // alt
                {

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

                [self popFollow];


                 

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


                    switch (alt3) {
                        case 1 : ;
                            // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:40:41: ',' formalParameter // alt
                            {

                            [self match:input TokenType:10 Follow:FOLLOW_10_in_functionHeader163]; 
                             
                            /* ruleRef */
                            [self pushFollow:FOLLOW_formalParameter_in_functionHeader165];
                            [self formalParameter];

                            [self popFollow];


                             
                            }
                            break;

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

                 
                }
                break;

        }

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

        name =  (ID3!=nil?ID3.text:nil);


         
        }

        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

/*
 * $ANTLR start formalParameter
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:44:1: formalParameter : type declarator ;
 */
- (void) formalParameter
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:45:5: ( type declarator ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:45:9: type declarator // alt
        {

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

        [self popFollow];


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

        [self popFollow];


         
        }

        /* 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/LL-star/SimpleC.g:48:1: type : ( 'int' | 'char' | 'void' | ID );
 */
- (void) type
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:49:5: ( 'int' | 'char' | 'void' | ID ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g: // alt
        {

        if ([input LA:1] == ID||[input LA:1] == 15||(([input LA:1] >= 17) && ([input LA:1] <= 18))) {
            [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/LL-star/SimpleC.g:55:1: block : '{' ( variable )* ( stat )* '}' ;
 */
- (void) block
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:56:5: ( '{' ( variable )* ( stat )* '}' ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:56:9: '{' ( variable )* ( stat )* '}' // alt
        {

        [self match:input TokenType:19 Follow:FOLLOW_19_in_block286]; 
         

        do {
            NSInteger alt5=2;
            NSInteger LA5_0 = [input LA:1];
            if ( (LA5_0==ID) ) {
                NSInteger LA5_2 = [input LA:2];
                if ( (LA5_2==ID) ) {
                    alt5=1;
                }


            }
            else if ( (LA5_0==15||(LA5_0 >= 17 && LA5_0 <= 18)) ) {
                alt5=1;
            }


            switch (alt5) {
                case 1 : ;
                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:57:13: variable // alt
                    {

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

                    [self popFollow];


                     
                    }
                    break;

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

         

        do {
            NSInteger alt6=2;
            NSInteger LA6_0 = [input LA:1];
            if ( ((LA6_0 >= ID && LA6_0 <= INT)||LA6_0==7||LA6_0==11||LA6_0==16||LA6_0==19) ) {
                alt6=1;
            }


            switch (alt6) {
                case 1 : ;
                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:58:13: stat // alt
                    {

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

                    [self popFollow];


                     
                    }
                    break;

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

         
        [self match:input TokenType:20 Follow:FOLLOW_20_in_block326]; 
         
        }

        /* 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/LL-star/SimpleC.g:62:1: stat : ( forStat | expr ';' | block | assignStat ';' | ';' );
 */
- (void) stat
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:62:5: ( forStat | expr ';' | block | assignStat ';' | ';' ) //ruleblock
        NSInteger alt7=5;
        unichar charLA7 = [input LA:1];
        switch (charLA7) {
            case 16: ;
                {
                alt7=1;
                }
                break;
            case ID: ;
                {
                NSInteger LA7_2 = [input LA:2];

                if ( (LA7_2==13) ) {
                    alt7=4;
                }
                else if ( (LA7_2==9||(LA7_2 >= 11 && LA7_2 <= 12)||LA7_2==14) ) {
                    alt7=2;
                }
                else {
                    NoViableAltException *nvae = [NoViableAltException newException:7 state:2 stream:input];
                    nvae.c = LA7_2;
                    @throw nvae;

                }
                }
                break;
            case INT: ;
            case 7: ;
                {
                alt7=2;
                }
                break;
            case 19: ;
                {
                alt7=3;
                }
                break;
            case 11: ;
                {
                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/LL-star/SimpleC.g:62:7: forStat // alt
                {

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

                [self popFollow];


                 
                }
                break;
            case 2 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:63:7: expr ';' // alt
                {

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

                [self popFollow];


                 
                [self match:input TokenType:11 Follow:FOLLOW_11_in_stat348]; 
                 
                }
                break;
            case 3 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:64:7: block // alt
                {

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

                [self popFollow];


                 
                }
                break;
            case 4 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:65:7: assignStat ';' // alt
                {

                /* ruleRef */
                [self pushFollow:FOLLOW_assignStat_in_stat370];
                [self assignStat];

                [self popFollow];


                 
                [self match:input TokenType:11 Follow:FOLLOW_11_in_stat372]; 
                 
                }
                break;
            case 5 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:66:7: ';' // alt
                {

                [self match:input TokenType:11 Follow:FOLLOW_11_in_stat380]; 
                 
                }
                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/LL-star/SimpleC.g:69:1: forStat : 'for' '(' assignStat ';' expr ';' assignStat ')' block ;
 */
- (void) forStat
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:70:5: ( 'for' '(' assignStat ';' expr ';' assignStat ')' block ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:70:9: 'for' '(' assignStat ';' expr ';' assignStat ')' block // alt
        {

        [self match:input TokenType:16 Follow:FOLLOW_16_in_forStat399]; 
         
        [self match:input TokenType:7 Follow:FOLLOW_7_in_forStat401]; 
         
        /* ruleRef */
        [self pushFollow:FOLLOW_assignStat_in_forStat403];
        [self assignStat];

        [self popFollow];


         
        [self match:input TokenType:11 Follow:FOLLOW_11_in_forStat405]; 
         
        /* ruleRef */
        [self pushFollow:FOLLOW_expr_in_forStat407];
        [self expr];

        [self popFollow];


         
        [self match:input TokenType:11 Follow:FOLLOW_11_in_forStat409]; 
         
        /* ruleRef */
        [self pushFollow:FOLLOW_assignStat_in_forStat411];
        [self assignStat];

        [self popFollow];


         
        [self match:input TokenType:8 Follow:FOLLOW_8_in_forStat413]; 
         
        /* ruleRef */
        [self pushFollow:FOLLOW_block_in_forStat415];
        [self block];

        [self popFollow];


         
        }

        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

/*
 * $ANTLR start assignStat
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:73:1: assignStat : ID '=' expr ;
 */
- (void) assignStat
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:74:5: ( ID '=' expr ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:74:9: ID '=' expr // alt
        {

        [self match:input TokenType:ID Follow:FOLLOW_ID_in_assignStat442]; 
         
        [self match:input TokenType:13 Follow:FOLLOW_13_in_assignStat444]; 
         
        /* ruleRef */
        [self pushFollow:FOLLOW_expr_in_assignStat446];
        [self expr];

        [self popFollow];


         
        }

        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

/*
 * $ANTLR start expr
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:77:1: expr : condExpr ;
 */
- (void) expr
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:77:5: ( condExpr ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:77:9: condExpr // alt
        {

        /* ruleRef */
        [self pushFollow:FOLLOW_condExpr_in_expr468];
        [self condExpr];

        [self popFollow];


         
        }

        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

/*
 * $ANTLR start condExpr
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:80:1: condExpr : aexpr ( ( '==' | '<' ) aexpr )? ;
 */
- (void) condExpr
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:81:5: ( aexpr ( ( '==' | '<' ) aexpr )? ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:81:9: aexpr ( ( '==' | '<' ) aexpr )? // alt
        {

        /* ruleRef */
        [self pushFollow:FOLLOW_aexpr_in_condExpr487];
        [self aexpr];

        [self popFollow];


         
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:81:15: ( ( '==' | '<' ) aexpr )? // block
        NSInteger alt8=2;
        NSInteger LA8_0 = [input LA:1];

        if ( (LA8_0==12||LA8_0==14) ) {
            alt8=1;
        }
        switch (alt8) {
            case 1 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:81:17: ( '==' | '<' ) aexpr // alt
                {

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

                 
                /* ruleRef */
                [self pushFollow:FOLLOW_aexpr_in_condExpr499];
                [self aexpr];

                [self popFollow];


                 
                }
                break;

        }

         
        }

        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

/*
 * $ANTLR start aexpr
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:84:1: aexpr : atom ( '+' atom )* ;
 */
- (void) aexpr
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:85:5: ( atom ( '+' atom )* ) // ruleBlockSingleAlt
        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:85:9: atom ( '+' atom )* // alt
        {

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

        [self popFollow];


         

        do {
            NSInteger alt9=2;
            NSInteger LA9_0 = [input LA:1];
            if ( (LA9_0==9) ) {
                alt9=1;
            }


            switch (alt9) {
                case 1 : ;
                    // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:85:16: '+' atom // alt
                    {

                    [self match:input TokenType:9 Follow:FOLLOW_9_in_aexpr525]; 
                     
                    /* ruleRef */
                    [self pushFollow:FOLLOW_atom_in_aexpr527];
                    [self atom];

                    [self popFollow];


                     
                    }
                    break;

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

         
        }

        /* token+rule list labels */

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

    @finally {
        /* ruleScopeCleanUp */

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

/*
 * $ANTLR start atom
 * /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:88:1: atom : ( ID | INT | '(' expr ')' );
 */
- (void) atom
{
    /* ruleScopeSetUp */

    /* ruleDeclarations */

    @try {
        /* ruleLabelDefs entry */


        // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:89:5: ( ID | INT | '(' expr ')' ) //ruleblock
        NSInteger alt10=3;
        unichar charLA10 = [input LA:1];
        switch (charLA10) {
            case ID: ;
                {
                alt10=1;
                }
                break;
            case INT: ;
                {
                alt10=2;
                }
                break;
            case 7: ;
                {
                alt10=3;
                }
                break;

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

        }

        switch (alt10) {
            case 1 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:89:7: ID // alt
                {

                [self match:input TokenType:ID Follow:FOLLOW_ID_in_atom547]; 
                 
                }
                break;
            case 2 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:90:7: INT // alt
                {

                [self match:input TokenType:INT Follow:FOLLOW_INT_in_atom561]; 
                 
                }
                break;
            case 3 : ;
                // /Users/acondit/source/antlr/code/antlr3/runtime/ObjC/Framework/examples/LL-star/SimpleC.g:91:7: '(' expr ')' // alt
                {

                [self match:input TokenType:7 Follow:FOLLOW_7_in_atom575]; 
                 
                /* ruleRef */
                [self pushFollow:FOLLOW_expr_in_atom577];
                [self expr];

                [self popFollow];


                 
                [self match:input TokenType:8 Follow:FOLLOW_8_in_atom579]; 
                 
                }
                break;

        }
        /* 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 SimpleCParser implementation line 692 */
