// $ANTLR 3.2 Aug 13, 2010 14:19:31 SimpleCTP.g 2010-08-13 14:29:19

import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;import java.util.Stack;
import java.util.List;
import java.util.ArrayList;

public class SimpleCTP extends TreeParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "VAR_DEF", "ARG_DEF", "FUNC_HDR", "FUNC_DECL", "FUNC_DEF", "BLOCK", "ID", "EQ", "INT", "FOR", "INT_TYPE", "CHAR", "VOID", "EQEQ", "LT", "PLUS", "WS", "';'", "'('", "','", "')'", "'{'", "'}'"
    };
    public static final int LT=18;
    public static final int T__26=26;
    public static final int T__25=25;
    public static final int T__24=24;
    public static final int T__23=23;
    public static final int T__22=22;
    public static final int T__21=21;
    public static final int CHAR=15;
    public static final int FOR=13;
    public static final int FUNC_HDR=6;
    public static final int INT=12;
    public static final int FUNC_DEF=8;
    public static final int INT_TYPE=14;
    public static final int ID=10;
    public static final int EOF=-1;
    public static final int FUNC_DECL=7;
    public static final int ARG_DEF=5;
    public static final int WS=20;
    public static final int BLOCK=9;
    public static final int PLUS=19;
    public static final int VOID=16;
    public static final int EQ=11;
    public static final int VAR_DEF=4;
    public static final int EQEQ=17;

    // delegates
    // delegators


        public SimpleCTP(TreeNodeStream input) {
            this(input, new RecognizerSharedState());
        }
        public SimpleCTP(TreeNodeStream input, RecognizerSharedState state) {
            super(input, state);
             
        }
        

    public String[] getTokenNames() { return SimpleCTP.tokenNames; }
    public String getGrammarFileName() { return "SimpleCTP.g"; }



    // $ANTLR start "program"
    // SimpleCTP.g:8:1: program : ( declaration )+ ;
    public final void program() throws RecognitionException {
        try {
            // SimpleCTP.g:9:5: ( ( declaration )+ )
            // SimpleCTP.g:9:9: ( declaration )+
            {
            // SimpleCTP.g:9:9: ( declaration )+
            int cnt1=0;
            loop1:
            do {
                int alt1=2;
                int LA1_0 = input.LA(1);

                if ( (LA1_0==VAR_DEF||(LA1_0>=FUNC_DECL && LA1_0<=FUNC_DEF)) ) {
                    alt1=1;
                }


                switch (alt1) {
            	case 1 :
            	    // SimpleCTP.g:9:9: declaration
            	    {
            	    pushFollow(FOLLOW_declaration_in_program43);
            	    declaration();

            	    state._fsp--;


            	    }
            	    break;

            	default :
            	    if ( cnt1 >= 1 ) break loop1;
                        EarlyExitException eee =
                            new EarlyExitException(1, input);
                        throw eee;
                }
                cnt1++;
            } while (true);


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "program"


    // $ANTLR start "declaration"
    // SimpleCTP.g:12:1: declaration : ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) );
    public final void declaration() throws RecognitionException {
        try {
            // SimpleCTP.g:13:5: ( variable | ^( FUNC_DECL functionHeader ) | ^( FUNC_DEF functionHeader block ) )
            int alt2=3;
            switch ( input.LA(1) ) {
            case VAR_DEF:
                {
                alt2=1;
                }
                break;
            case FUNC_DECL:
                {
                alt2=2;
                }
                break;
            case FUNC_DEF:
                {
                alt2=3;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 2, 0, input);

                throw nvae;
            }

            switch (alt2) {
                case 1 :
                    // SimpleCTP.g:13:9: variable
                    {
                    pushFollow(FOLLOW_variable_in_declaration63);
                    variable();

                    state._fsp--;


                    }
                    break;
                case 2 :
                    // SimpleCTP.g:14:9: ^( FUNC_DECL functionHeader )
                    {
                    match(input,FUNC_DECL,FOLLOW_FUNC_DECL_in_declaration74); 

                    match(input, Token.DOWN, null); 
                    pushFollow(FOLLOW_functionHeader_in_declaration76);
                    functionHeader();

                    state._fsp--;


                    match(input, Token.UP, null); 

                    }
                    break;
                case 3 :
                    // SimpleCTP.g:15:9: ^( FUNC_DEF functionHeader block )
                    {
                    match(input,FUNC_DEF,FOLLOW_FUNC_DEF_in_declaration88); 

                    match(input, Token.DOWN, null); 
                    pushFollow(FOLLOW_functionHeader_in_declaration90);
                    functionHeader();

                    state._fsp--;

                    pushFollow(FOLLOW_block_in_declaration92);
                    block();

                    state._fsp--;


                    match(input, Token.UP, null); 

                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "declaration"


    // $ANTLR start "variable"
    // SimpleCTP.g:18:1: variable : ^( VAR_DEF type declarator ) ;
    public final void variable() throws RecognitionException {
        try {
            // SimpleCTP.g:19:5: ( ^( VAR_DEF type declarator ) )
            // SimpleCTP.g:19:9: ^( VAR_DEF type declarator )
            {
            match(input,VAR_DEF,FOLLOW_VAR_DEF_in_variable113); 

            match(input, Token.DOWN, null); 
            pushFollow(FOLLOW_type_in_variable115);
            type();

            state._fsp--;

            pushFollow(FOLLOW_declarator_in_variable117);
            declarator();

            state._fsp--;


            match(input, Token.UP, null); 

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "variable"


    // $ANTLR start "declarator"
    // SimpleCTP.g:22:1: declarator : ID ;
    public final void declarator() throws RecognitionException {
        try {
            // SimpleCTP.g:23:5: ( ID )
            // SimpleCTP.g:23:9: ID
            {
            match(input,ID,FOLLOW_ID_in_declarator137); 

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "declarator"


    // $ANTLR start "functionHeader"
    // SimpleCTP.g:26:1: functionHeader : ^( FUNC_HDR type ID ( formalParameter )+ ) ;
    public final void functionHeader() throws RecognitionException {
        try {
            // SimpleCTP.g:27:5: ( ^( FUNC_HDR type ID ( formalParameter )+ ) )
            // SimpleCTP.g:27:9: ^( FUNC_HDR type ID ( formalParameter )+ )
            {
            match(input,FUNC_HDR,FOLLOW_FUNC_HDR_in_functionHeader158); 

            match(input, Token.DOWN, null); 
            pushFollow(FOLLOW_type_in_functionHeader160);
            type();

            state._fsp--;

            match(input,ID,FOLLOW_ID_in_functionHeader162); 
            // SimpleCTP.g:27:28: ( formalParameter )+
            int cnt3=0;
            loop3:
            do {
                int alt3=2;
                int LA3_0 = input.LA(1);

                if ( (LA3_0==ARG_DEF) ) {
                    alt3=1;
                }


                switch (alt3) {
            	case 1 :
            	    // SimpleCTP.g:27:28: formalParameter
            	    {
            	    pushFollow(FOLLOW_formalParameter_in_functionHeader164);
            	    formalParameter();

            	    state._fsp--;


            	    }
            	    break;

            	default :
            	    if ( cnt3 >= 1 ) break loop3;
                        EarlyExitException eee =
                            new EarlyExitException(3, input);
                        throw eee;
                }
                cnt3++;
            } while (true);


            match(input, Token.UP, null); 

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "functionHeader"


    // $ANTLR start "formalParameter"
    // SimpleCTP.g:30:1: formalParameter : ^( ARG_DEF type declarator ) ;
    public final void formalParameter() throws RecognitionException {
        try {
            // SimpleCTP.g:31:5: ( ^( ARG_DEF type declarator ) )
            // SimpleCTP.g:31:9: ^( ARG_DEF type declarator )
            {
            match(input,ARG_DEF,FOLLOW_ARG_DEF_in_formalParameter186); 

            match(input, Token.DOWN, null); 
            pushFollow(FOLLOW_type_in_formalParameter188);
            type();

            state._fsp--;

            pushFollow(FOLLOW_declarator_in_formalParameter190);
            declarator();

            state._fsp--;


            match(input, Token.UP, null); 

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "formalParameter"


    // $ANTLR start "type"
    // SimpleCTP.g:34:1: type : ( 'int' | 'char' | 'void' | ID );
    public final void type() throws RecognitionException {
        try {
            // SimpleCTP.g:35:5: ( 'int' | 'char' | 'void' | ID )
            // SimpleCTP.g:
            {
            if ( input.LA(1)==ID||(input.LA(1)>=INT_TYPE && input.LA(1)<=VOID) ) {
                input.consume();
                state.errorRecovery=false;
            }
            else {
                MismatchedSetException mse = new MismatchedSetException(null,input);
                throw mse;
            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "type"


    // $ANTLR start "block"
    // SimpleCTP.g:41:1: block : ^( BLOCK ( variable )* ( stat )* ) ;
    public final void block() throws RecognitionException {
        try {
            // SimpleCTP.g:42:5: ( ^( BLOCK ( variable )* ( stat )* ) )
            // SimpleCTP.g:42:9: ^( BLOCK ( variable )* ( stat )* )
            {
            match(input,BLOCK,FOLLOW_BLOCK_in_block273); 

            if ( input.LA(1)==Token.DOWN ) {
                match(input, Token.DOWN, null); 
                // SimpleCTP.g:42:17: ( variable )*
                loop4:
                do {
                    int alt4=2;
                    int LA4_0 = input.LA(1);

                    if ( (LA4_0==VAR_DEF) ) {
                        alt4=1;
                    }


                    switch (alt4) {
                	case 1 :
                	    // SimpleCTP.g:42:17: variable
                	    {
                	    pushFollow(FOLLOW_variable_in_block275);
                	    variable();

                	    state._fsp--;


                	    }
                	    break;

                	default :
                	    break loop4;
                    }
                } while (true);

                // SimpleCTP.g:42:27: ( stat )*
                loop5:
                do {
                    int alt5=2;
                    int LA5_0 = input.LA(1);

                    if ( ((LA5_0>=BLOCK && LA5_0<=FOR)||(LA5_0>=EQEQ && LA5_0<=PLUS)) ) {
                        alt5=1;
                    }


                    switch (alt5) {
                	case 1 :
                	    // SimpleCTP.g:42:27: stat
                	    {
                	    pushFollow(FOLLOW_stat_in_block278);
                	    stat();

                	    state._fsp--;


                	    }
                	    break;

                	default :
                	    break loop5;
                    }
                } while (true);


                match(input, Token.UP, null); 
            }

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "block"


    // $ANTLR start "stat"
    // SimpleCTP.g:45:1: stat : ( forStat | expr | block );
    public final void stat() throws RecognitionException {
        try {
            // SimpleCTP.g:45:5: ( forStat | expr | block )
            int alt6=3;
            switch ( input.LA(1) ) {
            case FOR:
                {
                alt6=1;
                }
                break;
            case ID:
            case EQ:
            case INT:
            case EQEQ:
            case LT:
            case PLUS:
                {
                alt6=2;
                }
                break;
            case BLOCK:
                {
                alt6=3;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 6, 0, input);

                throw nvae;
            }

            switch (alt6) {
                case 1 :
                    // SimpleCTP.g:45:7: forStat
                    {
                    pushFollow(FOLLOW_forStat_in_stat292);
                    forStat();

                    state._fsp--;


                    }
                    break;
                case 2 :
                    // SimpleCTP.g:46:7: expr
                    {
                    pushFollow(FOLLOW_expr_in_stat300);
                    expr();

                    state._fsp--;


                    }
                    break;
                case 3 :
                    // SimpleCTP.g:47:7: block
                    {
                    pushFollow(FOLLOW_block_in_stat308);
                    block();

                    state._fsp--;


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "stat"


    // $ANTLR start "forStat"
    // SimpleCTP.g:50:1: forStat : ^( 'for' expr expr expr block ) ;
    public final void forStat() throws RecognitionException {
        try {
            // SimpleCTP.g:51:5: ( ^( 'for' expr expr expr block ) )
            // SimpleCTP.g:51:9: ^( 'for' expr expr expr block )
            {
            match(input,FOR,FOLLOW_FOR_in_forStat328); 

            match(input, Token.DOWN, null); 
            pushFollow(FOLLOW_expr_in_forStat330);
            expr();

            state._fsp--;

            pushFollow(FOLLOW_expr_in_forStat332);
            expr();

            state._fsp--;

            pushFollow(FOLLOW_expr_in_forStat334);
            expr();

            state._fsp--;

            pushFollow(FOLLOW_block_in_forStat336);
            block();

            state._fsp--;


            match(input, Token.UP, null); 

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "forStat"

    public static class expr_return extends TreeRuleReturnScope {
    };

    // $ANTLR start "expr"
    // SimpleCTP.g:54:1: expr : ( ^( EQEQ expr expr ) | ^( LT expr expr ) | ^( PLUS expr expr ) | ^( EQ ID e= expr ) | atom );
    public final SimpleCTP.expr_return expr() throws RecognitionException {
        SimpleCTP.expr_return retval = new SimpleCTP.expr_return();
        retval.start = input.LT(1);

        ANTLRCommonTree ID1=null;
        SimpleCTP.expr_return e = null;


        try {
            // SimpleCTP.g:54:5: ( ^( EQEQ expr expr ) | ^( LT expr expr ) | ^( PLUS expr expr ) | ^( EQ ID e= expr ) | atom )
            int alt7=5;
            switch ( input.LA(1) ) {
            case EQEQ:
                {
                alt7=1;
                }
                break;
            case LT:
                {
                alt7=2;
                }
                break;
            case PLUS:
                {
                alt7=3;
                }
                break;
            case EQ:
                {
                alt7=4;
                }
                break;
            case ID:
            case INT:
                {
                alt7=5;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 7, 0, input);

                throw nvae;
            }

            switch (alt7) {
                case 1 :
                    // SimpleCTP.g:54:9: ^( EQEQ expr expr )
                    {
                    match(input,EQEQ,FOLLOW_EQEQ_in_expr352); 

                    match(input, Token.DOWN, null); 
                    pushFollow(FOLLOW_expr_in_expr354);
                    expr();

                    state._fsp--;

                    pushFollow(FOLLOW_expr_in_expr356);
                    expr();

                    state._fsp--;


                    match(input, Token.UP, null); 

                    }
                    break;
                case 2 :
                    // SimpleCTP.g:55:9: ^( LT expr expr )
                    {
                    match(input,LT,FOLLOW_LT_in_expr368); 

                    match(input, Token.DOWN, null); 
                    pushFollow(FOLLOW_expr_in_expr370);
                    expr();

                    state._fsp--;

                    pushFollow(FOLLOW_expr_in_expr372);
                    expr();

                    state._fsp--;


                    match(input, Token.UP, null); 

                    }
                    break;
                case 3 :
                    // SimpleCTP.g:56:9: ^( PLUS expr expr )
                    {
                    match(input,PLUS,FOLLOW_PLUS_in_expr384); 

                    match(input, Token.DOWN, null); 
                    pushFollow(FOLLOW_expr_in_expr386);
                    expr();

                    state._fsp--;

                    pushFollow(FOLLOW_expr_in_expr388);
                    expr();

                    state._fsp--;


                    match(input, Token.UP, null); 

                    }
                    break;
                case 4 :
                    // SimpleCTP.g:57:9: ^( EQ ID e= expr )
                    {
                    match(input,EQ,FOLLOW_EQ_in_expr400); 

                    match(input, Token.DOWN, null); 
                    ID1=(ANTLRCommonTree)match(input,ID,FOLLOW_ID_in_expr402); 
                    pushFollow(FOLLOW_expr_in_expr406);
                    e=expr();

                    state._fsp--;


                    match(input, Token.UP, null); 
                     NSLog(@"assigning %@ to variable %@", (e!=null?(input.getTokenStream().toString(
                      input.getTreeAdaptor().getTokenStartIndex(e.start),
                      input.getTreeAdaptor().getTokenStopIndex(e.start))):null), (ID1!=null?ID1.getText():null)); 

                    }
                    break;
                case 5 :
                    // SimpleCTP.g:58:9: atom
                    {
                    pushFollow(FOLLOW_atom_in_expr419);
                    atom();

                    state._fsp--;


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return retval;
    }
    // $ANTLR end "expr"


    // $ANTLR start "atom"
    // SimpleCTP.g:61:1: atom : ( ID | INT );
    public final void atom() throws RecognitionException {
        try {
            // SimpleCTP.g:62:5: ( ID | INT )
            // SimpleCTP.g:
            {
            if ( input.LA(1)==ID||input.LA(1)==INT ) {
                input.consume();
                state.errorRecovery=false;
            }
            else {
                MismatchedSetException mse = new MismatchedSetException(null,input);
                throw mse;
            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return ;
    }
    // $ANTLR end "atom"

    // Delegated rules


 

    public static final BitSet FOLLOW_declaration_in_program43 = new BitSet(new long[]{0x0000000000000192L});
    public static final BitSet FOLLOW_variable_in_declaration63 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_FUNC_DECL_in_declaration74 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_functionHeader_in_declaration76 = new BitSet(new long[]{0x0000000000000008L});
    public static final BitSet FOLLOW_FUNC_DEF_in_declaration88 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_functionHeader_in_declaration90 = new BitSet(new long[]{0x0000000000000200L});
    public static final BitSet FOLLOW_block_in_declaration92 = new BitSet(new long[]{0x0000000000000008L});
    public static final BitSet FOLLOW_VAR_DEF_in_variable113 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_type_in_variable115 = new BitSet(new long[]{0x0000000000000400L});
    public static final BitSet FOLLOW_declarator_in_variable117 = new BitSet(new long[]{0x0000000000000008L});
    public static final BitSet FOLLOW_ID_in_declarator137 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_FUNC_HDR_in_functionHeader158 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_type_in_functionHeader160 = new BitSet(new long[]{0x0000000000000400L});
    public static final BitSet FOLLOW_ID_in_functionHeader162 = new BitSet(new long[]{0x0000000000000020L});
    public static final BitSet FOLLOW_formalParameter_in_functionHeader164 = new BitSet(new long[]{0x0000000000000028L});
    public static final BitSet FOLLOW_ARG_DEF_in_formalParameter186 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_type_in_formalParameter188 = new BitSet(new long[]{0x0000000000000400L});
    public static final BitSet FOLLOW_declarator_in_formalParameter190 = new BitSet(new long[]{0x0000000000000008L});
    public static final BitSet FOLLOW_set_in_type0 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_BLOCK_in_block273 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_variable_in_block275 = new BitSet(new long[]{0x00000000000E3E18L});
    public static final BitSet FOLLOW_stat_in_block278 = new BitSet(new long[]{0x00000000000E3E08L});
    public static final BitSet FOLLOW_forStat_in_stat292 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_expr_in_stat300 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_block_in_stat308 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_FOR_in_forStat328 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_expr_in_forStat330 = new BitSet(new long[]{0x00000000000E1C00L});
    public static final BitSet FOLLOW_expr_in_forStat332 = new BitSet(new long[]{0x00000000000E1C00L});
    public static final BitSet FOLLOW_expr_in_forStat334 = new BitSet(new long[]{0x0000000000000200L});
    public static final BitSet FOLLOW_block_in_forStat336 = new BitSet(new long[]{0x0000000000000008L});
    public static final BitSet FOLLOW_EQEQ_in_expr352 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_expr_in_expr354 = new BitSet(new long[]{0x00000000000E1C00L});
    public static final BitSet FOLLOW_expr_in_expr356 = new BitSet(new long[]{0x0000000000000008L});
    public static final BitSet FOLLOW_LT_in_expr368 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_expr_in_expr370 = new BitSet(new long[]{0x00000000000E1C00L});
    public static final BitSet FOLLOW_expr_in_expr372 = new BitSet(new long[]{0x0000000000000008L});
    public static final BitSet FOLLOW_PLUS_in_expr384 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_expr_in_expr386 = new BitSet(new long[]{0x00000000000E1C00L});
    public static final BitSet FOLLOW_expr_in_expr388 = new BitSet(new long[]{0x0000000000000008L});
    public static final BitSet FOLLOW_EQ_in_expr400 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_ID_in_expr402 = new BitSet(new long[]{0x00000000000E1C00L});
    public static final BitSet FOLLOW_expr_in_expr406 = new BitSet(new long[]{0x0000000000000008L});
    public static final BitSet FOLLOW_atom_in_expr419 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_set_in_atom0 = new BitSet(new long[]{0x0000000000000002L});

}