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


        Object root_0 = null;

        Token PLUS43=null;
        Token MINUS44=null;
        LogoParser.mult_return o1 =null;

        LogoParser.mult_return o2 =null;


        Object PLUS43_tree=null;
        Object MINUS44_tree=null;

        try {
            // /home/carlos/Proyectos/logojava/Logo.g:114:2: (o1= mult ( PLUS o2= mult | MINUS o2= mult )* )
            // /home/carlos/Proyectos/logojava/Logo.g:114:4: o1= mult ( PLUS o2= mult | MINUS o2= mult )*
            {
            root_0 = (Object)adaptor.nil();


             AdditiveOperation operation = new AdditiveOperation(); 

            pushFollow(FOLLOW_mult_in_sum654);
            o1=mult();

            state._fsp--;

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

             operation.sum((o1!=null?o1.value:null));

            // /home/carlos/Proyectos/logojava/Logo.g:116:3: ( PLUS o2= mult | MINUS o2= mult )*
            loop15:
            do {
                int alt15=3;
                int LA15_0 = input.LA(1);

                if ( (LA15_0==PLUS) ) {
                    alt15=1;
                }
                else if ( (LA15_0==MINUS) ) {
                    alt15=2;
                }


                switch (alt15) {
            	case 1 :
            	    // /home/carlos/Proyectos/logojava/Logo.g:117:5: PLUS o2= mult
            	    {
            	    PLUS43=(Token)match(input,PLUS,FOLLOW_PLUS_in_sum669); 
            	    PLUS43_tree = 
            	    (Object)adaptor.create(PLUS43)
            	    ;
            	    adaptor.addChild(root_0, PLUS43_tree);


            	    pushFollow(FOLLOW_mult_in_sum673);
            	    o2=mult();

            	    state._fsp--;

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

            	     operation.sum((o2!=null?o2.value:null));

            	    }
            	    break;
            	case 2 :
            	    // /home/carlos/Proyectos/logojava/Logo.g:118:5: MINUS o2= mult
            	    {
            	    MINUS44=(Token)match(input,MINUS,FOLLOW_MINUS_in_sum684); 
            	    MINUS44_tree = 
            	    (Object)adaptor.create(MINUS44)
            	    ;
            	    adaptor.addChild(root_0, MINUS44_tree);


            	    pushFollow(FOLLOW_mult_in_sum688);
            	    o2=mult();

            	    state._fsp--;

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

            	     operation.sub((o2!=null?o2.value:null));

            	    }
            	    break;

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


             retval.value = operation;

            }

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