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

        try {
            // back-end/koopa/trees/antlr/filter/generator/ANTLRv3TreeFilter.g:402:2: ( OPTIONAL -> {%{\"[>OPTIONAL<]\"}} | CLOSURE -> {%{\"[>CLOSURE<]\"}} | POSITIVE_CLOSURE -> {%{\"[>POSITIVE_CLOSURE<]\"}})
            int alt40=3;
            switch ( input.LA(1) ) {
            case OPTIONAL:
                {
                alt40=1;
                }
                break;
            case CLOSURE:
                {
                alt40=2;
                }
                break;
            case POSITIVE_CLOSURE:
                {
                alt40=3;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 40, 0, input);

                throw nvae;
            }

            switch (alt40) {
                case 1 :
                    // back-end/koopa/trees/antlr/filter/generator/ANTLRv3TreeFilter.g:402:4: OPTIONAL
                    {
                    match(input,OPTIONAL,FOLLOW_OPTIONAL_in_ebnfSuffix2054); 


                    // TEMPLATE REWRITE
                    // 404:5: -> {%{\"[>OPTIONAL<]\"}}
                    {
                        retval.st = new StringTemplate(templateLib,"[>OPTIONAL<]");
                    }


                    }
                    break;
                case 2 :
                    // back-end/koopa/trees/antlr/filter/generator/ANTLRv3TreeFilter.g:406:5: CLOSURE
                    {
                    match(input,CLOSURE,FOLLOW_CLOSURE_in_ebnfSuffix2070); 


                    // TEMPLATE REWRITE
                    // 408:5: -> {%{\"[>CLOSURE<]\"}}
                    {
                        retval.st = new StringTemplate(templateLib,"[>CLOSURE<]");
                    }


                    }
                    break;
                case 3 :
                    // back-end/koopa/trees/antlr/filter/generator/ANTLRv3TreeFilter.g:410:5: POSITIVE_CLOSURE
                    {
                    match(input,POSITIVE_CLOSURE,FOLLOW_POSITIVE_CLOSURE_in_ebnfSuffix2086); 


                    // TEMPLATE REWRITE
                    // 412:5: -> {%{\"[>POSITIVE_CLOSURE<]\"}}
                    {
                        retval.st = new StringTemplate(templateLib,"[>POSITIVE_CLOSURE<]");
                    }


                    }
                    break;

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