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

        Object root_0 = null;

        Token Else67=null;
        Token If68=null;
        Token Do70=null;
        TLParser.expression_return expression69 = null;

        TLParser.block_return block71 = null;


        Object Else67_tree=null;
        Object If68_tree=null;
        Object Do70_tree=null;
        RewriteRuleTokenStream stream_Do=new RewriteRuleTokenStream(adaptor,"token Do");
        RewriteRuleTokenStream stream_Else=new RewriteRuleTokenStream(adaptor,"token Else");
        RewriteRuleTokenStream stream_If=new RewriteRuleTokenStream(adaptor,"token If");
        RewriteRuleSubtreeStream stream_expression=new RewriteRuleSubtreeStream(adaptor,"rule expression");
        RewriteRuleSubtreeStream stream_block=new RewriteRuleSubtreeStream(adaptor,"rule block");
        try {
            // src/grammar/TL.g:102:3: ( Else If expression Do block -> ^( EXP expression block ) )
            // src/grammar/TL.g:102:6: Else If expression Do block
            {
            Else67=(Token)match(input,Else,FOLLOW_Else_in_elseIfStat668);  
            stream_Else.add(Else67);

            If68=(Token)match(input,If,FOLLOW_If_in_elseIfStat670);  
            stream_If.add(If68);

            pushFollow(FOLLOW_expression_in_elseIfStat672);
            expression69=expression();

            state._fsp--;

            stream_expression.add(expression69.getTree());
            Do70=(Token)match(input,Do,FOLLOW_Do_in_elseIfStat674);  
            stream_Do.add(Do70);

            pushFollow(FOLLOW_block_in_elseIfStat676);
            block71=block();

            state._fsp--;

            stream_block.add(block71.getTree());


            // AST REWRITE
            // elements: block, expression
            // 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();
            // 102:34: -> ^( EXP expression block )
            {
                // src/grammar/TL.g:102:37: ^( EXP expression block )
                {
                Object root_1 = (Object)adaptor.nil();
                root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(EXP, "EXP"), 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;
    }