public final LogoParser.array_return array() throws RecognitionException {
        LogoParser.array_return retval = new LogoParser.array_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token char_literal47=null;
        Token char_literal48=null;
        Token char_literal49=null;
        LogoParser.expression_return e1 =null;

        LogoParser.expression_return e2 =null;


        Object char_literal47_tree=null;
        Object char_literal48_tree=null;
        Object char_literal49_tree=null;

        try {
            // /home/carlos/Proyectos/logojava/Logo.g:132:2: ( ( '{' !e1= expression ( ',' e2= expression )* '}' !) )
            // /home/carlos/Proyectos/logojava/Logo.g:133:3: ( '{' !e1= expression ( ',' e2= expression )* '}' !)
            {
            root_0 = (Object)adaptor.nil();


             ArrayLiteral array = new ArrayLiteral();

            // /home/carlos/Proyectos/logojava/Logo.g:134:3: ( '{' !e1= expression ( ',' e2= expression )* '}' !)
            // /home/carlos/Proyectos/logojava/Logo.g:134:4: '{' !e1= expression ( ',' e2= expression )* '}' !
            {
            char_literal47=(Token)match(input,36,FOLLOW_36_in_array793); 

            pushFollow(FOLLOW_expression_in_array802);
            e1=expression();

            state._fsp--;

            adaptor.addChild(root_0, e1.getTree());

             array.add((e1!=null?e1.value:null).evaluate(context)); 

            // /home/carlos/Proyectos/logojava/Logo.g:136:4: ( ',' e2= expression )*
            loop17:
            do {
                int alt17=2;
                int LA17_0 = input.LA(1);

                if ( (LA17_0==COMMA) ) {
                    alt17=1;
                }


                switch (alt17) {
            	case 1 :
            	    // /home/carlos/Proyectos/logojava/Logo.g:136:5: ',' e2= expression
            	    {
            	    char_literal48=(Token)match(input,COMMA,FOLLOW_COMMA_in_array810); 
            	    char_literal48_tree = 
            	    (Object)adaptor.create(char_literal48)
            	    ;
            	    adaptor.addChild(root_0, char_literal48_tree);


            	    pushFollow(FOLLOW_expression_in_array814);
            	    e2=expression();

            	    state._fsp--;

            	    adaptor.addChild(root_0, e2.getTree());

            	     array.add((e2!=null?e2.value:null).evaluate(context)); 

            	    }
            	    break;

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


            char_literal49=(Token)match(input,37,FOLLOW_37_in_array822); 

            }


             retval.value = array; 

            }

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


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

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

        }

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