public final ANTLRv3TreeFilter.action_return action() throws RecognitionException {
        ANTLRv3TreeFilter.action_return retval = new ANTLRv3TreeFilter.action_return();
        retval.start = input.LT(1);

        try {
            // back-end/koopa/trees/antlr/filter/generator/ANTLRv3TreeFilter.g:88:2: ( ^( '@' ID ID ACTION ) | ^( '@' ID ACTION ) )
            int alt10=2;
            int LA10_0 = input.LA(1);

            if ( (LA10_0==72) ) {
                int LA10_1 = input.LA(2);

                if ( (LA10_1==DOWN) ) {
                    int LA10_2 = input.LA(3);

                    if ( (LA10_2==ID) ) {
                        int LA10_3 = input.LA(4);

                        if ( (LA10_3==ID) ) {
                            alt10=1;
                        }
                        else if ( (LA10_3==ACTION) ) {
                            alt10=2;
                        }
                        else {
                            NoViableAltException nvae =
                                new NoViableAltException("", 10, 3, input);

                            throw nvae;
                        }
                    }
                    else {
                        NoViableAltException nvae =
                            new NoViableAltException("", 10, 2, input);

                        throw nvae;
                    }
                }
                else {
                    NoViableAltException nvae =
                        new NoViableAltException("", 10, 1, input);

                    throw nvae;
                }
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 10, 0, input);

                throw nvae;
            }
            switch (alt10) {
                case 1 :
                    // back-end/koopa/trees/antlr/filter/generator/ANTLRv3TreeFilter.g:88:4: ^( '@' ID ID ACTION )
                    {
                    match(input,72,FOLLOW_72_in_action310); 

                    match(input, Token.DOWN, null); 
                    match(input,ID,FOLLOW_ID_in_action312); 
                    match(input,ID,FOLLOW_ID_in_action314); 
                    match(input,ACTION,FOLLOW_ACTION_in_action316); 

                    match(input, Token.UP, null); 

                    }
                    break;
                case 2 :
                    // back-end/koopa/trees/antlr/filter/generator/ANTLRv3TreeFilter.g:89:4: ^( '@' ID ACTION )
                    {
                    match(input,72,FOLLOW_72_in_action323); 

                    match(input, Token.DOWN, null); 
                    match(input,ID,FOLLOW_ID_in_action325); 
                    match(input,ACTION,FOLLOW_ACTION_in_action327); 

                    match(input, Token.UP, null); 

                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return retval;
    }