public final NiklausParser.parameterlist_return parameterlist() throws RecognitionException {
        NiklausParser.parameterlist_return retval = new NiklausParser.parameterlist_return();
        retval.start = input.LT(1);


        CommonTree root_0 = null;

        Token OPENINGPARENTHESIS56=null;
        Token COMMA58=null;
        Token CLOSINGPARENTHESIS60=null;
        NiklausParser.parameters_return parameters57 =null;

        NiklausParser.parameters_return parameters59 =null;


        CommonTree OPENINGPARENTHESIS56_tree=null;
        CommonTree COMMA58_tree=null;
        CommonTree CLOSINGPARENTHESIS60_tree=null;
        RewriteRuleTokenStream stream_OPENINGPARENTHESIS=new RewriteRuleTokenStream(adaptor,"token OPENINGPARENTHESIS");
        RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
        RewriteRuleTokenStream stream_CLOSINGPARENTHESIS=new RewriteRuleTokenStream(adaptor,"token CLOSINGPARENTHESIS");
        RewriteRuleSubtreeStream stream_parameters=new RewriteRuleSubtreeStream(adaptor,"rule parameters");
        try {
            // C:\\Users\\Edward\\workspace\\ANTLRTest\\src\\Niklaus.g:89:14: ( OPENINGPARENTHESIS ( parameters ( COMMA parameters )* )? CLOSINGPARENTHESIS -> ^( PARAM ( parameters )* ) )
            // C:\\Users\\Edward\\workspace\\ANTLRTest\\src\\Niklaus.g:90:3: OPENINGPARENTHESIS ( parameters ( COMMA parameters )* )? CLOSINGPARENTHESIS
            {
            OPENINGPARENTHESIS56=(Token)match(input,OPENINGPARENTHESIS,FOLLOW_OPENINGPARENTHESIS_in_parameterlist445);  
            stream_OPENINGPARENTHESIS.add(OPENINGPARENTHESIS56);


            // C:\\Users\\Edward\\workspace\\ANTLRTest\\src\\Niklaus.g:90:22: ( parameters ( COMMA parameters )* )?
            int alt16=2;
            int LA16_0 = input.LA(1);

            if ( (LA16_0==IDENTIFIER) ) {
                alt16=1;
            }
            switch (alt16) {
                case 1 :
                    // C:\\Users\\Edward\\workspace\\ANTLRTest\\src\\Niklaus.g:90:23: parameters ( COMMA parameters )*
                    {
                    pushFollow(FOLLOW_parameters_in_parameterlist448);
                    parameters57=parameters();

                    state._fsp--;

                    stream_parameters.add(parameters57.getTree());

                    // C:\\Users\\Edward\\workspace\\ANTLRTest\\src\\Niklaus.g:90:34: ( COMMA parameters )*
                    loop15:
                    do {
                        int alt15=2;
                        int LA15_0 = input.LA(1);

                        if ( (LA15_0==COMMA) ) {
                            alt15=1;
                        }


                        switch (alt15) {
                    	case 1 :
                    	    // C:\\Users\\Edward\\workspace\\ANTLRTest\\src\\Niklaus.g:90:35: COMMA parameters
                    	    {
                    	    COMMA58=(Token)match(input,COMMA,FOLLOW_COMMA_in_parameterlist451);  
                    	    stream_COMMA.add(COMMA58);


                    	    pushFollow(FOLLOW_parameters_in_parameterlist453);
                    	    parameters59=parameters();

                    	    state._fsp--;

                    	    stream_parameters.add(parameters59.getTree());

                    	    }
                    	    break;

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


                    }
                    break;

            }


            CLOSINGPARENTHESIS60=(Token)match(input,CLOSINGPARENTHESIS,FOLLOW_CLOSINGPARENTHESIS_in_parameterlist459);  
            stream_CLOSINGPARENTHESIS.add(CLOSINGPARENTHESIS60);


            // AST REWRITE
            // elements: parameters
            // token labels: 
            // rule labels: retval
            // token list labels: 
            // rule list labels: 
            // wildcard labels: 
            retval.tree = root_0;
            RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

            root_0 = (CommonTree)adaptor.nil();
            // 91:3: -> ^( PARAM ( parameters )* )
            {
                // C:\\Users\\Edward\\workspace\\ANTLRTest\\src\\Niklaus.g:91:6: ^( PARAM ( parameters )* )
                {
                CommonTree root_1 = (CommonTree)adaptor.nil();
                root_1 = (CommonTree)adaptor.becomeRoot(
                (CommonTree)adaptor.create(PARAM, "PARAM")
                , root_1);

                // C:\\Users\\Edward\\workspace\\ANTLRTest\\src\\Niklaus.g:91:14: ( parameters )*
                while ( stream_parameters.hasNext() ) {
                    adaptor.addChild(root_1, stream_parameters.nextTree());

                }
                stream_parameters.reset();

                adaptor.addChild(root_0, root_1);
                }

            }


            retval.tree = root_0;

            }

            retval.stop = input.LT(-1);


            retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }

        finally {
        	// do for sure before leaving
        }
        return retval;
    }