public final TLParser.forStatement_return forStatement() throws RecognitionException {
        TLParser.forStatement_return retval = new TLParser.forStatement_return();
        retval.start = input.LT(1);

        Object root_0 = null;

        Token For82=null;
        Token Identifier83=null;
        Token char_literal84=null;
        Token To86=null;
        Token Do88=null;
        Token End90=null;
        TLParser.expression_return expression85 = null;

        TLParser.expression_return expression87 = null;

        TLParser.block_return block89 = null;


        Object For82_tree=null;
        Object Identifier83_tree=null;
        Object char_literal84_tree=null;
        Object To86_tree=null;
        Object Do88_tree=null;
        Object End90_tree=null;
        RewriteRuleTokenStream stream_Do=new RewriteRuleTokenStream(adaptor,"token Do");
        RewriteRuleTokenStream stream_End=new RewriteRuleTokenStream(adaptor,"token End");
        RewriteRuleTokenStream stream_Assign=new RewriteRuleTokenStream(adaptor,"token Assign");
        RewriteRuleTokenStream stream_To=new RewriteRuleTokenStream(adaptor,"token To");
        RewriteRuleTokenStream stream_For=new RewriteRuleTokenStream(adaptor,"token For");
        RewriteRuleTokenStream stream_Identifier=new RewriteRuleTokenStream(adaptor,"token Identifier");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_block=new RewriteRuleSubtreeStream(adaptor,"rule block");
        try {
            // src/grammar/TL.g:115:3: ( For Identifier '=' expression To expression Do block End -> ^( For Identifier expression expression block ) )
            // src/grammar/TL.g:115:6: For Identifier '=' expression To expression Do block End
            {
            For82=(Token)match(input,For,FOLLOW_For_in_forStatement761);  
            stream_For.add(For82);

            Identifier83=(Token)match(input,Identifier,FOLLOW_Identifier_in_forStatement763);  
            stream_Identifier.add(Identifier83);

            char_literal84=(Token)match(input,Assign,FOLLOW_Assign_in_forStatement765);  
            stream_Assign.add(char_literal84);

            pushFollow(FOLLOW_expression_in_forStatement767);
            expression85=expression();

            state._fsp--;

            stream_expression.add(expression85.getTree());
            To86=(Token)match(input,To,FOLLOW_To_in_forStatement769);  
            stream_To.add(To86);

            pushFollow(FOLLOW_expression_in_forStatement771);
            expression87=expression();

            state._fsp--;

            stream_expression.add(expression87.getTree());
            Do88=(Token)match(input,Do,FOLLOW_Do_in_forStatement773);  
            stream_Do.add(Do88);

            pushFollow(FOLLOW_block_in_forStatement775);
            block89=block();

            state._fsp--;

            stream_block.add(block89.getTree());
            End90=(Token)match(input,End,FOLLOW_End_in_forStatement777);  
            stream_End.add(End90);



            // AST REWRITE
            // elements: expression, expression, Identifier, block, For
            // 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 = (Object)adaptor.nil();
            // 116:6: -> ^( For Identifier expression expression block )
            {
                // src/grammar/TL.g:116:9: ^( For Identifier expression expression block )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_For.nextNode(), root_1);

                adaptor.addChild(root_1, stream_Identifier.nextNode());
                adaptor.addChild(root_1, stream_expression.nextTree());
                adaptor.addChild(root_1, stream_expression.nextTree());
                adaptor.addChild(root_1, stream_block.nextTree());

                adaptor.addChild(root_0, root_1);
                }

            }

            retval.tree = root_0;
            }

            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 {
        }
        return retval;
    }