/** \file
 *  This OBJC source file was generated by $ANTLR version 3.3.1-SNAPSHOT Jan 30, 2011 08:28:24
 *
 *     -  From the grammar source file : PolyPrinter.g
 *     -                            On : 2011-01-30 08:45:32
 *     -           for the tree parser : PolyPrinterTreeParser *
 * Editing it, at least manually, is not wise. 
 *
 * ObjC language generator and runtime by Alan Condit, acondit|hereisanat|ipns|dotgoeshere|com.
 *
 *
*/
// [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.3.1-SNAPSHOT Jan 30, 2011 08:28:24 PolyPrinter.g 2011-01-30 08:45:32

/* -----------------------------------------
 * Include the ANTLR3 generated header file.
 */
#import <ST4/ST.h>
#import <ST4/STGroup.h>
#import "PolyPrinter.h"
/* ----------------------------------------- */


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

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



#pragma mark Bitsets
static ANTLRBitSet *FOLLOW_8_in_poly43;
static const unsigned long long FOLLOW_8_in_poly43_data[] = { 0x0000000000000004LL};
static ANTLRBitSet *FOLLOW_poly_in_poly48;
static const unsigned long long FOLLOW_poly_in_poly48_data[] = { 0x0000000000000370LL};
static ANTLRBitSet *FOLLOW_poly_in_poly52;
static const unsigned long long FOLLOW_poly_in_poly52_data[] = { 0x0000000000000008LL};
static ANTLRBitSet *FOLLOW_MULT_in_poly74;
static const unsigned long long FOLLOW_MULT_in_poly74_data[] = { 0x0000000000000004LL};
static ANTLRBitSet *FOLLOW_poly_in_poly78;
static const unsigned long long FOLLOW_poly_in_poly78_data[] = { 0x0000000000000370LL};
static ANTLRBitSet *FOLLOW_poly_in_poly82;
static const unsigned long long FOLLOW_poly_in_poly82_data[] = { 0x0000000000000008LL};
static ANTLRBitSet *FOLLOW_9_in_poly104;
static const unsigned long long FOLLOW_9_in_poly104_data[] = { 0x0000000000000004LL};
static ANTLRBitSet *FOLLOW_poly_in_poly109;
static const unsigned long long FOLLOW_poly_in_poly109_data[] = { 0x0000000000000370LL};
static ANTLRBitSet *FOLLOW_poly_in_poly113;
static const unsigned long long FOLLOW_poly_in_poly113_data[] = { 0x0000000000000008LL};
static ANTLRBitSet *FOLLOW_INT_in_poly134;
static const unsigned long long FOLLOW_INT_in_poly134_data[] = { 0x0000000000000002LL};
static ANTLRBitSet *FOLLOW_ID_in_poly148;
static const unsigned long long FOLLOW_ID_in_poly148_data[] = { 0x0000000000000002LL};


#pragma mark Dynamic Global Scopes

#pragma mark Dynamic Rule Scopes

#pragma mark Rule return scopes start
@implementation PolyPrinter_poly_return /* returnScope */
 /* start of synthesize -- OBJC-Line 1837 */
+ (PolyPrinter_poly_return *)newPolyPrinter_poly_return
{
    return [[[PolyPrinter_poly_return alloc] init] retain];
}

- (id) getTemplate { return st; }

//public StringTemplate st;
//public Object getTemplate() { return st; }
//public String toString() { return st==null?null:st.toString(); }

@end /* end of returnScope implementation */



@implementation PolyPrinter  // line 637

+ (void) initialize
{
    #pragma mark Bitsets
    FOLLOW_8_in_poly43 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_8_in_poly43_data Count:(NSUInteger)1] retain];
    FOLLOW_poly_in_poly48 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly48_data Count:(NSUInteger)1] retain];
    FOLLOW_poly_in_poly52 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly52_data Count:(NSUInteger)1] retain];
    FOLLOW_MULT_in_poly74 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_MULT_in_poly74_data Count:(NSUInteger)1] retain];
    FOLLOW_poly_in_poly78 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly78_data Count:(NSUInteger)1] retain];
    FOLLOW_poly_in_poly82 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly82_data Count:(NSUInteger)1] retain];
    FOLLOW_9_in_poly104 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_9_in_poly104_data Count:(NSUInteger)1] retain];
    FOLLOW_poly_in_poly109 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly109_data Count:(NSUInteger)1] retain];
    FOLLOW_poly_in_poly113 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_poly_in_poly113_data Count:(NSUInteger)1] retain];
    FOLLOW_INT_in_poly134 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_INT_in_poly134_data Count:(NSUInteger)1] retain];
    FOLLOW_ID_in_poly148 = [[ANTLRBitSet newBitSetWithBits:(const unsigned long long *)FOLLOW_ID_in_poly148_data Count:(NSUInteger)1] retain];

    [BaseRecognizer setTokenNames:[[NSArray arrayWithObjects:@"<invalid>", @"<EOR>", @"<DOWN>", @"<UP>", 
 @"MULT", @"INT", @"ID", @"WS", @"'+'", @"'^'", nil] retain]];
    [BaseRecognizer setGrammarFileName:@"PolyPrinter.g"];
}

+ (PolyPrinter *)newPolyPrinter:(id<TreeNodeStream>)aStream
{

    return [[PolyPrinter alloc] initWithStream:aStream];

}


- (id) initWithStream:(id<TreeNodeStream>)aStream
{
    if ((self = [super initWithStream:aStream State:[[RecognizerSharedState newRecognizerSharedStateWithRuleLen:1+1] retain]]) != nil) {


        /* start of actions-actionScope-init */
        /* start of init */
    }
    return self;
}

- (void) dealloc
{
    [super dealloc];
}

/* members */
 

/* start actions.actionScope.methods */
/* start methods() */
/*protected StringTemplateGroup templateLib = new StringTemplateGroup("PolyPrinterTemplates", AngleBracketTemplateLexer.class); */
STGroup *templateLib = [STGroup newSTGroup];

//public void setTemplateLib(StringTemplateGroup templateLib) {
//  this.templateLib = templateLib;
//}
//public StringTemplateGroup getTemplateLib() {
//  return templateLib;
//}
- (void) setTemplateLib:(STGroup *)aTemplateLib { templateLib = aTemplateLib; } 
- (STGroup *)getTemplateLib { return templateLib; } 
/** allows convenient multi-value initialization:
 *  "new STAttrMap().put(...).put(...)"
 */
/*
public static class STAttrMap extends HashMap {
  public STAttrMap put(String attrName, Object value) {
    super.put(attrName, value);
    return this;
  }
  public STAttrMap put(String attrName, int value) {
    super.put(attrName, new Integer(value));
    return this;
  }
}
 */
// start rules
/*
 * $ANTLR start poly
 * PolyPrinter.g:9:1: poly : ( ^( '+' a= poly b= poly ) -> template(a=$a.stb=$b.st) \"<a>+<b>\" | ^( MULT a= poly b= poly ) -> template(a=$a.stb=$b.st) \"<a><b>\" | ^( '^' a= poly b= poly ) -> template(a=$a.stb=$b.st) \"<a>^<b>\" | INT -> {%{$INT.text}} | ID -> {%{$ID.text}});
 */
- (PolyPrinter_poly_return *) poly
{
    /* ruleScopeSetUp */

    PolyPrinter_poly_return * retval = [PolyPrinter_poly_return newPolyPrinter_poly_return];
    [retval setStart:[input LT:1]];

    @try {
        CommonTree *INT1 = nil;
        CommonTree *ID2 = nil;
        PolyPrinter_poly_return * a = nil;

        PolyPrinter_poly_return * b = nil;


        // PolyPrinter.g:9:5: ( ^( '+' a= poly b= poly ) -> template(a=$a.stb=$b.st) \"<a>+<b>\" | ^( MULT a= poly b= poly ) -> template(a=$a.stb=$b.st) \"<a><b>\" | ^( '^' a= poly b= poly ) -> template(a=$a.stb=$b.st) \"<a>^<b>\" | INT -> {%{$INT.text}} | ID -> {%{$ID.text}}) //ruleblock
        NSInteger alt1=5;
        switch ([input LA:1]) {
            case 8: ;
                {
                alt1=1;
                }
                break;
            case MULT: ;
                {
                alt1=2;
                }
                break;
            case 9: ;
                {
                alt1=3;
                }
                break;
            case INT: ;
                {
                alt1=4;
                }
                break;
            case ID: ;
                {
                alt1=5;
                }
                break;

        default: ;
            NoViableAltException *nvae = [NoViableAltException newException:1 state:0 stream:input];
            @throw nvae;
        }

        switch (alt1) {
            case 1 : ;
                // PolyPrinter.g:9:7: ^( '+' a= poly b= poly ) // alt
                {
                [self match:input TokenType:8 Follow:FOLLOW_8_in_poly43]; 

                    [self match:input TokenType:DOWN Follow:nil]; 
                    /* ruleRef */
                    [self pushFollow:FOLLOW_poly_in_poly48];
                    a = [self poly];

                    [self popFollow];


                    /* ruleRef */
                    [self pushFollow:FOLLOW_poly_in_poly52];
                    b = [self poly];

                    [self popFollow];



                    [self match:input TokenType:UP Follow:nil]; 


                // TEMPLATE REWRITE
                // 9:29: -> template(a=$a.stb=$b.st) \"<a>+<b>\"
                {
                    retval.st = new StringTemplate(templateLib, "<a>+<b>",
                  new STAttrMap().put("a", (a!=nil?[a st]:nil)).put("b", (b!=nil?[b st]:nil)));
                }


                }
                break;
            case 2 : ;
                // PolyPrinter.g:10:4: ^( MULT a= poly b= poly ) // alt
                {
                [self match:input TokenType:MULT Follow:FOLLOW_MULT_in_poly74]; 

                    [self match:input TokenType:DOWN Follow:nil]; 
                    /* ruleRef */
                    [self pushFollow:FOLLOW_poly_in_poly78];
                    a = [self poly];

                    [self popFollow];


                    /* ruleRef */
                    [self pushFollow:FOLLOW_poly_in_poly82];
                    b = [self poly];

                    [self popFollow];



                    [self match:input TokenType:UP Follow:nil]; 


                // TEMPLATE REWRITE
                // 10:26: -> template(a=$a.stb=$b.st) \"<a><b>\"
                {
                    retval.st = new StringTemplate(templateLib, "<a><b>",
                  new STAttrMap().put("a", (a!=nil?[a st]:nil)).put("b", (b!=nil?[b st]:nil)));
                }


                }
                break;
            case 3 : ;
                // PolyPrinter.g:11:4: ^( '^' a= poly b= poly ) // alt
                {
                [self match:input TokenType:9 Follow:FOLLOW_9_in_poly104]; 

                    [self match:input TokenType:DOWN Follow:nil]; 
                    /* ruleRef */
                    [self pushFollow:FOLLOW_poly_in_poly109];
                    a = [self poly];

                    [self popFollow];


                    /* ruleRef */
                    [self pushFollow:FOLLOW_poly_in_poly113];
                    b = [self poly];

                    [self popFollow];



                    [self match:input TokenType:UP Follow:nil]; 


                // TEMPLATE REWRITE
                // 11:26: -> template(a=$a.stb=$b.st) \"<a>^<b>\"
                {
                    retval.st = [ST newST:@"<a>^<b>"];
                    [retval.st add:@"a" value:@"b"];
                }


                }
                break;
            case 4 : ;
                // PolyPrinter.g:12:4: INT // alt
                {
                INT1=(CommonTree *)[self match:input TokenType:INT Follow:FOLLOW_INT_in_poly134]; 


                // TEMPLATE REWRITE
                // 12:13: -> {%{$INT.text}}
                {
                    retval.st = [ST newST:(INT1!=nil?INT1.text:nil)];
                }


                }
                break;
            case 5 : ;
                // PolyPrinter.g:13:4: ID // alt
                {
                ID2=(CommonTree *)[self match:input TokenType:ID Follow:FOLLOW_ID_in_poly148]; 


                // TEMPLATE REWRITE
                // 13:12: -> {%{$ID.text}}
                {
                    retval.st = [ST newST:ID2!=nil?[ID2.text]:nil];
                }


                }
                break;

        }
        // token+rule list labels

    }
    @catch (RecognitionException *re) {
        [self reportError:re];
        [self recover:input Exception:re];
    }
    @finally {
    }
    return retval;
}
/* $ANTLR end poly */

@end /* end of PolyPrinter implementation line 692 */


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