// $ANTLR 3.5 org/antlr/grammar/v3/ANTLRTreePrinter.g 2015-07-21 19:37:10

package org.antlr.grammar.v3;
import org.antlr.tool.*;
import java.util.StringTokenizer;


import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;

/** Print out a grammar (no pretty printing).
 *
 *  Terence Parr
 *  University of San Francisco
 *  August 19, 2003
 */
@SuppressWarnings("all")
public class ANTLRTreePrinter extends TreeParser {
	public static final String[] tokenNames = new String[] {
		"<invalid>", "<EOR>", "<DOWN>", "<UP>", "ACTION", "ACTION_CHAR_LITERAL", 
		"ACTION_ESC", "ACTION_STRING_LITERAL", "ALT", "AMPERSAND", "ARG", "ARGLIST", 
		"ARG_ACTION", "ASSIGN", "BACKTRACK_SEMPRED", "BANG", "BLOCK", "CATCH", 
		"CHAR_LITERAL", "CHAR_RANGE", "CLOSE_ELEMENT_OPTION", "CLOSURE", "COLON", 
		"COMBINED_GRAMMAR", "COMMA", "COMMENT", "DIGIT", "DOC_COMMENT", "DOLLAR", 
		"DOT", "DOUBLE_ANGLE_STRING_LITERAL", "DOUBLE_QUOTE_STRING_LITERAL", "EOA", 
		"EOB", "EOR", "EPSILON", "ESC", "ETC", "FINALLY", "FORCED_ACTION", "FRAGMENT", 
		"GATED_SEMPRED", "GRAMMAR", "ID", "IMPLIES", "IMPORT", "INITACTION", "INT", 
		"LABEL", "LEXER", "LEXER_GRAMMAR", "LPAREN", "ML_COMMENT", "NESTED_ACTION", 
		"NESTED_ARG_ACTION", "NOT", "OPEN_ELEMENT_OPTION", "OPTIONAL", "OPTIONS", 
		"OR", "PARSER", "PARSER_GRAMMAR", "PLUS", "PLUS_ASSIGN", "POSITIVE_CLOSURE", 
		"PREC_RULE", "PRIVATE", "PROTECTED", "PUBLIC", "QUESTION", "RANGE", "RCURLY", 
		"RECURSIVE_RULE_REF", "RET", "RETURNS", "REWRITE", "REWRITES", "ROOT", 
		"RPAREN", "RULE", "RULE_REF", "SCOPE", "SEMI", "SEMPRED", "SL_COMMENT", 
		"SRC", "STAR", "STRAY_BRACKET", "STRING_LITERAL", "SYNPRED", "SYN_SEMPRED", 
		"TEMPLATE", "THROWS", "TOKENS", "TOKEN_REF", "TREE", "TREE_BEGIN", "TREE_GRAMMAR", 
		"WILDCARD", "WS", "WS_LOOP", "WS_OPT", "XDIGIT"
	};
	public static final int EOF=-1;
	public static final int ACTION=4;
	public static final int ACTION_CHAR_LITERAL=5;
	public static final int ACTION_ESC=6;
	public static final int ACTION_STRING_LITERAL=7;
	public static final int ALT=8;
	public static final int AMPERSAND=9;
	public static final int ARG=10;
	public static final int ARGLIST=11;
	public static final int ARG_ACTION=12;
	public static final int ASSIGN=13;
	public static final int BACKTRACK_SEMPRED=14;
	public static final int BANG=15;
	public static final int BLOCK=16;
	public static final int CATCH=17;
	public static final int CHAR_LITERAL=18;
	public static final int CHAR_RANGE=19;
	public static final int CLOSE_ELEMENT_OPTION=20;
	public static final int CLOSURE=21;
	public static final int COLON=22;
	public static final int COMBINED_GRAMMAR=23;
	public static final int COMMA=24;
	public static final int COMMENT=25;
	public static final int DIGIT=26;
	public static final int DOC_COMMENT=27;
	public static final int DOLLAR=28;
	public static final int DOT=29;
	public static final int DOUBLE_ANGLE_STRING_LITERAL=30;
	public static final int DOUBLE_QUOTE_STRING_LITERAL=31;
	public static final int EOA=32;
	public static final int EOB=33;
	public static final int EOR=34;
	public static final int EPSILON=35;
	public static final int ESC=36;
	public static final int ETC=37;
	public static final int FINALLY=38;
	public static final int FORCED_ACTION=39;
	public static final int FRAGMENT=40;
	public static final int GATED_SEMPRED=41;
	public static final int GRAMMAR=42;
	public static final int ID=43;
	public static final int IMPLIES=44;
	public static final int IMPORT=45;
	public static final int INITACTION=46;
	public static final int INT=47;
	public static final int LABEL=48;
	public static final int LEXER=49;
	public static final int LEXER_GRAMMAR=50;
	public static final int LPAREN=51;
	public static final int ML_COMMENT=52;
	public static final int NESTED_ACTION=53;
	public static final int NESTED_ARG_ACTION=54;
	public static final int NOT=55;
	public static final int OPEN_ELEMENT_OPTION=56;
	public static final int OPTIONAL=57;
	public static final int OPTIONS=58;
	public static final int OR=59;
	public static final int PARSER=60;
	public static final int PARSER_GRAMMAR=61;
	public static final int PLUS=62;
	public static final int PLUS_ASSIGN=63;
	public static final int POSITIVE_CLOSURE=64;
	public static final int PREC_RULE=65;
	public static final int PRIVATE=66;
	public static final int PROTECTED=67;
	public static final int PUBLIC=68;
	public static final int QUESTION=69;
	public static final int RANGE=70;
	public static final int RCURLY=71;
	public static final int RECURSIVE_RULE_REF=72;
	public static final int RET=73;
	public static final int RETURNS=74;
	public static final int REWRITE=75;
	public static final int REWRITES=76;
	public static final int ROOT=77;
	public static final int RPAREN=78;
	public static final int RULE=79;
	public static final int RULE_REF=80;
	public static final int SCOPE=81;
	public static final int SEMI=82;
	public static final int SEMPRED=83;
	public static final int SL_COMMENT=84;
	public static final int SRC=85;
	public static final int STAR=86;
	public static final int STRAY_BRACKET=87;
	public static final int STRING_LITERAL=88;
	public static final int SYNPRED=89;
	public static final int SYN_SEMPRED=90;
	public static final int TEMPLATE=91;
	public static final int THROWS=92;
	public static final int TOKENS=93;
	public static final int TOKEN_REF=94;
	public static final int TREE=95;
	public static final int TREE_BEGIN=96;
	public static final int TREE_GRAMMAR=97;
	public static final int WILDCARD=98;
	public static final int WS=99;
	public static final int WS_LOOP=100;
	public static final int WS_OPT=101;
	public static final int XDIGIT=102;

	// delegates
	public TreeParser[] getDelegates() {
		return new TreeParser[] {};
	}

	// delegators


	public ANTLRTreePrinter(TreeNodeStream input) {
		this(input, new RecognizerSharedState());
	}
	public ANTLRTreePrinter(TreeNodeStream input, RecognizerSharedState state) {
		super(input, state);
	}

	@Override public String[] getTokenNames() { return ANTLRTreePrinter.tokenNames; }
	@Override public String getGrammarFileName() { return "org/antlr/grammar/v3/ANTLRTreePrinter.g"; }


	protected Grammar grammar;
	protected boolean showActions;
	protected StringBuilder buf = new StringBuilder(300);

	private ANTLRTreePrinter.block_return block(GrammarAST t, boolean forceParens) throws RecognitionException {
	    ANTLRTreePrinter other = new ANTLRTreePrinter(new CommonTreeNodeStream(t));
	    other.buf = buf;
	    return other.block(forceParens);
	}

	public final int countAltsForBlock(GrammarAST t) {
	    int n = 0;
	    for ( int i = 0; i < t.getChildCount(); i++ )
	    {
	        if ( t.getChild(i).getType() == ALT )
	            n++;
	    }

	    return n;
	}

	public void out(String s) {
	    buf.append(s);
	}

	@Override
	public void reportError(RecognitionException ex) {
	    Token token = null;
	    if (ex instanceof MismatchedTokenException) {
	        token = ((MismatchedTokenException)ex).token;
	    } else if (ex instanceof NoViableAltException) {
	        token = ((NoViableAltException)ex).token;
	    }

	    ErrorManager.syntaxError(
	        ErrorManager.MSG_SYNTAX_ERROR,
	        grammar,
	        token,
	        "antlr.print: " + ex.toString(),
	        ex );
	}

	/** Normalize a grammar print out by removing all double spaces
	 *  and trailing/beginning stuff.  FOr example, convert
	 *
	 *  ( A  |  B  |  C )*
	 *
	 *  to
	 *
	 *  ( A | B | C )*
	 */
	public static String normalize(String g) {
	    StringTokenizer st = new StringTokenizer(g, " ", false);
	    StringBuffer buf = new StringBuffer();
	    while ( st.hasMoreTokens() ) {
	        String w = st.nextToken();
	        buf.append(w);
	        buf.append(" ");
	    }
	    return buf.toString().trim();
	}



	// $ANTLR start "toString"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:120:1: public toString[Grammar g, boolean showActions] returns [String s=null] : ( grammar_ | rule | alternative | element | single_rewrite | rewrite | EOR ) ;
	public final String toString(Grammar g, boolean showActions) throws RecognitionException {
		String s = null;



			grammar = g;
			this.showActions = showActions;

		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:125:2: ( ( grammar_ | rule | alternative | element | single_rewrite | rewrite | EOR ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:125:4: ( grammar_ | rule | alternative | element | single_rewrite | rewrite | EOR )
			{
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:125:4: ( grammar_ | rule | alternative | element | single_rewrite | rewrite | EOR )
			int alt1=7;
			switch ( input.LA(1) ) {
			case COMBINED_GRAMMAR:
			case LEXER_GRAMMAR:
			case PARSER_GRAMMAR:
			case TREE_GRAMMAR:
				{
				alt1=1;
				}
				break;
			case RULE:
				{
				alt1=2;
				}
				break;
			case ALT:
				{
				alt1=3;
				}
				break;
			case ACTION:
			case ASSIGN:
			case BACKTRACK_SEMPRED:
			case BANG:
			case BLOCK:
			case CHAR_LITERAL:
			case CHAR_RANGE:
			case CLOSURE:
			case DOT:
			case EPSILON:
			case FORCED_ACTION:
			case GATED_SEMPRED:
			case LABEL:
			case NOT:
			case OPTIONAL:
			case PLUS_ASSIGN:
			case POSITIVE_CLOSURE:
			case RANGE:
			case ROOT:
			case RULE_REF:
			case SEMPRED:
			case STRING_LITERAL:
			case SYNPRED:
			case SYN_SEMPRED:
			case TOKEN_REF:
			case TREE_BEGIN:
			case WILDCARD:
				{
				alt1=4;
				}
				break;
			case REWRITE:
				{
				alt1=5;
				}
				break;
			case EOF:
			case REWRITES:
				{
				alt1=6;
				}
				break;
			case EOR:
				{
				alt1=7;
				}
				break;
			default:
				NoViableAltException nvae =
					new NoViableAltException("", 1, 0, input);
				throw nvae;
			}
			switch (alt1) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:125:6: grammar_
					{
					pushFollow(FOLLOW_grammar__in_toString73);
					grammar_();
					state._fsp--;

					}
					break;
				case 2 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:126:5: rule
					{
					pushFollow(FOLLOW_rule_in_toString79);
					rule();
					state._fsp--;

					}
					break;
				case 3 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:127:5: alternative
					{
					pushFollow(FOLLOW_alternative_in_toString85);
					alternative();
					state._fsp--;

					}
					break;
				case 4 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:128:5: element
					{
					pushFollow(FOLLOW_element_in_toString91);
					element();
					state._fsp--;

					}
					break;
				case 5 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:129:5: single_rewrite
					{
					pushFollow(FOLLOW_single_rewrite_in_toString97);
					single_rewrite();
					state._fsp--;

					}
					break;
				case 6 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:130:5: rewrite
					{
					pushFollow(FOLLOW_rewrite_in_toString103);
					rewrite();
					state._fsp--;

					}
					break;
				case 7 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:131:5: EOR
					{
					match(input,EOR,FOLLOW_EOR_in_toString109); 
					}
					break;

			}

			return normalize(buf.toString());
			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
		return s;
	}
	// $ANTLR end "toString"



	// $ANTLR start "grammar_"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:138:1: grammar_ : ( ^( LEXER_GRAMMAR grammarSpec[\"lexer \" ] ) | ^( PARSER_GRAMMAR grammarSpec[\"parser \"] ) | ^( TREE_GRAMMAR grammarSpec[\"tree \"] ) | ^( COMBINED_GRAMMAR grammarSpec[\"\"] ) );
	public final void grammar_() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:139:2: ( ^( LEXER_GRAMMAR grammarSpec[\"lexer \" ] ) | ^( PARSER_GRAMMAR grammarSpec[\"parser \"] ) | ^( TREE_GRAMMAR grammarSpec[\"tree \"] ) | ^( COMBINED_GRAMMAR grammarSpec[\"\"] ) )
			int alt2=4;
			switch ( input.LA(1) ) {
			case LEXER_GRAMMAR:
				{
				alt2=1;
				}
				break;
			case PARSER_GRAMMAR:
				{
				alt2=2;
				}
				break;
			case TREE_GRAMMAR:
				{
				alt2=3;
				}
				break;
			case COMBINED_GRAMMAR:
				{
				alt2=4;
				}
				break;
			default:
				NoViableAltException nvae =
					new NoViableAltException("", 2, 0, input);
				throw nvae;
			}
			switch (alt2) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:139:4: ^( LEXER_GRAMMAR grammarSpec[\"lexer \" ] )
					{
					match(input,LEXER_GRAMMAR,FOLLOW_LEXER_GRAMMAR_in_grammar_133); 
					match(input, Token.DOWN, null); 
					pushFollow(FOLLOW_grammarSpec_in_grammar_135);
					grammarSpec("lexer ");
					state._fsp--;

					match(input, Token.UP, null); 

					}
					break;
				case 2 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:140:4: ^( PARSER_GRAMMAR grammarSpec[\"parser \"] )
					{
					match(input,PARSER_GRAMMAR,FOLLOW_PARSER_GRAMMAR_in_grammar_145); 
					match(input, Token.DOWN, null); 
					pushFollow(FOLLOW_grammarSpec_in_grammar_147);
					grammarSpec("parser ");
					state._fsp--;

					match(input, Token.UP, null); 

					}
					break;
				case 3 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:141:4: ^( TREE_GRAMMAR grammarSpec[\"tree \"] )
					{
					match(input,TREE_GRAMMAR,FOLLOW_TREE_GRAMMAR_in_grammar_157); 
					match(input, Token.DOWN, null); 
					pushFollow(FOLLOW_grammarSpec_in_grammar_159);
					grammarSpec("tree ");
					state._fsp--;

					match(input, Token.UP, null); 

					}
					break;
				case 4 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:142:4: ^( COMBINED_GRAMMAR grammarSpec[\"\"] )
					{
					match(input,COMBINED_GRAMMAR,FOLLOW_COMBINED_GRAMMAR_in_grammar_169); 
					match(input, Token.DOWN, null); 
					pushFollow(FOLLOW_grammarSpec_in_grammar_171);
					grammarSpec("");
					state._fsp--;

					match(input, Token.UP, null); 

					}
					break;

			}
		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "grammar_"



	// $ANTLR start "attrScope"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:145:1: attrScope : ^( 'scope' ID ( ruleAction )* ACTION ) ;
	public final void attrScope() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:146:2: ( ^( 'scope' ID ( ruleAction )* ACTION ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:146:4: ^( 'scope' ID ( ruleAction )* ACTION )
			{
			match(input,SCOPE,FOLLOW_SCOPE_in_attrScope187); 
			match(input, Token.DOWN, null); 
			match(input,ID,FOLLOW_ID_in_attrScope189); 
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:146:18: ( ruleAction )*
			loop3:
			while (true) {
				int alt3=2;
				int LA3_0 = input.LA(1);
				if ( (LA3_0==AMPERSAND) ) {
					alt3=1;
				}

				switch (alt3) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:146:18: ruleAction
					{
					pushFollow(FOLLOW_ruleAction_in_attrScope191);
					ruleAction();
					state._fsp--;

					}
					break;

				default :
					break loop3;
				}
			}

			match(input,ACTION,FOLLOW_ACTION_in_attrScope194); 
			match(input, Token.UP, null); 

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "attrScope"



	// $ANTLR start "grammarSpec"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:149:1: grammarSpec[String gtype] : id= ID (cmt= DOC_COMMENT )? ( optionsSpec )? ( delegateGrammars )? ( tokensSpec )? ( attrScope )* ( actions )? rules ;
	public final void grammarSpec(String gtype) throws RecognitionException {
		GrammarAST id=null;
		GrammarAST cmt=null;

		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:150:2: (id= ID (cmt= DOC_COMMENT )? ( optionsSpec )? ( delegateGrammars )? ( tokensSpec )? ( attrScope )* ( actions )? rules )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:150:4: id= ID (cmt= DOC_COMMENT )? ( optionsSpec )? ( delegateGrammars )? ( tokensSpec )? ( attrScope )* ( actions )? rules
			{
			id=(GrammarAST)match(input,ID,FOLLOW_ID_in_grammarSpec210); 
			out(gtype+"grammar "+(id!=null?id.getText():null));
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:151:3: (cmt= DOC_COMMENT )?
			int alt4=2;
			int LA4_0 = input.LA(1);
			if ( (LA4_0==DOC_COMMENT) ) {
				alt4=1;
			}
			switch (alt4) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:151:4: cmt= DOC_COMMENT
					{
					cmt=(GrammarAST)match(input,DOC_COMMENT,FOLLOW_DOC_COMMENT_in_grammarSpec219); 
					out((cmt!=null?cmt.getText():null)+"\n");
					}
					break;

			}

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:152:3: ( optionsSpec )?
			int alt5=2;
			int LA5_0 = input.LA(1);
			if ( (LA5_0==OPTIONS) ) {
				alt5=1;
			}
			switch (alt5) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:152:4: optionsSpec
					{
					pushFollow(FOLLOW_optionsSpec_in_grammarSpec229);
					optionsSpec();
					state._fsp--;

					}
					break;

			}

			out(";\n");
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:153:3: ( delegateGrammars )?
			int alt6=2;
			int LA6_0 = input.LA(1);
			if ( (LA6_0==IMPORT) ) {
				alt6=1;
			}
			switch (alt6) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:153:4: delegateGrammars
					{
					pushFollow(FOLLOW_delegateGrammars_in_grammarSpec238);
					delegateGrammars();
					state._fsp--;

					}
					break;

			}

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:154:3: ( tokensSpec )?
			int alt7=2;
			int LA7_0 = input.LA(1);
			if ( (LA7_0==TOKENS) ) {
				alt7=1;
			}
			switch (alt7) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:154:4: tokensSpec
					{
					pushFollow(FOLLOW_tokensSpec_in_grammarSpec245);
					tokensSpec();
					state._fsp--;

					}
					break;

			}

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:155:3: ( attrScope )*
			loop8:
			while (true) {
				int alt8=2;
				int LA8_0 = input.LA(1);
				if ( (LA8_0==SCOPE) ) {
					alt8=1;
				}

				switch (alt8) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:155:4: attrScope
					{
					pushFollow(FOLLOW_attrScope_in_grammarSpec252);
					attrScope();
					state._fsp--;

					}
					break;

				default :
					break loop8;
				}
			}

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:156:3: ( actions )?
			int alt9=2;
			int LA9_0 = input.LA(1);
			if ( (LA9_0==AMPERSAND) ) {
				alt9=1;
			}
			switch (alt9) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:156:4: actions
					{
					pushFollow(FOLLOW_actions_in_grammarSpec259);
					actions();
					state._fsp--;

					}
					break;

			}

			pushFollow(FOLLOW_rules_in_grammarSpec265);
			rules();
			state._fsp--;

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "grammarSpec"



	// $ANTLR start "actions"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:160:1: actions : ( action )+ ;
	public final void actions() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:161:2: ( ( action )+ )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:161:4: ( action )+
			{
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:161:4: ( action )+
			int cnt10=0;
			loop10:
			while (true) {
				int alt10=2;
				int LA10_0 = input.LA(1);
				if ( (LA10_0==AMPERSAND) ) {
					alt10=1;
				}

				switch (alt10) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:161:6: action
					{
					pushFollow(FOLLOW_action_in_actions278);
					action();
					state._fsp--;

					}
					break;

				default :
					if ( cnt10 >= 1 ) break loop10;
					EarlyExitException eee = new EarlyExitException(10, input);
					throw eee;
				}
				cnt10++;
			}

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "actions"



	// $ANTLR start "action"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:164:1: action : ^( AMPERSAND id1= ID (id2= ID a1= ACTION |a2= ACTION ) ) ;
	public final void action() throws RecognitionException {
		GrammarAST id1=null;
		GrammarAST id2=null;
		GrammarAST a1=null;
		GrammarAST a2=null;


			String scope=null, name=null;
			String action=null;

		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:169:2: ( ^( AMPERSAND id1= ID (id2= ID a1= ACTION |a2= ACTION ) ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:169:4: ^( AMPERSAND id1= ID (id2= ID a1= ACTION |a2= ACTION ) )
			{
			match(input,AMPERSAND,FOLLOW_AMPERSAND_in_action299); 
			match(input, Token.DOWN, null); 
			id1=(GrammarAST)match(input,ID,FOLLOW_ID_in_action303); 
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:170:4: (id2= ID a1= ACTION |a2= ACTION )
			int alt11=2;
			int LA11_0 = input.LA(1);
			if ( (LA11_0==ID) ) {
				alt11=1;
			}
			else if ( (LA11_0==ACTION) ) {
				alt11=2;
			}

			else {
				NoViableAltException nvae =
					new NoViableAltException("", 11, 0, input);
				throw nvae;
			}

			switch (alt11) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:170:6: id2= ID a1= ACTION
					{
					id2=(GrammarAST)match(input,ID,FOLLOW_ID_in_action312); 
					a1=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_action316); 
					scope=(id1!=null?id1.getText():null); name=(a1!=null?a1.getText():null); action=(a1!=null?a1.getText():null);
					}
					break;
				case 2 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:172:6: a2= ACTION
					{
					a2=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_action331); 
					scope=null; name=(id1!=null?id1.getText():null); action=(a2!=null?a2.getText():null);
					}
					break;

			}

			match(input, Token.UP, null); 


						if ( showActions )
						{
							out("@"+(scope!=null?scope+"::":"")+name+action);
						}
					
			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "action"



	// $ANTLR start "optionsSpec"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:184:1: optionsSpec : ^( OPTIONS ( option )+ ) ;
	public final void optionsSpec() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:185:2: ( ^( OPTIONS ( option )+ ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:185:4: ^( OPTIONS ( option )+ )
			{
			match(input,OPTIONS,FOLLOW_OPTIONS_in_optionsSpec363); 
			out(" options {");
			match(input, Token.DOWN, null); 
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:186:4: ( option )+
			int cnt12=0;
			loop12:
			while (true) {
				int alt12=2;
				int LA12_0 = input.LA(1);
				if ( (LA12_0==ASSIGN) ) {
					alt12=1;
				}

				switch (alt12) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:186:5: option
					{
					pushFollow(FOLLOW_option_in_optionsSpec371);
					option();
					state._fsp--;

					out("; ");
					}
					break;

				default :
					if ( cnt12 >= 1 ) break loop12;
					EarlyExitException eee = new EarlyExitException(12, input);
					throw eee;
				}
				cnt12++;
			}

			out("} ");
			match(input, Token.UP, null); 

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "optionsSpec"



	// $ANTLR start "option"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:191:1: option : ^( ASSIGN id= ID optionValue ) ;
	public final void option() throws RecognitionException {
		GrammarAST id=null;

		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:192:2: ( ^( ASSIGN id= ID optionValue ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:192:4: ^( ASSIGN id= ID optionValue )
			{
			match(input,ASSIGN,FOLLOW_ASSIGN_in_option397); 
			match(input, Token.DOWN, null); 
			id=(GrammarAST)match(input,ID,FOLLOW_ID_in_option401); 
			out((id!=null?id.getText():null)+"=");
			pushFollow(FOLLOW_optionValue_in_option405);
			optionValue();
			state._fsp--;

			match(input, Token.UP, null); 

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "option"



	// $ANTLR start "optionValue"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:195:1: optionValue : (id= ID |s= STRING_LITERAL |c= CHAR_LITERAL |i= INT );
	public final void optionValue() throws RecognitionException {
		GrammarAST id=null;
		GrammarAST s=null;
		GrammarAST c=null;
		GrammarAST i=null;

		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:196:2: (id= ID |s= STRING_LITERAL |c= CHAR_LITERAL |i= INT )
			int alt13=4;
			switch ( input.LA(1) ) {
			case ID:
				{
				alt13=1;
				}
				break;
			case STRING_LITERAL:
				{
				alt13=2;
				}
				break;
			case CHAR_LITERAL:
				{
				alt13=3;
				}
				break;
			case INT:
				{
				alt13=4;
				}
				break;
			default:
				NoViableAltException nvae =
					new NoViableAltException("", 13, 0, input);
				throw nvae;
			}
			switch (alt13) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:196:4: id= ID
					{
					id=(GrammarAST)match(input,ID,FOLLOW_ID_in_optionValue420); 
					out((id!=null?id.getText():null));
					}
					break;
				case 2 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:197:4: s= STRING_LITERAL
					{
					s=(GrammarAST)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_optionValue440); 
					out((s!=null?s.getText():null));
					}
					break;
				case 3 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:198:4: c= CHAR_LITERAL
					{
					c=(GrammarAST)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_optionValue449); 
					out((c!=null?c.getText():null));
					}
					break;
				case 4 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:199:4: i= INT
					{
					i=(GrammarAST)match(input,INT,FOLLOW_INT_in_optionValue460); 
					out((i!=null?i.getText():null));
					}
					break;

			}
		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "optionValue"



	// $ANTLR start "delegateGrammars"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:215:1: delegateGrammars : ^( 'import' ( ^( ASSIGN ID ID ) | ID )+ ) ;
	public final void delegateGrammars() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:216:2: ( ^( 'import' ( ^( ASSIGN ID ID ) | ID )+ ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:216:4: ^( 'import' ( ^( ASSIGN ID ID ) | ID )+ )
			{
			match(input,IMPORT,FOLLOW_IMPORT_in_delegateGrammars490); 
			match(input, Token.DOWN, null); 
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:216:16: ( ^( ASSIGN ID ID ) | ID )+
			int cnt14=0;
			loop14:
			while (true) {
				int alt14=3;
				int LA14_0 = input.LA(1);
				if ( (LA14_0==ASSIGN) ) {
					alt14=1;
				}
				else if ( (LA14_0==ID) ) {
					alt14=2;
				}

				switch (alt14) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:216:18: ^( ASSIGN ID ID )
					{
					match(input,ASSIGN,FOLLOW_ASSIGN_in_delegateGrammars495); 
					match(input, Token.DOWN, null); 
					match(input,ID,FOLLOW_ID_in_delegateGrammars497); 
					match(input,ID,FOLLOW_ID_in_delegateGrammars499); 
					match(input, Token.UP, null); 

					}
					break;
				case 2 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:216:36: ID
					{
					match(input,ID,FOLLOW_ID_in_delegateGrammars504); 
					}
					break;

				default :
					if ( cnt14 >= 1 ) break loop14;
					EarlyExitException eee = new EarlyExitException(14, input);
					throw eee;
				}
				cnt14++;
			}

			match(input, Token.UP, null); 

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "delegateGrammars"



	// $ANTLR start "tokensSpec"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:219:1: tokensSpec : ^( TOKENS ( tokenSpec )* ) ;
	public final void tokensSpec() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:220:2: ( ^( TOKENS ( tokenSpec )* ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:220:4: ^( TOKENS ( tokenSpec )* )
			{
			match(input,TOKENS,FOLLOW_TOKENS_in_tokensSpec521); 
			if ( input.LA(1)==Token.DOWN ) {
				match(input, Token.DOWN, null); 
				// org/antlr/grammar/v3/ANTLRTreePrinter.g:220:13: ( tokenSpec )*
				loop15:
				while (true) {
					int alt15=2;
					int LA15_0 = input.LA(1);
					if ( (LA15_0==ASSIGN||LA15_0==TOKEN_REF) ) {
						alt15=1;
					}

					switch (alt15) {
					case 1 :
						// org/antlr/grammar/v3/ANTLRTreePrinter.g:220:13: tokenSpec
						{
						pushFollow(FOLLOW_tokenSpec_in_tokensSpec523);
						tokenSpec();
						state._fsp--;

						}
						break;

					default :
						break loop15;
					}
				}

				match(input, Token.UP, null); 
			}

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "tokensSpec"



	// $ANTLR start "tokenSpec"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:223:1: tokenSpec : ( TOKEN_REF | ^( ASSIGN TOKEN_REF ( STRING_LITERAL | CHAR_LITERAL ) ) );
	public final void tokenSpec() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:224:2: ( TOKEN_REF | ^( ASSIGN TOKEN_REF ( STRING_LITERAL | CHAR_LITERAL ) ) )
			int alt16=2;
			int LA16_0 = input.LA(1);
			if ( (LA16_0==TOKEN_REF) ) {
				alt16=1;
			}
			else if ( (LA16_0==ASSIGN) ) {
				alt16=2;
			}

			else {
				NoViableAltException nvae =
					new NoViableAltException("", 16, 0, input);
				throw nvae;
			}

			switch (alt16) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:224:4: TOKEN_REF
					{
					match(input,TOKEN_REF,FOLLOW_TOKEN_REF_in_tokenSpec536); 
					}
					break;
				case 2 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:225:4: ^( ASSIGN TOKEN_REF ( STRING_LITERAL | CHAR_LITERAL ) )
					{
					match(input,ASSIGN,FOLLOW_ASSIGN_in_tokenSpec543); 
					match(input, Token.DOWN, null); 
					match(input,TOKEN_REF,FOLLOW_TOKEN_REF_in_tokenSpec545); 
					if ( input.LA(1)==CHAR_LITERAL||input.LA(1)==STRING_LITERAL ) {
						input.consume();
						state.errorRecovery=false;
					}
					else {
						MismatchedSetException mse = new MismatchedSetException(null,input);
						throw mse;
					}
					match(input, Token.UP, null); 

					}
					break;

			}
		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "tokenSpec"



	// $ANTLR start "rules"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:228:1: rules : ( rule | precRule )+ ;
	public final void rules() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:229:2: ( ( rule | precRule )+ )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:229:4: ( rule | precRule )+
			{
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:229:4: ( rule | precRule )+
			int cnt17=0;
			loop17:
			while (true) {
				int alt17=3;
				int LA17_0 = input.LA(1);
				if ( (LA17_0==RULE) ) {
					alt17=1;
				}
				else if ( (LA17_0==PREC_RULE) ) {
					alt17=2;
				}

				switch (alt17) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:229:6: rule
					{
					pushFollow(FOLLOW_rule_in_rules566);
					rule();
					state._fsp--;

					}
					break;
				case 2 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:229:13: precRule
					{
					pushFollow(FOLLOW_precRule_in_rules570);
					precRule();
					state._fsp--;

					}
					break;

				default :
					if ( cnt17 >= 1 ) break loop17;
					EarlyExitException eee = new EarlyExitException(17, input);
					throw eee;
				}
				cnt17++;
			}

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "rules"



	// $ANTLR start "rule"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:232:1: rule : ^( RULE id= ID ( modifier )? ^( ARG (arg= ARG_ACTION )? ) ^( RET (ret= ARG_ACTION )? ) ( throwsSpec )? ( optionsSpec )? ( ruleScopeSpec )? ( ruleAction )* b= block[false] ( exceptionGroup )? EOR ) ;
	public final void rule() throws RecognitionException {
		GrammarAST id=null;
		GrammarAST arg=null;
		GrammarAST ret=null;
		TreeRuleReturnScope b =null;

		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:233:2: ( ^( RULE id= ID ( modifier )? ^( ARG (arg= ARG_ACTION )? ) ^( RET (ret= ARG_ACTION )? ) ( throwsSpec )? ( optionsSpec )? ( ruleScopeSpec )? ( ruleAction )* b= block[false] ( exceptionGroup )? EOR ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:233:4: ^( RULE id= ID ( modifier )? ^( ARG (arg= ARG_ACTION )? ) ^( RET (ret= ARG_ACTION )? ) ( throwsSpec )? ( optionsSpec )? ( ruleScopeSpec )? ( ruleAction )* b= block[false] ( exceptionGroup )? EOR )
			{
			match(input,RULE,FOLLOW_RULE_in_rule586); 
			match(input, Token.DOWN, null); 
			id=(GrammarAST)match(input,ID,FOLLOW_ID_in_rule590); 
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:234:4: ( modifier )?
			int alt18=2;
			int LA18_0 = input.LA(1);
			if ( (LA18_0==FRAGMENT||(LA18_0 >= PRIVATE && LA18_0 <= PUBLIC)) ) {
				alt18=1;
			}
			switch (alt18) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:234:5: modifier
					{
					pushFollow(FOLLOW_modifier_in_rule596);
					modifier();
					state._fsp--;

					}
					break;

			}

			out((id!=null?id.getText():null));
			match(input,ARG,FOLLOW_ARG_in_rule609); 
			if ( input.LA(1)==Token.DOWN ) {
				match(input, Token.DOWN, null); 
				// org/antlr/grammar/v3/ANTLRTreePrinter.g:236:10: (arg= ARG_ACTION )?
				int alt19=2;
				int LA19_0 = input.LA(1);
				if ( (LA19_0==ARG_ACTION) ) {
					alt19=1;
				}
				switch (alt19) {
					case 1 :
						// org/antlr/grammar/v3/ANTLRTreePrinter.g:236:11: arg= ARG_ACTION
						{
						arg=(GrammarAST)match(input,ARG_ACTION,FOLLOW_ARG_ACTION_in_rule614); 
						out("["+(arg!=null?arg.getText():null)+"]");
						}
						break;

				}

				match(input, Token.UP, null); 
			}

			match(input,RET,FOLLOW_RET_in_rule627); 
			if ( input.LA(1)==Token.DOWN ) {
				match(input, Token.DOWN, null); 
				// org/antlr/grammar/v3/ANTLRTreePrinter.g:237:10: (ret= ARG_ACTION )?
				int alt20=2;
				int LA20_0 = input.LA(1);
				if ( (LA20_0==ARG_ACTION) ) {
					alt20=1;
				}
				switch (alt20) {
					case 1 :
						// org/antlr/grammar/v3/ANTLRTreePrinter.g:237:11: ret= ARG_ACTION
						{
						ret=(GrammarAST)match(input,ARG_ACTION,FOLLOW_ARG_ACTION_in_rule632); 
						out(" returns ["+(ret!=null?ret.getText():null)+"]");
						}
						break;

				}

				match(input, Token.UP, null); 
			}

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:238:4: ( throwsSpec )?
			int alt21=2;
			int LA21_0 = input.LA(1);
			if ( (LA21_0==THROWS) ) {
				alt21=1;
			}
			switch (alt21) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:238:5: throwsSpec
					{
					pushFollow(FOLLOW_throwsSpec_in_rule645);
					throwsSpec();
					state._fsp--;

					}
					break;

			}

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:239:4: ( optionsSpec )?
			int alt22=2;
			int LA22_0 = input.LA(1);
			if ( (LA22_0==OPTIONS) ) {
				alt22=1;
			}
			switch (alt22) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:239:5: optionsSpec
					{
					pushFollow(FOLLOW_optionsSpec_in_rule653);
					optionsSpec();
					state._fsp--;

					}
					break;

			}

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:240:4: ( ruleScopeSpec )?
			int alt23=2;
			int LA23_0 = input.LA(1);
			if ( (LA23_0==SCOPE) ) {
				alt23=1;
			}
			switch (alt23) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:240:5: ruleScopeSpec
					{
					pushFollow(FOLLOW_ruleScopeSpec_in_rule661);
					ruleScopeSpec();
					state._fsp--;

					}
					break;

			}

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:241:4: ( ruleAction )*
			loop24:
			while (true) {
				int alt24=2;
				int LA24_0 = input.LA(1);
				if ( (LA24_0==AMPERSAND) ) {
					alt24=1;
				}

				switch (alt24) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:241:5: ruleAction
					{
					pushFollow(FOLLOW_ruleAction_in_rule669);
					ruleAction();
					state._fsp--;

					}
					break;

				default :
					break loop24;
				}
			}

			out(" :");

							if ( input.LA(5) == NOT || input.LA(5) == ASSIGN )
								out(" ");
						
			pushFollow(FOLLOW_block_in_rule688);
			b=block(false);
			state._fsp--;

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:248:4: ( exceptionGroup )?
			int alt25=2;
			int LA25_0 = input.LA(1);
			if ( (LA25_0==CATCH||LA25_0==FINALLY) ) {
				alt25=1;
			}
			switch (alt25) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:248:5: exceptionGroup
					{
					pushFollow(FOLLOW_exceptionGroup_in_rule695);
					exceptionGroup();
					state._fsp--;

					}
					break;

			}

			match(input,EOR,FOLLOW_EOR_in_rule702); 
			out(";\n");
			match(input, Token.UP, null); 

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "rule"



	// $ANTLR start "precRule"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:253:1: precRule : ^( PREC_RULE id= ID ( modifier )? ^( ARG (arg= ARG_ACTION )? ) ^( RET (ret= ARG_ACTION )? ) ( throwsSpec )? ( optionsSpec )? ( ruleScopeSpec )? ( ruleAction )* b= block[false] ( exceptionGroup )? EOR ) ;
	public final void precRule() throws RecognitionException {
		GrammarAST id=null;
		GrammarAST arg=null;
		GrammarAST ret=null;
		TreeRuleReturnScope b =null;

		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:254:2: ( ^( PREC_RULE id= ID ( modifier )? ^( ARG (arg= ARG_ACTION )? ) ^( RET (ret= ARG_ACTION )? ) ( throwsSpec )? ( optionsSpec )? ( ruleScopeSpec )? ( ruleAction )* b= block[false] ( exceptionGroup )? EOR ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:254:4: ^( PREC_RULE id= ID ( modifier )? ^( ARG (arg= ARG_ACTION )? ) ^( RET (ret= ARG_ACTION )? ) ( throwsSpec )? ( optionsSpec )? ( ruleScopeSpec )? ( ruleAction )* b= block[false] ( exceptionGroup )? EOR )
			{
			match(input,PREC_RULE,FOLLOW_PREC_RULE_in_precRule721); 
			match(input, Token.DOWN, null); 
			id=(GrammarAST)match(input,ID,FOLLOW_ID_in_precRule725); 
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:255:4: ( modifier )?
			int alt26=2;
			int LA26_0 = input.LA(1);
			if ( (LA26_0==FRAGMENT||(LA26_0 >= PRIVATE && LA26_0 <= PUBLIC)) ) {
				alt26=1;
			}
			switch (alt26) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:255:5: modifier
					{
					pushFollow(FOLLOW_modifier_in_precRule731);
					modifier();
					state._fsp--;

					}
					break;

			}

			out((id!=null?id.getText():null));
			match(input,ARG,FOLLOW_ARG_in_precRule744); 
			if ( input.LA(1)==Token.DOWN ) {
				match(input, Token.DOWN, null); 
				// org/antlr/grammar/v3/ANTLRTreePrinter.g:257:10: (arg= ARG_ACTION )?
				int alt27=2;
				int LA27_0 = input.LA(1);
				if ( (LA27_0==ARG_ACTION) ) {
					alt27=1;
				}
				switch (alt27) {
					case 1 :
						// org/antlr/grammar/v3/ANTLRTreePrinter.g:257:11: arg= ARG_ACTION
						{
						arg=(GrammarAST)match(input,ARG_ACTION,FOLLOW_ARG_ACTION_in_precRule749); 
						out("["+(arg!=null?arg.getText():null)+"]");
						}
						break;

				}

				match(input, Token.UP, null); 
			}

			match(input,RET,FOLLOW_RET_in_precRule762); 
			if ( input.LA(1)==Token.DOWN ) {
				match(input, Token.DOWN, null); 
				// org/antlr/grammar/v3/ANTLRTreePrinter.g:258:10: (ret= ARG_ACTION )?
				int alt28=2;
				int LA28_0 = input.LA(1);
				if ( (LA28_0==ARG_ACTION) ) {
					alt28=1;
				}
				switch (alt28) {
					case 1 :
						// org/antlr/grammar/v3/ANTLRTreePrinter.g:258:11: ret= ARG_ACTION
						{
						ret=(GrammarAST)match(input,ARG_ACTION,FOLLOW_ARG_ACTION_in_precRule767); 
						out(" returns ["+(ret!=null?ret.getText():null)+"]");
						}
						break;

				}

				match(input, Token.UP, null); 
			}

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:259:4: ( throwsSpec )?
			int alt29=2;
			int LA29_0 = input.LA(1);
			if ( (LA29_0==THROWS) ) {
				alt29=1;
			}
			switch (alt29) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:259:5: throwsSpec
					{
					pushFollow(FOLLOW_throwsSpec_in_precRule780);
					throwsSpec();
					state._fsp--;

					}
					break;

			}

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:260:4: ( optionsSpec )?
			int alt30=2;
			int LA30_0 = input.LA(1);
			if ( (LA30_0==OPTIONS) ) {
				alt30=1;
			}
			switch (alt30) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:260:5: optionsSpec
					{
					pushFollow(FOLLOW_optionsSpec_in_precRule788);
					optionsSpec();
					state._fsp--;

					}
					break;

			}

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:261:4: ( ruleScopeSpec )?
			int alt31=2;
			int LA31_0 = input.LA(1);
			if ( (LA31_0==SCOPE) ) {
				alt31=1;
			}
			switch (alt31) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:261:5: ruleScopeSpec
					{
					pushFollow(FOLLOW_ruleScopeSpec_in_precRule796);
					ruleScopeSpec();
					state._fsp--;

					}
					break;

			}

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:262:4: ( ruleAction )*
			loop32:
			while (true) {
				int alt32=2;
				int LA32_0 = input.LA(1);
				if ( (LA32_0==AMPERSAND) ) {
					alt32=1;
				}

				switch (alt32) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:262:5: ruleAction
					{
					pushFollow(FOLLOW_ruleAction_in_precRule804);
					ruleAction();
					state._fsp--;

					}
					break;

				default :
					break loop32;
				}
			}

			out(" :");

							if ( input.LA(5) == NOT || input.LA(5) == ASSIGN )
								out(" ");
						
			pushFollow(FOLLOW_block_in_precRule823);
			b=block(false);
			state._fsp--;

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:269:4: ( exceptionGroup )?
			int alt33=2;
			int LA33_0 = input.LA(1);
			if ( (LA33_0==CATCH||LA33_0==FINALLY) ) {
				alt33=1;
			}
			switch (alt33) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:269:5: exceptionGroup
					{
					pushFollow(FOLLOW_exceptionGroup_in_precRule830);
					exceptionGroup();
					state._fsp--;

					}
					break;

			}

			match(input,EOR,FOLLOW_EOR_in_precRule837); 
			out(";\n");
			match(input, Token.UP, null); 

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "precRule"



	// $ANTLR start "ruleAction"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:274:1: ruleAction : ^( AMPERSAND id= ID a= ACTION ) ;
	public final void ruleAction() throws RecognitionException {
		GrammarAST id=null;
		GrammarAST a=null;

		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:275:2: ( ^( AMPERSAND id= ID a= ACTION ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:275:4: ^( AMPERSAND id= ID a= ACTION )
			{
			match(input,AMPERSAND,FOLLOW_AMPERSAND_in_ruleAction855); 
			match(input, Token.DOWN, null); 
			id=(GrammarAST)match(input,ID,FOLLOW_ID_in_ruleAction859); 
			a=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_ruleAction863); 
			match(input, Token.UP, null); 

			if ( showActions ) out("@"+(id!=null?id.getText():null)+"{"+(a!=null?a.getText():null)+"}");
			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "ruleAction"


	public static class modifier_return extends TreeRuleReturnScope {
	};


	// $ANTLR start "modifier"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:279:1: modifier : ( 'protected' | 'public' | 'private' | 'fragment' );
	public final ANTLRTreePrinter.modifier_return modifier() throws RecognitionException {
		ANTLRTreePrinter.modifier_return retval = new ANTLRTreePrinter.modifier_return();
		retval.start = input.LT(1);

		out(((GrammarAST)retval.start).getText()); out(" ");
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:282:2: ( 'protected' | 'public' | 'private' | 'fragment' )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:
			{
			if ( input.LA(1)==FRAGMENT||(input.LA(1) >= PRIVATE && input.LA(1) <= PUBLIC) ) {
				input.consume();
				state.errorRecovery=false;
			}
			else {
				MismatchedSetException mse = new MismatchedSetException(null,input);
				throw mse;
			}
			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "modifier"



	// $ANTLR start "throwsSpec"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:288:1: throwsSpec : ^( 'throws' ( ID )+ ) ;
	public final void throwsSpec() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:289:2: ( ^( 'throws' ( ID )+ ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:289:4: ^( 'throws' ( ID )+ )
			{
			match(input,THROWS,FOLLOW_THROWS_in_throwsSpec912); 
			match(input, Token.DOWN, null); 
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:289:15: ( ID )+
			int cnt34=0;
			loop34:
			while (true) {
				int alt34=2;
				int LA34_0 = input.LA(1);
				if ( (LA34_0==ID) ) {
					alt34=1;
				}

				switch (alt34) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:289:15: ID
					{
					match(input,ID,FOLLOW_ID_in_throwsSpec914); 
					}
					break;

				default :
					if ( cnt34 >= 1 ) break loop34;
					EarlyExitException eee = new EarlyExitException(34, input);
					throw eee;
				}
				cnt34++;
			}

			match(input, Token.UP, null); 

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "throwsSpec"



	// $ANTLR start "ruleScopeSpec"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:292:1: ruleScopeSpec : ^( 'scope' ( ruleAction )* ( ACTION )? ( ID )* ) ;
	public final void ruleScopeSpec() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:293:2: ( ^( 'scope' ( ruleAction )* ( ACTION )? ( ID )* ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:293:4: ^( 'scope' ( ruleAction )* ( ACTION )? ( ID )* )
			{
			match(input,SCOPE,FOLLOW_SCOPE_in_ruleScopeSpec929); 
			if ( input.LA(1)==Token.DOWN ) {
				match(input, Token.DOWN, null); 
				// org/antlr/grammar/v3/ANTLRTreePrinter.g:293:15: ( ruleAction )*
				loop35:
				while (true) {
					int alt35=2;
					int LA35_0 = input.LA(1);
					if ( (LA35_0==AMPERSAND) ) {
						alt35=1;
					}

					switch (alt35) {
					case 1 :
						// org/antlr/grammar/v3/ANTLRTreePrinter.g:293:15: ruleAction
						{
						pushFollow(FOLLOW_ruleAction_in_ruleScopeSpec931);
						ruleAction();
						state._fsp--;

						}
						break;

					default :
						break loop35;
					}
				}

				// org/antlr/grammar/v3/ANTLRTreePrinter.g:293:27: ( ACTION )?
				int alt36=2;
				int LA36_0 = input.LA(1);
				if ( (LA36_0==ACTION) ) {
					alt36=1;
				}
				switch (alt36) {
					case 1 :
						// org/antlr/grammar/v3/ANTLRTreePrinter.g:293:28: ACTION
						{
						match(input,ACTION,FOLLOW_ACTION_in_ruleScopeSpec935); 
						}
						break;

				}

				// org/antlr/grammar/v3/ANTLRTreePrinter.g:293:37: ( ID )*
				loop37:
				while (true) {
					int alt37=2;
					int LA37_0 = input.LA(1);
					if ( (LA37_0==ID) ) {
						alt37=1;
					}

					switch (alt37) {
					case 1 :
						// org/antlr/grammar/v3/ANTLRTreePrinter.g:293:39: ID
						{
						match(input,ID,FOLLOW_ID_in_ruleScopeSpec941); 
						}
						break;

					default :
						break loop37;
					}
				}

				match(input, Token.UP, null); 
			}

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "ruleScopeSpec"


	public static class block_return extends TreeRuleReturnScope {
	};


	// $ANTLR start "block"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:296:1: block[boolean forceParens] : ^( BLOCK ( optionsSpec )? alternative rewrite ( alternative rewrite )* EOB ) ;
	public final ANTLRTreePrinter.block_return block(boolean forceParens) throws RecognitionException {
		ANTLRTreePrinter.block_return retval = new ANTLRTreePrinter.block_return();
		retval.start = input.LT(1);


		int numAlts = countAltsForBlock(((GrammarAST)retval.start));

		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:301:2: ( ^( BLOCK ( optionsSpec )? alternative rewrite ( alternative rewrite )* EOB ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:301:4: ^( BLOCK ( optionsSpec )? alternative rewrite ( alternative rewrite )* EOB )
			{
			match(input,BLOCK,FOLLOW_BLOCK_in_block965); 

							if ( forceParens||numAlts>1 )
							{
								//for ( Antlr.Runtime.Tree.Tree parent = ((GrammarAST)retval.start).getParent(); parent != null && parent.getType() != RULE; parent = parent.getParent() )
								//{
								//	if ( parent.getType() == BLOCK && countAltsForBlock((GrammarAST)parent) > 1 )
								//	{
								//		out(" ");
								//		break;
								//	}
								//}
								out(" (");
							}
						
			match(input, Token.DOWN, null); 
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:316:4: ( optionsSpec )?
			int alt38=2;
			int LA38_0 = input.LA(1);
			if ( (LA38_0==OPTIONS) ) {
				alt38=1;
			}
			switch (alt38) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:316:5: optionsSpec
					{
					pushFollow(FOLLOW_optionsSpec_in_block976);
					optionsSpec();
					state._fsp--;

					out(" :");
					}
					break;

			}

			pushFollow(FOLLOW_alternative_in_block986);
			alternative();
			state._fsp--;

			pushFollow(FOLLOW_rewrite_in_block988);
			rewrite();
			state._fsp--;

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:317:24: ( alternative rewrite )*
			loop39:
			while (true) {
				int alt39=2;
				int LA39_0 = input.LA(1);
				if ( (LA39_0==ALT) ) {
					alt39=1;
				}

				switch (alt39) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:317:26: alternative rewrite
					{
					out("|");
					pushFollow(FOLLOW_alternative_in_block994);
					alternative();
					state._fsp--;

					pushFollow(FOLLOW_rewrite_in_block996);
					rewrite();
					state._fsp--;

					}
					break;

				default :
					break loop39;
				}
			}

			match(input,EOB,FOLLOW_EOB_in_block1004); 
			if ( forceParens||numAlts>1 ) out(")");
			match(input, Token.UP, null); 

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "block"



	// $ANTLR start "alternative"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:322:1: alternative : ^( ALT ( element )* EOA ) ;
	public final void alternative() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:323:2: ( ^( ALT ( element )* EOA ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:323:4: ^( ALT ( element )* EOA )
			{
			match(input,ALT,FOLLOW_ALT_in_alternative1026); 
			match(input, Token.DOWN, null); 
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:323:11: ( element )*
			loop40:
			while (true) {
				int alt40=2;
				int LA40_0 = input.LA(1);
				if ( (LA40_0==ACTION||(LA40_0 >= ASSIGN && LA40_0 <= BLOCK)||(LA40_0 >= CHAR_LITERAL && LA40_0 <= CHAR_RANGE)||LA40_0==CLOSURE||LA40_0==DOT||LA40_0==EPSILON||LA40_0==FORCED_ACTION||LA40_0==GATED_SEMPRED||LA40_0==LABEL||LA40_0==NOT||LA40_0==OPTIONAL||(LA40_0 >= PLUS_ASSIGN && LA40_0 <= POSITIVE_CLOSURE)||LA40_0==RANGE||LA40_0==ROOT||LA40_0==RULE_REF||LA40_0==SEMPRED||(LA40_0 >= STRING_LITERAL && LA40_0 <= SYN_SEMPRED)||LA40_0==TOKEN_REF||LA40_0==TREE_BEGIN||LA40_0==WILDCARD) ) {
					alt40=1;
				}

				switch (alt40) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:323:11: element
					{
					pushFollow(FOLLOW_element_in_alternative1028);
					element();
					state._fsp--;

					}
					break;

				default :
					break loop40;
				}
			}

			match(input,EOA,FOLLOW_EOA_in_alternative1031); 
			match(input, Token.UP, null); 

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "alternative"



	// $ANTLR start "exceptionGroup"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:326:1: exceptionGroup : ( ( exceptionHandler )+ ( finallyClause )? | finallyClause );
	public final void exceptionGroup() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:327:2: ( ( exceptionHandler )+ ( finallyClause )? | finallyClause )
			int alt43=2;
			int LA43_0 = input.LA(1);
			if ( (LA43_0==CATCH) ) {
				alt43=1;
			}
			else if ( (LA43_0==FINALLY) ) {
				alt43=2;
			}

			else {
				NoViableAltException nvae =
					new NoViableAltException("", 43, 0, input);
				throw nvae;
			}

			switch (alt43) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:327:4: ( exceptionHandler )+ ( finallyClause )?
					{
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:327:4: ( exceptionHandler )+
					int cnt41=0;
					loop41:
					while (true) {
						int alt41=2;
						int LA41_0 = input.LA(1);
						if ( (LA41_0==CATCH) ) {
							alt41=1;
						}

						switch (alt41) {
						case 1 :
							// org/antlr/grammar/v3/ANTLRTreePrinter.g:327:6: exceptionHandler
							{
							pushFollow(FOLLOW_exceptionHandler_in_exceptionGroup1046);
							exceptionHandler();
							state._fsp--;

							}
							break;

						default :
							if ( cnt41 >= 1 ) break loop41;
							EarlyExitException eee = new EarlyExitException(41, input);
							throw eee;
						}
						cnt41++;
					}

					// org/antlr/grammar/v3/ANTLRTreePrinter.g:327:26: ( finallyClause )?
					int alt42=2;
					int LA42_0 = input.LA(1);
					if ( (LA42_0==FINALLY) ) {
						alt42=1;
					}
					switch (alt42) {
						case 1 :
							// org/antlr/grammar/v3/ANTLRTreePrinter.g:327:27: finallyClause
							{
							pushFollow(FOLLOW_finallyClause_in_exceptionGroup1052);
							finallyClause();
							state._fsp--;

							}
							break;

					}

					}
					break;
				case 2 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:328:4: finallyClause
					{
					pushFollow(FOLLOW_finallyClause_in_exceptionGroup1059);
					finallyClause();
					state._fsp--;

					}
					break;

			}
		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "exceptionGroup"



	// $ANTLR start "exceptionHandler"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:331:1: exceptionHandler : ^( 'catch' ARG_ACTION ACTION ) ;
	public final void exceptionHandler() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:332:2: ( ^( 'catch' ARG_ACTION ACTION ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:332:4: ^( 'catch' ARG_ACTION ACTION )
			{
			match(input,CATCH,FOLLOW_CATCH_in_exceptionHandler1071); 
			match(input, Token.DOWN, null); 
			match(input,ARG_ACTION,FOLLOW_ARG_ACTION_in_exceptionHandler1073); 
			match(input,ACTION,FOLLOW_ACTION_in_exceptionHandler1075); 
			match(input, Token.UP, null); 

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "exceptionHandler"



	// $ANTLR start "finallyClause"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:335:1: finallyClause : ^( 'finally' ACTION ) ;
	public final void finallyClause() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:336:2: ( ^( 'finally' ACTION ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:336:4: ^( 'finally' ACTION )
			{
			match(input,FINALLY,FOLLOW_FINALLY_in_finallyClause1088); 
			match(input, Token.DOWN, null); 
			match(input,ACTION,FOLLOW_ACTION_in_finallyClause1090); 
			match(input, Token.UP, null); 

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "finallyClause"



	// $ANTLR start "rewrite"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:339:1: rewrite : ( ^( REWRITES ( single_rewrite )+ ) | REWRITES |);
	public final void rewrite() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:340:2: ( ^( REWRITES ( single_rewrite )+ ) | REWRITES |)
			int alt45=3;
			int LA45_0 = input.LA(1);
			if ( (LA45_0==REWRITES) ) {
				int LA45_1 = input.LA(2);
				if ( (LA45_1==DOWN) ) {
					alt45=1;
				}
				else if ( (LA45_1==EOF||LA45_1==ALT||LA45_1==EOB) ) {
					alt45=2;
				}

				else {
					int nvaeMark = input.mark();
					try {
						input.consume();
						NoViableAltException nvae =
							new NoViableAltException("", 45, 1, input);
						throw nvae;
					} finally {
						input.rewind(nvaeMark);
					}
				}

			}
			else if ( (LA45_0==EOF||LA45_0==ALT||LA45_0==EOB) ) {
				alt45=3;
			}

			else {
				NoViableAltException nvae =
					new NoViableAltException("", 45, 0, input);
				throw nvae;
			}

			switch (alt45) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:340:4: ^( REWRITES ( single_rewrite )+ )
					{
					match(input,REWRITES,FOLLOW_REWRITES_in_rewrite1103); 
					match(input, Token.DOWN, null); 
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:340:15: ( single_rewrite )+
					int cnt44=0;
					loop44:
					while (true) {
						int alt44=2;
						int LA44_0 = input.LA(1);
						if ( (LA44_0==REWRITE) ) {
							alt44=1;
						}

						switch (alt44) {
						case 1 :
							// org/antlr/grammar/v3/ANTLRTreePrinter.g:340:15: single_rewrite
							{
							pushFollow(FOLLOW_single_rewrite_in_rewrite1105);
							single_rewrite();
							state._fsp--;

							}
							break;

						default :
							if ( cnt44 >= 1 ) break loop44;
							EarlyExitException eee = new EarlyExitException(44, input);
							throw eee;
						}
						cnt44++;
					}

					match(input, Token.UP, null); 

					}
					break;
				case 2 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:341:4: REWRITES
					{
					match(input,REWRITES,FOLLOW_REWRITES_in_rewrite1112); 
					}
					break;
				case 3 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:343:2: 
					{
					}
					break;

			}
		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "rewrite"



	// $ANTLR start "single_rewrite"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:345:1: single_rewrite : ^( REWRITE ( SEMPRED )? ( alternative | rewrite_template | ETC | ACTION ) ) ;
	public final void single_rewrite() throws RecognitionException {
		GrammarAST SEMPRED1=null;
		GrammarAST ACTION2=null;

		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:346:2: ( ^( REWRITE ( SEMPRED )? ( alternative | rewrite_template | ETC | ACTION ) ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:346:4: ^( REWRITE ( SEMPRED )? ( alternative | rewrite_template | ETC | ACTION ) )
			{
			match(input,REWRITE,FOLLOW_REWRITE_in_single_rewrite1128); 
			out(" ->");
			match(input, Token.DOWN, null); 
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:347:4: ( SEMPRED )?
			int alt46=2;
			int LA46_0 = input.LA(1);
			if ( (LA46_0==SEMPRED) ) {
				alt46=1;
			}
			switch (alt46) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:347:6: SEMPRED
					{
					SEMPRED1=(GrammarAST)match(input,SEMPRED,FOLLOW_SEMPRED_in_single_rewrite1137); 
					out(" {"+(SEMPRED1!=null?SEMPRED1.getText():null)+"}?");
					}
					break;

			}

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:349:4: ( alternative | rewrite_template | ETC | ACTION )
			int alt47=4;
			switch ( input.LA(1) ) {
			case ALT:
				{
				alt47=1;
				}
				break;
			case TEMPLATE:
				{
				alt47=2;
				}
				break;
			case ETC:
				{
				alt47=3;
				}
				break;
			case ACTION:
				{
				alt47=4;
				}
				break;
			default:
				NoViableAltException nvae =
					new NoViableAltException("", 47, 0, input);
				throw nvae;
			}
			switch (alt47) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:349:6: alternative
					{
					pushFollow(FOLLOW_alternative_in_single_rewrite1152);
					alternative();
					state._fsp--;

					}
					break;
				case 2 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:350:6: rewrite_template
					{
					pushFollow(FOLLOW_rewrite_template_in_single_rewrite1159);
					rewrite_template();
					state._fsp--;

					}
					break;
				case 3 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:351:6: ETC
					{
					match(input,ETC,FOLLOW_ETC_in_single_rewrite1166); 
					out("...");
					}
					break;
				case 4 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:352:6: ACTION
					{
					ACTION2=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_single_rewrite1175); 
					out(" {"+(ACTION2!=null?ACTION2.getText():null)+"}");
					}
					break;

			}

			match(input, Token.UP, null); 

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "single_rewrite"



	// $ANTLR start "rewrite_template"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:357:1: rewrite_template : ^( TEMPLATE (id= ID |ind= ACTION ) ^( ARGLIST ( ^( ARG arg= ID a= ACTION ) )* ) ( DOUBLE_QUOTE_STRING_LITERAL | DOUBLE_ANGLE_STRING_LITERAL )? ) ;
	public final void rewrite_template() throws RecognitionException {
		GrammarAST id=null;
		GrammarAST ind=null;
		GrammarAST arg=null;
		GrammarAST a=null;
		GrammarAST DOUBLE_QUOTE_STRING_LITERAL3=null;
		GrammarAST DOUBLE_ANGLE_STRING_LITERAL4=null;

		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:358:2: ( ^( TEMPLATE (id= ID |ind= ACTION ) ^( ARGLIST ( ^( ARG arg= ID a= ACTION ) )* ) ( DOUBLE_QUOTE_STRING_LITERAL | DOUBLE_ANGLE_STRING_LITERAL )? ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:358:4: ^( TEMPLATE (id= ID |ind= ACTION ) ^( ARGLIST ( ^( ARG arg= ID a= ACTION ) )* ) ( DOUBLE_QUOTE_STRING_LITERAL | DOUBLE_ANGLE_STRING_LITERAL )? )
			{
			match(input,TEMPLATE,FOLLOW_TEMPLATE_in_rewrite_template1199); 
			match(input, Token.DOWN, null); 
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:359:4: (id= ID |ind= ACTION )
			int alt48=2;
			int LA48_0 = input.LA(1);
			if ( (LA48_0==ID) ) {
				alt48=1;
			}
			else if ( (LA48_0==ACTION) ) {
				alt48=2;
			}

			else {
				NoViableAltException nvae =
					new NoViableAltException("", 48, 0, input);
				throw nvae;
			}

			switch (alt48) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:359:6: id= ID
					{
					id=(GrammarAST)match(input,ID,FOLLOW_ID_in_rewrite_template1208); 
					out(" "+(id!=null?id.getText():null));
					}
					break;
				case 2 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:360:6: ind= ACTION
					{
					ind=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_rewrite_template1219); 
					out(" ({"+(ind!=null?ind.getText():null)+"})");
					}
					break;

			}

			match(input,ARGLIST,FOLLOW_ARGLIST_in_rewrite_template1233); 
			out("(");
			if ( input.LA(1)==Token.DOWN ) {
				match(input, Token.DOWN, null); 
				// org/antlr/grammar/v3/ANTLRTreePrinter.g:364:5: ( ^( ARG arg= ID a= ACTION ) )*
				loop49:
				while (true) {
					int alt49=2;
					int LA49_0 = input.LA(1);
					if ( (LA49_0==ARG) ) {
						alt49=1;
					}

					switch (alt49) {
					case 1 :
						// org/antlr/grammar/v3/ANTLRTreePrinter.g:364:7: ^( ARG arg= ID a= ACTION )
						{
						match(input,ARG,FOLLOW_ARG_in_rewrite_template1249); 
						match(input, Token.DOWN, null); 
						arg=(GrammarAST)match(input,ID,FOLLOW_ID_in_rewrite_template1253); 
						out((arg!=null?arg.getText():null)+"=");
						a=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_rewrite_template1265); 
						out((a!=null?a.getText():null));
						match(input, Token.UP, null); 

						}
						break;

					default :
						break loop49;
					}
				}

				out(")");
				match(input, Token.UP, null); 
			}

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:370:4: ( DOUBLE_QUOTE_STRING_LITERAL | DOUBLE_ANGLE_STRING_LITERAL )?
			int alt50=3;
			int LA50_0 = input.LA(1);
			if ( (LA50_0==DOUBLE_QUOTE_STRING_LITERAL) ) {
				alt50=1;
			}
			else if ( (LA50_0==DOUBLE_ANGLE_STRING_LITERAL) ) {
				alt50=2;
			}
			switch (alt50) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:370:6: DOUBLE_QUOTE_STRING_LITERAL
					{
					DOUBLE_QUOTE_STRING_LITERAL3=(GrammarAST)match(input,DOUBLE_QUOTE_STRING_LITERAL,FOLLOW_DOUBLE_QUOTE_STRING_LITERAL_in_rewrite_template1301); 
					out(" "+(DOUBLE_QUOTE_STRING_LITERAL3!=null?DOUBLE_QUOTE_STRING_LITERAL3.getText():null));
					}
					break;
				case 2 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:371:6: DOUBLE_ANGLE_STRING_LITERAL
					{
					DOUBLE_ANGLE_STRING_LITERAL4=(GrammarAST)match(input,DOUBLE_ANGLE_STRING_LITERAL,FOLLOW_DOUBLE_ANGLE_STRING_LITERAL_in_rewrite_template1310); 
					out(" "+(DOUBLE_ANGLE_STRING_LITERAL4!=null?DOUBLE_ANGLE_STRING_LITERAL4.getText():null));
					}
					break;

			}

			match(input, Token.UP, null); 

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "rewrite_template"



	// $ANTLR start "element"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:376:1: element : ( ^( ROOT element ) | ^( BANG element ) | atom | ^( NOT element ) | ^( RANGE atom atom ) | ^( CHAR_RANGE atom atom ) | ^( ASSIGN id= ID element ) | ^( PLUS_ASSIGN id2= ID element ) | ebnf | tree_ | ^( SYNPRED block[true] ) |a= ACTION |a2= FORCED_ACTION |pred= SEMPRED |spred= SYN_SEMPRED | ^( BACKTRACK_SEMPRED ( . )* ) |gpred= GATED_SEMPRED | EPSILON );
	public final void element() throws RecognitionException {
		GrammarAST id=null;
		GrammarAST id2=null;
		GrammarAST a=null;
		GrammarAST a2=null;
		GrammarAST pred=null;
		GrammarAST spred=null;
		GrammarAST gpred=null;

		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:377:2: ( ^( ROOT element ) | ^( BANG element ) | atom | ^( NOT element ) | ^( RANGE atom atom ) | ^( CHAR_RANGE atom atom ) | ^( ASSIGN id= ID element ) | ^( PLUS_ASSIGN id2= ID element ) | ebnf | tree_ | ^( SYNPRED block[true] ) |a= ACTION |a2= FORCED_ACTION |pred= SEMPRED |spred= SYN_SEMPRED | ^( BACKTRACK_SEMPRED ( . )* ) |gpred= GATED_SEMPRED | EPSILON )
			int alt52=18;
			switch ( input.LA(1) ) {
			case ROOT:
				{
				alt52=1;
				}
				break;
			case BANG:
				{
				alt52=2;
				}
				break;
			case CHAR_LITERAL:
			case DOT:
			case LABEL:
			case RULE_REF:
			case STRING_LITERAL:
			case TOKEN_REF:
			case WILDCARD:
				{
				alt52=3;
				}
				break;
			case NOT:
				{
				alt52=4;
				}
				break;
			case RANGE:
				{
				alt52=5;
				}
				break;
			case CHAR_RANGE:
				{
				alt52=6;
				}
				break;
			case ASSIGN:
				{
				alt52=7;
				}
				break;
			case PLUS_ASSIGN:
				{
				alt52=8;
				}
				break;
			case BLOCK:
			case CLOSURE:
			case OPTIONAL:
			case POSITIVE_CLOSURE:
				{
				alt52=9;
				}
				break;
			case TREE_BEGIN:
				{
				alt52=10;
				}
				break;
			case SYNPRED:
				{
				alt52=11;
				}
				break;
			case ACTION:
				{
				alt52=12;
				}
				break;
			case FORCED_ACTION:
				{
				alt52=13;
				}
				break;
			case SEMPRED:
				{
				alt52=14;
				}
				break;
			case SYN_SEMPRED:
				{
				alt52=15;
				}
				break;
			case BACKTRACK_SEMPRED:
				{
				alt52=16;
				}
				break;
			case GATED_SEMPRED:
				{
				alt52=17;
				}
				break;
			case EPSILON:
				{
				alt52=18;
				}
				break;
			default:
				NoViableAltException nvae =
					new NoViableAltException("", 52, 0, input);
				throw nvae;
			}
			switch (alt52) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:377:4: ^( ROOT element )
					{
					match(input,ROOT,FOLLOW_ROOT_in_element1334); 
					match(input, Token.DOWN, null); 
					pushFollow(FOLLOW_element_in_element1336);
					element();
					state._fsp--;

					match(input, Token.UP, null); 

					out("^");
					}
					break;
				case 2 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:378:4: ^( BANG element )
					{
					match(input,BANG,FOLLOW_BANG_in_element1345); 
					match(input, Token.DOWN, null); 
					pushFollow(FOLLOW_element_in_element1347);
					element();
					state._fsp--;

					match(input, Token.UP, null); 

					out("!");
					}
					break;
				case 3 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:379:4: atom
					{
					pushFollow(FOLLOW_atom_in_element1355);
					atom();
					state._fsp--;

					}
					break;
				case 4 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:380:4: ^( NOT element )
					{
					match(input,NOT,FOLLOW_NOT_in_element1361); 
					out("~");
					match(input, Token.DOWN, null); 
					pushFollow(FOLLOW_element_in_element1365);
					element();
					state._fsp--;

					match(input, Token.UP, null); 

					}
					break;
				case 5 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:381:4: ^( RANGE atom atom )
					{
					match(input,RANGE,FOLLOW_RANGE_in_element1372); 
					match(input, Token.DOWN, null); 
					pushFollow(FOLLOW_atom_in_element1374);
					atom();
					state._fsp--;

					out("..");
					pushFollow(FOLLOW_atom_in_element1378);
					atom();
					state._fsp--;

					match(input, Token.UP, null); 

					}
					break;
				case 6 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:382:4: ^( CHAR_RANGE atom atom )
					{
					match(input,CHAR_RANGE,FOLLOW_CHAR_RANGE_in_element1385); 
					match(input, Token.DOWN, null); 
					pushFollow(FOLLOW_atom_in_element1387);
					atom();
					state._fsp--;

					out("..");
					pushFollow(FOLLOW_atom_in_element1391);
					atom();
					state._fsp--;

					match(input, Token.UP, null); 

					}
					break;
				case 7 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:383:4: ^( ASSIGN id= ID element )
					{
					match(input,ASSIGN,FOLLOW_ASSIGN_in_element1398); 
					match(input, Token.DOWN, null); 
					id=(GrammarAST)match(input,ID,FOLLOW_ID_in_element1402); 
					out((id!=null?id.getText():null)+"=");
					pushFollow(FOLLOW_element_in_element1406);
					element();
					state._fsp--;

					match(input, Token.UP, null); 

					}
					break;
				case 8 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:384:4: ^( PLUS_ASSIGN id2= ID element )
					{
					match(input,PLUS_ASSIGN,FOLLOW_PLUS_ASSIGN_in_element1413); 
					match(input, Token.DOWN, null); 
					id2=(GrammarAST)match(input,ID,FOLLOW_ID_in_element1417); 
					out((id2!=null?id2.getText():null)+"+=");
					pushFollow(FOLLOW_element_in_element1421);
					element();
					state._fsp--;

					match(input, Token.UP, null); 

					}
					break;
				case 9 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:385:4: ebnf
					{
					pushFollow(FOLLOW_ebnf_in_element1427);
					ebnf();
					state._fsp--;

					}
					break;
				case 10 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:386:4: tree_
					{
					pushFollow(FOLLOW_tree__in_element1432);
					tree_();
					state._fsp--;

					}
					break;
				case 11 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:387:4: ^( SYNPRED block[true] )
					{
					match(input,SYNPRED,FOLLOW_SYNPRED_in_element1439); 
					match(input, Token.DOWN, null); 
					pushFollow(FOLLOW_block_in_element1441);
					block(true);
					state._fsp--;

					match(input, Token.UP, null); 

					out("=>");
					}
					break;
				case 12 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:388:4: a= ACTION
					{
					a=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_element1453); 
					if ( showActions ) {out("{"); out((a!=null?a.getText():null)); out("}");}
					}
					break;
				case 13 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:389:4: a2= FORCED_ACTION
					{
					a2=(GrammarAST)match(input,FORCED_ACTION,FOLLOW_FORCED_ACTION_in_element1463); 
					if ( showActions ) {out("{{"); out((a2!=null?a2.getText():null)); out("}}");}
					}
					break;
				case 14 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:390:4: pred= SEMPRED
					{
					pred=(GrammarAST)match(input,SEMPRED,FOLLOW_SEMPRED_in_element1473); 

								if ( showActions )
								{
									out("{");
									out((pred!=null?pred.getText():null));
									out("}?");
								}
								else
								{
									out("{...}?");
								}
							
					}
					break;
				case 15 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:403:4: spred= SYN_SEMPRED
					{
					spred=(GrammarAST)match(input,SYN_SEMPRED,FOLLOW_SYN_SEMPRED_in_element1484); 

								String name = (spred!=null?spred.getText():null);
								GrammarAST predAST=grammar.getSyntacticPredicate(name);
								block(predAST, true);
								out("=>");
							
					}
					break;
				case 16 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:410:4: ^( BACKTRACK_SEMPRED ( . )* )
					{
					match(input,BACKTRACK_SEMPRED,FOLLOW_BACKTRACK_SEMPRED_in_element1494); 
					if ( input.LA(1)==Token.DOWN ) {
						match(input, Token.DOWN, null); 
						// org/antlr/grammar/v3/ANTLRTreePrinter.g:410:24: ( . )*
						loop51:
						while (true) {
							int alt51=2;
							int LA51_0 = input.LA(1);
							if ( ((LA51_0 >= ACTION && LA51_0 <= XDIGIT)) ) {
								alt51=1;
							}
							else if ( (LA51_0==UP) ) {
								alt51=2;
							}

							switch (alt51) {
							case 1 :
								// org/antlr/grammar/v3/ANTLRTreePrinter.g:410:24: .
								{
								matchAny(input); 
								}
								break;

							default :
								break loop51;
							}
						}

						match(input, Token.UP, null); 
					}

					}
					break;
				case 17 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:411:4: gpred= GATED_SEMPRED
					{
					gpred=(GrammarAST)match(input,GATED_SEMPRED,FOLLOW_GATED_SEMPRED_in_element1506); 

							if ( showActions ) {out("{"); out((gpred!=null?gpred.getText():null)); out("}? =>");}
							else {out("{...}? =>");}
							
					}
					break;
				case 18 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:416:4: EPSILON
					{
					match(input,EPSILON,FOLLOW_EPSILON_in_element1515); 
					}
					break;

			}
		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "element"



	// $ANTLR start "ebnf"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:419:1: ebnf : ( block[true] | ^( OPTIONAL block[true] ) | ^( CLOSURE block[true] ) | ^( POSITIVE_CLOSURE block[true] ) );
	public final void ebnf() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:420:2: ( block[true] | ^( OPTIONAL block[true] ) | ^( CLOSURE block[true] ) | ^( POSITIVE_CLOSURE block[true] ) )
			int alt53=4;
			switch ( input.LA(1) ) {
			case BLOCK:
				{
				alt53=1;
				}
				break;
			case OPTIONAL:
				{
				alt53=2;
				}
				break;
			case CLOSURE:
				{
				alt53=3;
				}
				break;
			case POSITIVE_CLOSURE:
				{
				alt53=4;
				}
				break;
			default:
				NoViableAltException nvae =
					new NoViableAltException("", 53, 0, input);
				throw nvae;
			}
			switch (alt53) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:420:4: block[true]
					{
					pushFollow(FOLLOW_block_in_ebnf1526);
					block(true);
					state._fsp--;

					out(" ");
					}
					break;
				case 2 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:421:4: ^( OPTIONAL block[true] )
					{
					match(input,OPTIONAL,FOLLOW_OPTIONAL_in_ebnf1536); 
					match(input, Token.DOWN, null); 
					pushFollow(FOLLOW_block_in_ebnf1538);
					block(true);
					state._fsp--;

					match(input, Token.UP, null); 

					out("? ");
					}
					break;
				case 3 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:422:4: ^( CLOSURE block[true] )
					{
					match(input,CLOSURE,FOLLOW_CLOSURE_in_ebnf1550); 
					match(input, Token.DOWN, null); 
					pushFollow(FOLLOW_block_in_ebnf1552);
					block(true);
					state._fsp--;

					match(input, Token.UP, null); 

					out("* ");
					}
					break;
				case 4 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:423:4: ^( POSITIVE_CLOSURE block[true] )
					{
					match(input,POSITIVE_CLOSURE,FOLLOW_POSITIVE_CLOSURE_in_ebnf1565); 
					match(input, Token.DOWN, null); 
					pushFollow(FOLLOW_block_in_ebnf1567);
					block(true);
					state._fsp--;

					match(input, Token.UP, null); 

					out("+ ");
					}
					break;

			}
		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "ebnf"



	// $ANTLR start "tree_"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:426:1: tree_ : ^( TREE_BEGIN element ( element )* ) ;
	public final void tree_() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:427:2: ( ^( TREE_BEGIN element ( element )* ) )
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:427:4: ^( TREE_BEGIN element ( element )* )
			{
			match(input,TREE_BEGIN,FOLLOW_TREE_BEGIN_in_tree_1584); 
			out(" ^(");
			match(input, Token.DOWN, null); 
			pushFollow(FOLLOW_element_in_tree_1588);
			element();
			state._fsp--;

			// org/antlr/grammar/v3/ANTLRTreePrinter.g:427:39: ( element )*
			loop54:
			while (true) {
				int alt54=2;
				int LA54_0 = input.LA(1);
				if ( (LA54_0==ACTION||(LA54_0 >= ASSIGN && LA54_0 <= BLOCK)||(LA54_0 >= CHAR_LITERAL && LA54_0 <= CHAR_RANGE)||LA54_0==CLOSURE||LA54_0==DOT||LA54_0==EPSILON||LA54_0==FORCED_ACTION||LA54_0==GATED_SEMPRED||LA54_0==LABEL||LA54_0==NOT||LA54_0==OPTIONAL||(LA54_0 >= PLUS_ASSIGN && LA54_0 <= POSITIVE_CLOSURE)||LA54_0==RANGE||LA54_0==ROOT||LA54_0==RULE_REF||LA54_0==SEMPRED||(LA54_0 >= STRING_LITERAL && LA54_0 <= SYN_SEMPRED)||LA54_0==TOKEN_REF||LA54_0==TREE_BEGIN||LA54_0==WILDCARD) ) {
					alt54=1;
				}

				switch (alt54) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:427:40: element
					{
					pushFollow(FOLLOW_element_in_tree_1591);
					element();
					state._fsp--;

					}
					break;

				default :
					break loop54;
				}
			}

			out(") ");
			match(input, Token.UP, null); 

			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "tree_"


	public static class atom_return extends TreeRuleReturnScope {
	};


	// $ANTLR start "atom"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:430:1: atom : ( ( ^( RULE_REF (rarg= ARG_ACTION )? ( ast_suffix )? ) | ^( TOKEN_REF (targ= ARG_ACTION )? ( ast_suffix )? ) | ^( CHAR_LITERAL ( ast_suffix )? ) | ^( STRING_LITERAL ( ast_suffix )? ) | ^( WILDCARD ( ast_suffix )? ) ) | LABEL | ^( DOT ID atom ) );
	public final ANTLRTreePrinter.atom_return atom() throws RecognitionException {
		ANTLRTreePrinter.atom_return retval = new ANTLRTreePrinter.atom_return();
		retval.start = input.LT(1);

		GrammarAST rarg=null;
		GrammarAST targ=null;
		GrammarAST LABEL5=null;
		GrammarAST ID6=null;

		out(" ");
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:433:2: ( ( ^( RULE_REF (rarg= ARG_ACTION )? ( ast_suffix )? ) | ^( TOKEN_REF (targ= ARG_ACTION )? ( ast_suffix )? ) | ^( CHAR_LITERAL ( ast_suffix )? ) | ^( STRING_LITERAL ( ast_suffix )? ) | ^( WILDCARD ( ast_suffix )? ) ) | LABEL | ^( DOT ID atom ) )
			int alt63=3;
			switch ( input.LA(1) ) {
			case CHAR_LITERAL:
			case RULE_REF:
			case STRING_LITERAL:
			case TOKEN_REF:
			case WILDCARD:
				{
				alt63=1;
				}
				break;
			case LABEL:
				{
				alt63=2;
				}
				break;
			case DOT:
				{
				alt63=3;
				}
				break;
			default:
				NoViableAltException nvae =
					new NoViableAltException("", 63, 0, input);
				throw nvae;
			}
			switch (alt63) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:433:4: ( ^( RULE_REF (rarg= ARG_ACTION )? ( ast_suffix )? ) | ^( TOKEN_REF (targ= ARG_ACTION )? ( ast_suffix )? ) | ^( CHAR_LITERAL ( ast_suffix )? ) | ^( STRING_LITERAL ( ast_suffix )? ) | ^( WILDCARD ( ast_suffix )? ) )
					{
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:433:4: ( ^( RULE_REF (rarg= ARG_ACTION )? ( ast_suffix )? ) | ^( TOKEN_REF (targ= ARG_ACTION )? ( ast_suffix )? ) | ^( CHAR_LITERAL ( ast_suffix )? ) | ^( STRING_LITERAL ( ast_suffix )? ) | ^( WILDCARD ( ast_suffix )? ) )
					int alt62=5;
					switch ( input.LA(1) ) {
					case RULE_REF:
						{
						alt62=1;
						}
						break;
					case TOKEN_REF:
						{
						alt62=2;
						}
						break;
					case CHAR_LITERAL:
						{
						alt62=3;
						}
						break;
					case STRING_LITERAL:
						{
						alt62=4;
						}
						break;
					case WILDCARD:
						{
						alt62=5;
						}
						break;
					default:
						NoViableAltException nvae =
							new NoViableAltException("", 62, 0, input);
						throw nvae;
					}
					switch (alt62) {
						case 1 :
							// org/antlr/grammar/v3/ANTLRTreePrinter.g:433:6: ^( RULE_REF (rarg= ARG_ACTION )? ( ast_suffix )? )
							{
							match(input,RULE_REF,FOLLOW_RULE_REF_in_atom1617); 
							out(((GrammarAST)retval.start).toString());
							if ( input.LA(1)==Token.DOWN ) {
								match(input, Token.DOWN, null); 
								// org/antlr/grammar/v3/ANTLRTreePrinter.g:434:5: (rarg= ARG_ACTION )?
								int alt55=2;
								int LA55_0 = input.LA(1);
								if ( (LA55_0==ARG_ACTION) ) {
									alt55=1;
								}
								switch (alt55) {
									case 1 :
										// org/antlr/grammar/v3/ANTLRTreePrinter.g:434:6: rarg= ARG_ACTION
										{
										rarg=(GrammarAST)match(input,ARG_ACTION,FOLLOW_ARG_ACTION_in_atom1629); 
										out("["+rarg.toString()+"]");
										}
										break;

								}

								// org/antlr/grammar/v3/ANTLRTreePrinter.g:435:5: ( ast_suffix )?
								int alt56=2;
								int LA56_0 = input.LA(1);
								if ( (LA56_0==BANG||LA56_0==ROOT) ) {
									alt56=1;
								}
								switch (alt56) {
									case 1 :
										// org/antlr/grammar/v3/ANTLRTreePrinter.g:435:6: ast_suffix
										{
										pushFollow(FOLLOW_ast_suffix_in_atom1640);
										ast_suffix();
										state._fsp--;

										}
										break;

								}

								match(input, Token.UP, null); 
							}

							}
							break;
						case 2 :
							// org/antlr/grammar/v3/ANTLRTreePrinter.g:437:5: ^( TOKEN_REF (targ= ARG_ACTION )? ( ast_suffix )? )
							{
							match(input,TOKEN_REF,FOLLOW_TOKEN_REF_in_atom1655); 
							out(((GrammarAST)retval.start).toString());
							if ( input.LA(1)==Token.DOWN ) {
								match(input, Token.DOWN, null); 
								// org/antlr/grammar/v3/ANTLRTreePrinter.g:438:5: (targ= ARG_ACTION )?
								int alt57=2;
								int LA57_0 = input.LA(1);
								if ( (LA57_0==ARG_ACTION) ) {
									alt57=1;
								}
								switch (alt57) {
									case 1 :
										// org/antlr/grammar/v3/ANTLRTreePrinter.g:438:6: targ= ARG_ACTION
										{
										targ=(GrammarAST)match(input,ARG_ACTION,FOLLOW_ARG_ACTION_in_atom1667); 
										out("["+targ.toString()+"]");
										}
										break;

								}

								// org/antlr/grammar/v3/ANTLRTreePrinter.g:439:5: ( ast_suffix )?
								int alt58=2;
								int LA58_0 = input.LA(1);
								if ( (LA58_0==BANG||LA58_0==ROOT) ) {
									alt58=1;
								}
								switch (alt58) {
									case 1 :
										// org/antlr/grammar/v3/ANTLRTreePrinter.g:439:6: ast_suffix
										{
										pushFollow(FOLLOW_ast_suffix_in_atom1679);
										ast_suffix();
										state._fsp--;

										}
										break;

								}

								match(input, Token.UP, null); 
							}

							}
							break;
						case 3 :
							// org/antlr/grammar/v3/ANTLRTreePrinter.g:441:5: ^( CHAR_LITERAL ( ast_suffix )? )
							{
							match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_atom1694); 
							out(((GrammarAST)retval.start).toString());
							if ( input.LA(1)==Token.DOWN ) {
								match(input, Token.DOWN, null); 
								// org/antlr/grammar/v3/ANTLRTreePrinter.g:442:5: ( ast_suffix )?
								int alt59=2;
								int LA59_0 = input.LA(1);
								if ( (LA59_0==BANG||LA59_0==ROOT) ) {
									alt59=1;
								}
								switch (alt59) {
									case 1 :
										// org/antlr/grammar/v3/ANTLRTreePrinter.g:442:6: ast_suffix
										{
										pushFollow(FOLLOW_ast_suffix_in_atom1703);
										ast_suffix();
										state._fsp--;

										}
										break;

								}

								match(input, Token.UP, null); 
							}

							}
							break;
						case 4 :
							// org/antlr/grammar/v3/ANTLRTreePrinter.g:444:5: ^( STRING_LITERAL ( ast_suffix )? )
							{
							match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_atom1718); 
							out(((GrammarAST)retval.start).toString());
							if ( input.LA(1)==Token.DOWN ) {
								match(input, Token.DOWN, null); 
								// org/antlr/grammar/v3/ANTLRTreePrinter.g:445:5: ( ast_suffix )?
								int alt60=2;
								int LA60_0 = input.LA(1);
								if ( (LA60_0==BANG||LA60_0==ROOT) ) {
									alt60=1;
								}
								switch (alt60) {
									case 1 :
										// org/antlr/grammar/v3/ANTLRTreePrinter.g:445:6: ast_suffix
										{
										pushFollow(FOLLOW_ast_suffix_in_atom1727);
										ast_suffix();
										state._fsp--;

										}
										break;

								}

								match(input, Token.UP, null); 
							}

							}
							break;
						case 5 :
							// org/antlr/grammar/v3/ANTLRTreePrinter.g:447:5: ^( WILDCARD ( ast_suffix )? )
							{
							match(input,WILDCARD,FOLLOW_WILDCARD_in_atom1742); 
							out(((GrammarAST)retval.start).toString());
							if ( input.LA(1)==Token.DOWN ) {
								match(input, Token.DOWN, null); 
								// org/antlr/grammar/v3/ANTLRTreePrinter.g:448:5: ( ast_suffix )?
								int alt61=2;
								int LA61_0 = input.LA(1);
								if ( (LA61_0==BANG||LA61_0==ROOT) ) {
									alt61=1;
								}
								switch (alt61) {
									case 1 :
										// org/antlr/grammar/v3/ANTLRTreePrinter.g:448:6: ast_suffix
										{
										pushFollow(FOLLOW_ast_suffix_in_atom1752);
										ast_suffix();
										state._fsp--;

										}
										break;

								}

								match(input, Token.UP, null); 
							}

							}
							break;

					}

					out(" ");
					}
					break;
				case 2 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:452:4: LABEL
					{
					LABEL5=(GrammarAST)match(input,LABEL,FOLLOW_LABEL_in_atom1772); 
					out(" $"+(LABEL5!=null?LABEL5.getText():null));
					}
					break;
				case 3 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:453:4: ^( DOT ID atom )
					{
					match(input,DOT,FOLLOW_DOT_in_atom1781); 
					match(input, Token.DOWN, null); 
					ID6=(GrammarAST)match(input,ID,FOLLOW_ID_in_atom1783); 
					out((ID6!=null?ID6.getText():null)+".");
					pushFollow(FOLLOW_atom_in_atom1787);
					atom();
					state._fsp--;

					match(input, Token.UP, null); 

					}
					break;

			}
		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "atom"



	// $ANTLR start "ast_suffix"
	// org/antlr/grammar/v3/ANTLRTreePrinter.g:456:1: ast_suffix : ( ROOT | BANG );
	public final void ast_suffix() throws RecognitionException {
		try {
			// org/antlr/grammar/v3/ANTLRTreePrinter.g:457:2: ( ROOT | BANG )
			int alt64=2;
			int LA64_0 = input.LA(1);
			if ( (LA64_0==ROOT) ) {
				alt64=1;
			}
			else if ( (LA64_0==BANG) ) {
				alt64=2;
			}

			else {
				NoViableAltException nvae =
					new NoViableAltException("", 64, 0, input);
				throw nvae;
			}

			switch (alt64) {
				case 1 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:457:4: ROOT
					{
					match(input,ROOT,FOLLOW_ROOT_in_ast_suffix1800); 
					out("^");
					}
					break;
				case 2 :
					// org/antlr/grammar/v3/ANTLRTreePrinter.g:458:4: BANG
					{
					match(input,BANG,FOLLOW_BANG_in_ast_suffix1807); 
					out("!");
					}
					break;

			}
		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
	}
	// $ANTLR end "ast_suffix"

	// Delegated rules



	public static final BitSet FOLLOW_grammar__in_toString73 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_rule_in_toString79 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_alternative_in_toString85 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_element_in_toString91 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_single_rewrite_in_toString97 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_rewrite_in_toString103 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_EOR_in_toString109 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_LEXER_GRAMMAR_in_grammar_133 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_grammarSpec_in_grammar_135 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_PARSER_GRAMMAR_in_grammar_145 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_grammarSpec_in_grammar_147 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_TREE_GRAMMAR_in_grammar_157 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_grammarSpec_in_grammar_159 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_COMBINED_GRAMMAR_in_grammar_169 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_grammarSpec_in_grammar_171 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_SCOPE_in_attrScope187 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ID_in_attrScope189 = new BitSet(new long[]{0x0000000000000210L});
	public static final BitSet FOLLOW_ruleAction_in_attrScope191 = new BitSet(new long[]{0x0000000000000210L});
	public static final BitSet FOLLOW_ACTION_in_attrScope194 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_ID_in_grammarSpec210 = new BitSet(new long[]{0x0400200008000200L,0x0000000020028002L});
	public static final BitSet FOLLOW_DOC_COMMENT_in_grammarSpec219 = new BitSet(new long[]{0x0400200000000200L,0x0000000020028002L});
	public static final BitSet FOLLOW_optionsSpec_in_grammarSpec229 = new BitSet(new long[]{0x0000200000000200L,0x0000000020028002L});
	public static final BitSet FOLLOW_delegateGrammars_in_grammarSpec238 = new BitSet(new long[]{0x0000000000000200L,0x0000000020028002L});
	public static final BitSet FOLLOW_tokensSpec_in_grammarSpec245 = new BitSet(new long[]{0x0000000000000200L,0x0000000000028002L});
	public static final BitSet FOLLOW_attrScope_in_grammarSpec252 = new BitSet(new long[]{0x0000000000000200L,0x0000000000028002L});
	public static final BitSet FOLLOW_actions_in_grammarSpec259 = new BitSet(new long[]{0x0000000000000000L,0x0000000000008002L});
	public static final BitSet FOLLOW_rules_in_grammarSpec265 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_action_in_actions278 = new BitSet(new long[]{0x0000000000000202L});
	public static final BitSet FOLLOW_AMPERSAND_in_action299 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ID_in_action303 = new BitSet(new long[]{0x0000080000000010L});
	public static final BitSet FOLLOW_ID_in_action312 = new BitSet(new long[]{0x0000000000000010L});
	public static final BitSet FOLLOW_ACTION_in_action316 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_ACTION_in_action331 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_OPTIONS_in_optionsSpec363 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_option_in_optionsSpec371 = new BitSet(new long[]{0x0000000000002008L});
	public static final BitSet FOLLOW_ASSIGN_in_option397 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ID_in_option401 = new BitSet(new long[]{0x0000880000040000L,0x0000000001000000L});
	public static final BitSet FOLLOW_optionValue_in_option405 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_ID_in_optionValue420 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_STRING_LITERAL_in_optionValue440 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_CHAR_LITERAL_in_optionValue449 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_INT_in_optionValue460 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_IMPORT_in_delegateGrammars490 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ASSIGN_in_delegateGrammars495 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ID_in_delegateGrammars497 = new BitSet(new long[]{0x0000080000000000L});
	public static final BitSet FOLLOW_ID_in_delegateGrammars499 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_ID_in_delegateGrammars504 = new BitSet(new long[]{0x0000080000002008L});
	public static final BitSet FOLLOW_TOKENS_in_tokensSpec521 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_tokenSpec_in_tokensSpec523 = new BitSet(new long[]{0x0000000000002008L,0x0000000040000000L});
	public static final BitSet FOLLOW_TOKEN_REF_in_tokenSpec536 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_ASSIGN_in_tokenSpec543 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_TOKEN_REF_in_tokenSpec545 = new BitSet(new long[]{0x0000000000040000L,0x0000000001000000L});
	public static final BitSet FOLLOW_set_in_tokenSpec547 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_rule_in_rules566 = new BitSet(new long[]{0x0000000000000002L,0x0000000000008002L});
	public static final BitSet FOLLOW_precRule_in_rules570 = new BitSet(new long[]{0x0000000000000002L,0x0000000000008002L});
	public static final BitSet FOLLOW_RULE_in_rule586 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ID_in_rule590 = new BitSet(new long[]{0x0000010000000400L,0x000000000000001CL});
	public static final BitSet FOLLOW_modifier_in_rule596 = new BitSet(new long[]{0x0000000000000400L});
	public static final BitSet FOLLOW_ARG_in_rule609 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ARG_ACTION_in_rule614 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_RET_in_rule627 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ARG_ACTION_in_rule632 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_throwsSpec_in_rule645 = new BitSet(new long[]{0x0400000000010200L,0x0000000000020000L});
	public static final BitSet FOLLOW_optionsSpec_in_rule653 = new BitSet(new long[]{0x0000000000010200L,0x0000000000020000L});
	public static final BitSet FOLLOW_ruleScopeSpec_in_rule661 = new BitSet(new long[]{0x0000000000010200L});
	public static final BitSet FOLLOW_ruleAction_in_rule669 = new BitSet(new long[]{0x0000000000010200L});
	public static final BitSet FOLLOW_block_in_rule688 = new BitSet(new long[]{0x0000004400020000L});
	public static final BitSet FOLLOW_exceptionGroup_in_rule695 = new BitSet(new long[]{0x0000000400000000L});
	public static final BitSet FOLLOW_EOR_in_rule702 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_PREC_RULE_in_precRule721 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ID_in_precRule725 = new BitSet(new long[]{0x0000010000000400L,0x000000000000001CL});
	public static final BitSet FOLLOW_modifier_in_precRule731 = new BitSet(new long[]{0x0000000000000400L});
	public static final BitSet FOLLOW_ARG_in_precRule744 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ARG_ACTION_in_precRule749 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_RET_in_precRule762 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ARG_ACTION_in_precRule767 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_throwsSpec_in_precRule780 = new BitSet(new long[]{0x0400000000010200L,0x0000000000020000L});
	public static final BitSet FOLLOW_optionsSpec_in_precRule788 = new BitSet(new long[]{0x0000000000010200L,0x0000000000020000L});
	public static final BitSet FOLLOW_ruleScopeSpec_in_precRule796 = new BitSet(new long[]{0x0000000000010200L});
	public static final BitSet FOLLOW_ruleAction_in_precRule804 = new BitSet(new long[]{0x0000000000010200L});
	public static final BitSet FOLLOW_block_in_precRule823 = new BitSet(new long[]{0x0000004400020000L});
	public static final BitSet FOLLOW_exceptionGroup_in_precRule830 = new BitSet(new long[]{0x0000000400000000L});
	public static final BitSet FOLLOW_EOR_in_precRule837 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_AMPERSAND_in_ruleAction855 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ID_in_ruleAction859 = new BitSet(new long[]{0x0000000000000010L});
	public static final BitSet FOLLOW_ACTION_in_ruleAction863 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_THROWS_in_throwsSpec912 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ID_in_throwsSpec914 = new BitSet(new long[]{0x0000080000000008L});
	public static final BitSet FOLLOW_SCOPE_in_ruleScopeSpec929 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ruleAction_in_ruleScopeSpec931 = new BitSet(new long[]{0x0000080000000218L});
	public static final BitSet FOLLOW_ACTION_in_ruleScopeSpec935 = new BitSet(new long[]{0x0000080000000008L});
	public static final BitSet FOLLOW_ID_in_ruleScopeSpec941 = new BitSet(new long[]{0x0000080000000008L});
	public static final BitSet FOLLOW_BLOCK_in_block965 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_optionsSpec_in_block976 = new BitSet(new long[]{0x0000000000000100L});
	public static final BitSet FOLLOW_alternative_in_block986 = new BitSet(new long[]{0x0000000200000100L,0x0000000000001000L});
	public static final BitSet FOLLOW_rewrite_in_block988 = new BitSet(new long[]{0x0000000200000100L});
	public static final BitSet FOLLOW_alternative_in_block994 = new BitSet(new long[]{0x0000000200000100L,0x0000000000001000L});
	public static final BitSet FOLLOW_rewrite_in_block996 = new BitSet(new long[]{0x0000000200000100L});
	public static final BitSet FOLLOW_EOB_in_block1004 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_ALT_in_alternative1026 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_element_in_alternative1028 = new BitSet(new long[]{0x82810289202DE010L,0x0000000547092041L});
	public static final BitSet FOLLOW_EOA_in_alternative1031 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_exceptionHandler_in_exceptionGroup1046 = new BitSet(new long[]{0x0000004000020002L});
	public static final BitSet FOLLOW_finallyClause_in_exceptionGroup1052 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_finallyClause_in_exceptionGroup1059 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_CATCH_in_exceptionHandler1071 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ARG_ACTION_in_exceptionHandler1073 = new BitSet(new long[]{0x0000000000000010L});
	public static final BitSet FOLLOW_ACTION_in_exceptionHandler1075 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_FINALLY_in_finallyClause1088 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ACTION_in_finallyClause1090 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_REWRITES_in_rewrite1103 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_single_rewrite_in_rewrite1105 = new BitSet(new long[]{0x0000000000000008L,0x0000000000000800L});
	public static final BitSet FOLLOW_REWRITES_in_rewrite1112 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_REWRITE_in_single_rewrite1128 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_SEMPRED_in_single_rewrite1137 = new BitSet(new long[]{0x0000002000000110L,0x0000000008000000L});
	public static final BitSet FOLLOW_alternative_in_single_rewrite1152 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_rewrite_template_in_single_rewrite1159 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_ETC_in_single_rewrite1166 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_ACTION_in_single_rewrite1175 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_TEMPLATE_in_rewrite_template1199 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ID_in_rewrite_template1208 = new BitSet(new long[]{0x0000000000000800L});
	public static final BitSet FOLLOW_ACTION_in_rewrite_template1219 = new BitSet(new long[]{0x0000000000000800L});
	public static final BitSet FOLLOW_ARGLIST_in_rewrite_template1233 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ARG_in_rewrite_template1249 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ID_in_rewrite_template1253 = new BitSet(new long[]{0x0000000000000010L});
	public static final BitSet FOLLOW_ACTION_in_rewrite_template1265 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_DOUBLE_QUOTE_STRING_LITERAL_in_rewrite_template1301 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_DOUBLE_ANGLE_STRING_LITERAL_in_rewrite_template1310 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_ROOT_in_element1334 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_element_in_element1336 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_BANG_in_element1345 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_element_in_element1347 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_atom_in_element1355 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_NOT_in_element1361 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_element_in_element1365 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_RANGE_in_element1372 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_atom_in_element1374 = new BitSet(new long[]{0x0001000020040000L,0x0000000441010000L});
	public static final BitSet FOLLOW_atom_in_element1378 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_CHAR_RANGE_in_element1385 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_atom_in_element1387 = new BitSet(new long[]{0x0001000020040000L,0x0000000441010000L});
	public static final BitSet FOLLOW_atom_in_element1391 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_ASSIGN_in_element1398 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ID_in_element1402 = new BitSet(new long[]{0x82810288202DE010L,0x0000000547092041L});
	public static final BitSet FOLLOW_element_in_element1406 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_PLUS_ASSIGN_in_element1413 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ID_in_element1417 = new BitSet(new long[]{0x82810288202DE010L,0x0000000547092041L});
	public static final BitSet FOLLOW_element_in_element1421 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_ebnf_in_element1427 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_tree__in_element1432 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_SYNPRED_in_element1439 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_block_in_element1441 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_ACTION_in_element1453 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_FORCED_ACTION_in_element1463 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_SEMPRED_in_element1473 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_SYN_SEMPRED_in_element1484 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_BACKTRACK_SEMPRED_in_element1494 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_GATED_SEMPRED_in_element1506 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_EPSILON_in_element1515 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_block_in_ebnf1526 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_OPTIONAL_in_ebnf1536 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_block_in_ebnf1538 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_CLOSURE_in_ebnf1550 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_block_in_ebnf1552 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_POSITIVE_CLOSURE_in_ebnf1565 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_block_in_ebnf1567 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_TREE_BEGIN_in_tree_1584 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_element_in_tree_1588 = new BitSet(new long[]{0x82810288202DE018L,0x0000000547092041L});
	public static final BitSet FOLLOW_element_in_tree_1591 = new BitSet(new long[]{0x82810288202DE018L,0x0000000547092041L});
	public static final BitSet FOLLOW_RULE_REF_in_atom1617 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ARG_ACTION_in_atom1629 = new BitSet(new long[]{0x0000000000008008L,0x0000000000002000L});
	public static final BitSet FOLLOW_ast_suffix_in_atom1640 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_TOKEN_REF_in_atom1655 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ARG_ACTION_in_atom1667 = new BitSet(new long[]{0x0000000000008008L,0x0000000000002000L});
	public static final BitSet FOLLOW_ast_suffix_in_atom1679 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_CHAR_LITERAL_in_atom1694 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ast_suffix_in_atom1703 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_STRING_LITERAL_in_atom1718 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ast_suffix_in_atom1727 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_WILDCARD_in_atom1742 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ast_suffix_in_atom1752 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_LABEL_in_atom1772 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_DOT_in_atom1781 = new BitSet(new long[]{0x0000000000000004L});
	public static final BitSet FOLLOW_ID_in_atom1783 = new BitSet(new long[]{0x0001000020040000L,0x0000000441010000L});
	public static final BitSet FOLLOW_atom_in_atom1787 = new BitSet(new long[]{0x0000000000000008L});
	public static final BitSet FOLLOW_ROOT_in_ast_suffix1800 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_BANG_in_ast_suffix1807 = new BitSet(new long[]{0x0000000000000002L});
}
