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

        Object root_0 = null;

        Token While91=null;
        Token Do93=null;
        Token End95=null;
        TLParser.expression_return expression92 = null;

        TLParser.block_return block94 = null;


        Object While91_tree=null;
        Object Do93_tree=null;
        Object End95_tree=null;
        RewriteRuleTokenStream stream_Do=new RewriteRuleTokenStream(adaptor,"token Do");
        RewriteRuleTokenStream stream_End=new RewriteRuleTokenStream(adaptor,"token End");
        RewriteRuleTokenStream stream_While=new RewriteRuleTokenStream(adaptor,"token While");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_block=new RewriteRuleSubtreeStream(adaptor,"rule block");
        try {
            // src/grammar/TL.g:120:3: ( While expression Do block End -> ^( While expression block ) )
            // src/grammar/TL.g:120:6: While expression Do block End
            {
            While91=(Token)match(input,While,FOLLOW_While_in_whileStatement811);  
            stream_While.add(While91);

            pushFollow(FOLLOW_expression_in_whileStatement813);
            expression92=expression();

            state._fsp--;

            stream_expression.add(expression92.getTree());
            Do93=(Token)match(input,Do,FOLLOW_Do_in_whileStatement815);  
            stream_Do.add(Do93);

            pushFollow(FOLLOW_block_in_whileStatement817);
            block94=block();

            state._fsp--;

            stream_block.add(block94.getTree());
            End95=(Token)match(input,End,FOLLOW_End_in_whileStatement819);  
            stream_End.add(End95);



            // AST REWRITE
            // elements: While, expression, block
            // 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();
            // 120:36: -> ^( While expression block )
            {
                // src/grammar/TL.g:120:39: ^( While expression block )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot(stream_While.nextNode(), root_1);

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