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


        Object root_0 = null;

        LogoParser.logical_return logical33 =null;



        try {
            // /home/carlos/Proyectos/logojava/Logo.g:87:2: ( logical )
            // /home/carlos/Proyectos/logojava/Logo.g:87:4: logical
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_logical_in_expression422);
            logical33=logical();

            state._fsp--;

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

             retval.value = (logical33!=null?logical33.value:null);

            }

            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;
    }