public final GramaticaAst.expr_arith_return expr_arith() throws RecognitionException {
        GramaticaAst.expr_arith_return retval = new GramaticaAst.expr_arith_return();
        retval.start = input.LT(1);


        Object root_0 = null;

        Token MULT107=null;
        Token DIV108=null;
        Token MOD109=null;
        GramaticaAst.expr_minus_return l =null;

        GramaticaAst.expr_minus_return r =null;


        Object MULT107_tree=null;
        Object DIV108_tree=null;
        Object MOD109_tree=null;

        try {
            // compiler/ast/GramaticaAst.g:107:13: (l= expr_minus ( MULT ^r= expr_minus | DIV ^r= expr_minus | MOD ^r= expr_minus )* )
            // compiler/ast/GramaticaAst.g:107:15: l= expr_minus ( MULT ^r= expr_minus | DIV ^r= expr_minus | MOD ^r= expr_minus )*
            {
            root_0 = (Object)adaptor.nil();


            pushFollow(FOLLOW_expr_minus_in_expr_arith1025);
            l=expr_minus();

            state._fsp--;

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

            // compiler/ast/GramaticaAst.g:107:31: ( MULT ^r= expr_minus | DIV ^r= expr_minus | MOD ^r= expr_minus )*
            loop28:
            do {
                int alt28=4;
                switch ( input.LA(1) ) {
                case MULT:
                    {
                    alt28=1;
                    }
                    break;
                case DIV:
                    {
                    alt28=2;
                    }
                    break;
                case MOD:
                    {
                    alt28=3;
                    }
                    break;

                }

                switch (alt28) {
            	case 1 :
            	    // compiler/ast/GramaticaAst.g:107:32: MULT ^r= expr_minus
            	    {
            	    MULT107=(Token)match(input,MULT,FOLLOW_MULT_in_expr_arith1029); 
            	    MULT107_tree = 
            	    (Object)adaptor.create(MULT107)
            	    ;
            	    root_0 = (Object)adaptor.becomeRoot(MULT107_tree, root_0);


            	    pushFollow(FOLLOW_expr_minus_in_expr_arith1036);
            	    r=expr_minus();

            	    state._fsp--;

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

            	    }
            	    break;
            	case 2 :
            	    // compiler/ast/GramaticaAst.g:108:11: DIV ^r= expr_minus
            	    {
            	    DIV108=(Token)match(input,DIV,FOLLOW_DIV_in_expr_arith1049); 
            	    DIV108_tree = 
            	    (Object)adaptor.create(DIV108)
            	    ;
            	    root_0 = (Object)adaptor.becomeRoot(DIV108_tree, root_0);


            	    pushFollow(FOLLOW_expr_minus_in_expr_arith1056);
            	    r=expr_minus();

            	    state._fsp--;

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

            	    }
            	    break;
            	case 3 :
            	    // compiler/ast/GramaticaAst.g:109:11: MOD ^r= expr_minus
            	    {
            	    MOD109=(Token)match(input,MOD,FOLLOW_MOD_in_expr_arith1068); 
            	    MOD109_tree = 
            	    (Object)adaptor.create(MOD109)
            	    ;
            	    root_0 = (Object)adaptor.becomeRoot(MOD109_tree, root_0);


            	    pushFollow(FOLLOW_expr_minus_in_expr_arith1075);
            	    r=expr_minus();

            	    state._fsp--;

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

            	    }
            	    break;

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


            }

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