/** \file
 *  This OBJC source file was generated by $ANTLR version 3.2 Aug 20, 2010 15:00:19
 *
 *     -  From the grammar source file : /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g
 *     -                            On : 2010-08-20 15:03:14
 *     -                for the parser : TreeRewriteParserParser *
 * Editing it, at least manually, is not wise. 
 *
 * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
 *
 *
*/
// [The "BSD licence"]
// Copyright (c) 2010 Alan Condit
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
// 3. The name of the author may not be used to endorse or promote products
//    derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// $ANTLR 3.2 Aug 20, 2010 15:00:19 /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g 2010-08-20 15:03:14

/* -----------------------------------------
 * Include the ANTLR3 generated header file.
 */
#import "TreeRewriteParser.h"
/* ----------------------------------------- */


/* ============================================================================= */

/* =============================================================================
 * Start of recognizer
 */



#pragma mark Bitsets
static ANTLRBitSet *FOLLOW_INT_in_rule26;

const unsigned long long FOLLOW_INT_in_rule26_data[] = { 0x0000000000000010LL};

static ANTLRBitSet *FOLLOW_subrule_in_rule28;

const unsigned long long FOLLOW_subrule_in_rule28_data[] = { 0x0000000000000002LL};

static ANTLRBitSet *FOLLOW_INT_in_subrule53;

const unsigned long long FOLLOW_INT_in_subrule53_data[] = { 0x0000000000000002LL};



#pragma mark Dynamic Global Scopes

#pragma mark Dynamic Rule Scopes

#pragma mark Rule return scopes start
@implementation TreeRewriteParser_rule_return
@synthesize tree;
+ (TreeRewriteParser_rule_return *)newTreeRewriteParser_rule_return
{
    return [[[TreeRewriteParser_rule_return alloc] init] retain];
}

// returnScope.methods
- (ANTLRCommonTree *)getTree
{
    return tree;
}

- (void) setTree:(ANTLRCommonTree *)aTree
{
    if (tree != aTree) {
        if (tree != nil) [tree release];
        if (aTree != nil) [aTree retain];
        tree = aTree;
    }
}

- (void) dealloc
{
    [self setTree:nil];
    [super dealloc];
}




@end 

@implementation TreeRewriteParser_subrule_return
@synthesize tree;
+ (TreeRewriteParser_subrule_return *)newTreeRewriteParser_subrule_return
{
    return [[[TreeRewriteParser_subrule_return alloc] init] retain];
}

// returnScope.methods
- (ANTLRCommonTree *)getTree
{
    return tree;
}

- (void) setTree:(ANTLRCommonTree *)aTree
{
    if (tree != aTree) {
        if (tree != nil) [tree release];
        if (aTree != nil) [aTree retain];
        tree = aTree;
    }
}

- (void) dealloc
{
    [self setTree:nil];
    [super dealloc];
}




@end 



@implementation TreeRewriteParser  // line 610

+ (void) initialize
{
    FOLLOW_INT_in_rule26 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_rule26_data Count:(NSUInteger)1] retain];
    FOLLOW_subrule_in_rule28 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_subrule_in_rule28_data Count:(NSUInteger)1] retain];
    FOLLOW_INT_in_subrule53 = [[ANTLRBitSet newANTLRBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_subrule53_data Count:(NSUInteger)1] retain];

    [ANTLRBaseRecognizer setTokenNames:[[[NSArray alloc] initWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
 @"INT", @"WS", nil] retain]];
}

+ (TreeRewriteParser *)newTreeRewriteParser:(id<ANTLRTokenStream>)aStream
{
    return [[TreeRewriteParser alloc] initWithTokenStream:aStream];

}

- (id) initWithTokenStream:(id<ANTLRTokenStream>)aStream
{
    if ((self = [super initWithTokenStream:aStream State:[[ANTLRRecognizerSharedState newANTLRRecognizerSharedStateWithRuleLen:2+1] retain]]) != nil) {


                        
        // start of actions-actionScope-init
        // start of init
        // genericParser.init
        [self setTreeAdaptor:[[ANTLRCommonTreeAdaptor newANTLRCommonTreeAdaptor] retain]];
    }
    return self;
}

- (void) dealloc
{
    [self setTreeAdaptor:nil];

    [super dealloc];
}
// start actions.actionScope.methods
// start methods()
// genericParser.methods
// parserMethods
- (id<ANTLRTreeAdaptor>) getTreeAdaptor
{
	return treeAdaptor;
}

- (void) setTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor
{
	if (aTreeAdaptor != treeAdaptor) {
		treeAdaptor = aTreeAdaptor;
	}
}
// start rules
/*
 * $ANTLR start rule
 * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:8:1: rule : INT subrule -> ^( subrule INT ) ;
 */
- (TreeRewriteParser_rule_return *) rule
{
    // ruleScopeSetUp

    // ruleDeclarations
    TreeRewriteParser_rule_return * retval = [TreeRewriteParser_rule_return newTreeRewriteParser_rule_return];
    [retval setStart:[input LT:1]];

    ANTLRCommonTree *root_0 = nil;

    @try {
        // ruleLabelDefs
        id<ANTLRToken> INT1 = nil;
        TreeRewriteParser_subrule_return * subrule2 = nil;


        ANTLRCommonTree *INT1_tree=nil;
        ANTLRRewriteRuleTokenStream *stream_INT = 
            [[ANTLRRewriteRuleTokenStream newANTLRRewriteRuleTokenStream:treeAdaptor
                                                             description:@"token INT"] retain];
        ANTLRRewriteRuleSubtreeStream *stream_subrule = 
            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
                                                                description:@"rule subrule"] retain];
        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:8:5: ( INT subrule -> ^( subrule INT ) ) // ruleBlockSingleAlt
        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:8:7: INT subrule // alt
        {
        INT1=(id<ANTLRToken>)[self match:input TokenType:INT Follow:FOLLOW_INT_in_rule26];  
            [stream_INT addElement:INT1];
          /* element() */
        [self pushFollow:FOLLOW_subrule_in_rule28];
        subrule2 = [self subrule];
        [self popFollow];


        [stream_subrule addElement:[subrule2 getTree]];  /* element() */
         /* elements */

        // AST REWRITE
        // elements: INT, subrule
        // token labels: 
        // rule labels: retval
        // token list labels: 
        // rule list labels: 
        // wildcard labels: 
         [retval setTree:root_0];

        retval.tree = root_0;

        ANTLRRewriteRuleSubtreeStream *stream_retval =
            [[ANTLRRewriteRuleSubtreeStream newANTLRRewriteRuleSubtreeStream:treeAdaptor
                                                                description:@"token retval"
                                                                    element:retval!=nil?[retval getTree]:nil] retain];

        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];

        // 8:19: -> ^( subrule INT )
        {
            // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:8:22: ^( subrule INT )
            {
                ANTLRCommonTree *root_1 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];
                root_1 = (ANTLRCommonTree *)[treeAdaptor becomeRoot:(id<ANTLRTree>)[stream_subrule nextNode]
                                                                         old:root_1];

                 // TODO: args: 
                [treeAdaptor addChild:[stream_INT nextNode] toTree:root_1];

                [treeAdaptor addChild:root_1 toTree:root_0];
            }

        }

        retval.tree = root_0;

        }

        // token+rule list labels
        [retval setStop:[input LT:-1]];

        [stream_INT release];
        [stream_subrule release];

        retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
        [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];

    }
    @catch (ANTLRRecognitionException *re) {
        [self reportError:re];
        [self recover:input Exception:re];
        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];

    }    @finally {
    }
    return retval;
}
/* $ANTLR end rule */
/*
 * $ANTLR start subrule
 * /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:11:1: subrule : INT ;
 */
- (TreeRewriteParser_subrule_return *) subrule
{
    // ruleScopeSetUp

    // ruleDeclarations
    TreeRewriteParser_subrule_return * retval = [TreeRewriteParser_subrule_return newTreeRewriteParser_subrule_return];
    [retval setStart:[input LT:1]];

    ANTLRCommonTree *root_0 = nil;

    @try {
        // ruleLabelDefs
        id<ANTLRToken> INT3 = nil;

        ANTLRCommonTree *INT3_tree=nil;

        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:12:5: ( INT ) // ruleBlockSingleAlt
        // /usr/local/ANTLR3-ObjC2.0-Runtime/Framework/examples/treerewrite/TreeRewrite.g:12:9: INT // alt
        {
        root_0 = (ANTLRCommonTree *)[[[treeAdaptor class] newEmptyTree] retain];

        INT3=(id<ANTLRToken>)[self match:input TokenType:INT Follow:FOLLOW_INT_in_subrule53]; 
        INT3_tree = (ANTLRCommonTree *)[[treeAdaptor createTree:INT3] retain];
        [treeAdaptor addChild:INT3_tree  toTree:root_0];
          /* element() */
         /* elements */
        }

        // token+rule list labels
        [retval setStop:[input LT:-1]];


        retval.tree = (ANTLRCommonTree *)[treeAdaptor rulePostProcessing:root_0];
        [treeAdaptor setTokenBoundaries:retval.tree From:retval.startToken To:retval.stopToken];

    }
    @catch (ANTLRRecognitionException *re) {
        [self reportError:re];
        [self recover:input Exception:re];
        retval.tree = (ANTLRCommonTree *)[treeAdaptor errorNode:input From:retval.startToken To:[input LT:-1] Exception:re];

    }    @finally {
    }
    return retval;
}
/* $ANTLR end subrule */

@end /* end of TreeRewriteParser implementation line 669 */


/* End of code
 * =============================================================================
 */
