// $ANTLR 3.1.2 BuildOptions\\DebugTreeGrammar.g3 2009-09-30 13:18:15

// The variable 'variable' is assigned but its value is never used.
#pragma warning disable 219
// Unreachable code detected.
#pragma warning disable 162


//import java.util.Map;
//import java.util.HashMap;
using BigInteger = java.math.BigInteger;
using Console = System.Console;


using System.Collections.Generic;
using Antlr.Runtime;
using Antlr.Runtime.Tree;
using RewriteRuleITokenStream = Antlr.Runtime.Tree.RewriteRuleTokenStream;using Stack = System.Collections.Generic.Stack<object>;
using List = System.Collections.IList;
using ArrayList = System.Collections.Generic.List<object>;

using Antlr.Runtime.Debug;
using IOException = System.IO.IOException;
[System.CodeDom.Compiler.GeneratedCode("ANTLR", "3.1.2")]
[System.CLSCompliant(false)]
public partial class DebugTreeGrammar : DebugTreeParser
{
	internal static readonly string[] tokenNames = new string[] {
		"<invalid>", "<EOR>", "<DOWN>", "<UP>", "CALL", "FUNC", "ID", "INT", "NEWLINE", "WS", "'-'", "'%'", "'('", "')'", "'*'", "'/'", "'+'", "'='"
	};
	public const int EOF=-1;
	public const int T__10=10;
	public const int T__11=11;
	public const int T__12=12;
	public const int T__13=13;
	public const int T__14=14;
	public const int T__15=15;
	public const int T__16=16;
	public const int T__17=17;
	public const int CALL=4;
	public const int FUNC=5;
	public const int ID=6;
	public const int INT=7;
	public const int NEWLINE=8;
	public const int WS=9;

	// delegates
	// delegators

	public static readonly string[] ruleNames =
		new string[]
		{
			"invalidRule", "call", "expr", "prog", "stat"
		};

		int ruleLevel = 0;
		public virtual int RuleLevel { get { return ruleLevel; } }
		public virtual void IncRuleLevel() { ruleLevel++; }
		public virtual void DecRuleLevel() { ruleLevel--; }
		public DebugTreeGrammar( ITreeNodeStream input )
			: this( input, DebugEventSocketProxy.DefaultDebuggerPort, new RecognizerSharedState() )
		{
		}
		public DebugTreeGrammar( ITreeNodeStream input, int port, RecognizerSharedState state )
			: base( input, state )
		{
			DebugEventSocketProxy proxy = new DebugEventSocketProxy( this, port, input.TreeAdaptor );
			DebugListener = proxy;
			try
			{
				proxy.Handshake();
			}
			catch ( IOException ioe )
			{
				ReportError( ioe );
			}
		}
	public DebugTreeGrammar( ITreeNodeStream input, IDebugEventListener dbg )
		: base( input, dbg, new RecognizerSharedState() )
	{

	}
	protected virtual bool EvalPredicate( bool result, string predicate )
	{
		dbg.SemanticPredicate( result, predicate );
		return result;
	}


	public override string[] TokenNames { get { return DebugTreeGrammar.tokenNames; } }
	public override string GrammarFileName { get { return "BuildOptions\\DebugTreeGrammar.g3"; } }


	#region Rules

	// $ANTLR start "prog"
	// BuildOptions\\DebugTreeGrammar.g3:53:0: prog : ( stat )* ;
	private void prog(  )
	{
		try
		{
			dbg.EnterRule( GrammarFileName, "prog" );
			if ( RuleLevel == 0 )
			{
				dbg.Commence();
			}
			IncRuleLevel();
			dbg.Location( 53, -1 );

		try
		{
			// BuildOptions\\DebugTreeGrammar.g3:53:9: ( ( stat )* )
			dbg.EnterAlt( 1 );

			// BuildOptions\\DebugTreeGrammar.g3:53:9: ( stat )*
			{
			dbg.Location( 53, 8 );
			// BuildOptions\\DebugTreeGrammar.g3:53:9: ( stat )*
			try
			{
				dbg.EnterSubRule( 1 );

			for ( ; ; )
			{
				int alt1=2;
				try
				{
					dbg.EnterDecision( 1 );

				int LA1_0 = input.LA(1);

				if ( ((LA1_0>=CALL && LA1_0<=INT)||(LA1_0>=10 && LA1_0<=11)||(LA1_0>=14 && LA1_0<=17)) )
				{
					alt1=1;
				}


				}
				finally
				{
					dbg.ExitDecision( 1 );
				}

				switch ( alt1 )
				{
				case 1:
					dbg.EnterAlt( 1 );

					// BuildOptions\\DebugTreeGrammar.g3:53:0: stat
					{
					dbg.Location( 53, 8 );
					PushFollow(Follow._stat_in_prog48);
					stat();

					state._fsp--;


					}
					break;

				default:
					goto loop1;
				}
			}

			loop1:
				;

			}
			finally
			{
				dbg.ExitSubRule( 1 );
			}


			}

		}
		catch ( RecognitionException re )
		{
			ReportError(re);
			Recover(input,re);
		}
		finally
		{
		}
		dbg.Location(54, 4);

		}
		finally
		{
			dbg.ExitRule( GrammarFileName, "prog" );
			DecRuleLevel();
			if ( RuleLevel == 0 )
			{
				dbg.Terminate();
			}
		}

		return ;
	}
	// $ANTLR end "prog"


	// $ANTLR start "stat"
	// BuildOptions\\DebugTreeGrammar.g3:56:0: stat : ( expr | ^( '=' ID expr ) | ^( FUNC ( . )+ ) );
	private void stat(  )
	{
		CommonTree ID2=null;
		BigInteger expr1 = default(BigInteger);
		BigInteger expr3 = default(BigInteger);

		try
		{
			dbg.EnterRule( GrammarFileName, "stat" );
			if ( RuleLevel == 0 )
			{
				dbg.Commence();
			}
			IncRuleLevel();
			dbg.Location( 56, -1 );

		try
		{
			// BuildOptions\\DebugTreeGrammar.g3:56:9: ( expr | ^( '=' ID expr ) | ^( FUNC ( . )+ ) )
			int alt3=3;
			try
			{
				dbg.EnterDecision( 3 );

			switch ( input.LA(1) )
			{
			case CALL:
			case ID:
			case INT:
			case 10:
			case 11:
			case 14:
			case 15:
			case 16:
				{
				alt3=1;
				}
				break;
			case 17:
				{
				alt3=2;
				}
				break;
			case FUNC:
				{
				alt3=3;
				}
				break;
			default:
				{
					NoViableAltException nvae = new NoViableAltException("", 3, 0, input);

					dbg.RecognitionException( nvae );
					throw nvae;
				}
			}

			}
			finally
			{
				dbg.ExitDecision( 3 );
			}

			switch ( alt3 )
			{
			case 1:
				dbg.EnterAlt( 1 );

				// BuildOptions\\DebugTreeGrammar.g3:56:9: expr
				{
				dbg.Location( 56, 8 );
				PushFollow(Follow._expr_in_stat63);
				expr1=expr();

				state._fsp--;

				dbg.Location( 56, 35 );
				 string result = expr1.ToString();
				                                     Console.Out.WriteLine(expr1 + " (about " + result[0] + "*10^" + (result.Length-1) + ")");
				                                   

				}
				break;
			case 2:
				dbg.EnterAlt( 2 );

				// BuildOptions\\DebugTreeGrammar.g3:59:9: ^( '=' ID expr )
				{
				dbg.Location( 59, 8 );
				dbg.Location( 59, 10 );
				Match(input,17,Follow._17_in_stat98); 

				Match(input, TokenTypes.Down, null); 
				dbg.Location( 59, 14 );
				ID2=(CommonTree)Match(input,ID,Follow._ID_in_stat100); 
				dbg.Location( 59, 17 );
				PushFollow(Follow._expr_in_stat102);
				expr3=expr();

				state._fsp--;


				Match(input, TokenTypes.Up, null); 
				dbg.Location( 59, 35 );
				 globalMemory[(ID2!=null?ID2.Text:null)] = expr3; 

				}
				break;
			case 3:
				dbg.EnterAlt( 3 );

				// BuildOptions\\DebugTreeGrammar.g3:60:9: ^( FUNC ( . )+ )
				{
				dbg.Location( 60, 8 );
				dbg.Location( 60, 10 );
				Match(input,FUNC,Follow._FUNC_in_stat128); 

				Match(input, TokenTypes.Down, null); 
				dbg.Location( 60, 15 );
				// BuildOptions\\DebugTreeGrammar.g3:60:16: ( . )+
				int cnt2=0;
				try
				{
					dbg.EnterSubRule( 2 );

				for ( ; ; )
				{
					int alt2=2;
					try
					{
						dbg.EnterDecision( 2 );

					int LA2_0 = input.LA(1);

					if ( ((LA2_0>=CALL && LA2_0<=17)) )
					{
						alt2=1;
					}
					else if ( (LA2_0==UP) )
					{
						alt2=2;
					}


					}
					finally
					{
						dbg.ExitDecision( 2 );
					}

					switch ( alt2 )
					{
					case 1:
						dbg.EnterAlt( 1 );

						// BuildOptions\\DebugTreeGrammar.g3:60:0: .
						{
						dbg.Location( 60, 15 );
						MatchAny(input); 

						}
						break;

					default:
						if ( cnt2 >= 1 )
							goto loop2;

						EarlyExitException eee2 = new EarlyExitException( 2, input );
						dbg.RecognitionException( eee2 );

						throw eee2;
					}
					cnt2++;
				}
				loop2:
					;

				}
				finally
				{
					dbg.ExitSubRule( 2 );
				}


				Match(input, TokenTypes.Up, null); 

				}
				break;

			}
		}
		catch ( RecognitionException re )
		{
			ReportError(re);
			Recover(input,re);
		}
		finally
		{
		}
		dbg.Location(61, 4);

		}
		finally
		{
			dbg.ExitRule( GrammarFileName, "stat" );
			DecRuleLevel();
			if ( RuleLevel == 0 )
			{
				dbg.Terminate();
			}
		}

		return ;
	}
	// $ANTLR end "stat"


	// $ANTLR start "expr"
	// BuildOptions\\DebugTreeGrammar.g3:63:0: expr returns [BigInteger value] : ( ^( '+' a= expr b= expr ) | ^( '-' a= expr b= expr ) | ^( '*' a= expr b= expr ) | ^( '/' a= expr b= expr ) | ^( '%' a= expr b= expr ) | ID | INT | call );
	private BigInteger expr(  )
	{
		BigInteger value = default(BigInteger);

		CommonTree ID4=null;
		CommonTree INT5=null;
		BigInteger a = default(BigInteger);
		BigInteger b = default(BigInteger);
		BigInteger call6 = default(BigInteger);

		try
		{
			dbg.EnterRule( GrammarFileName, "expr" );
			if ( RuleLevel == 0 )
			{
				dbg.Commence();
			}
			IncRuleLevel();
			dbg.Location( 63, -1 );

		try
		{
			// BuildOptions\\DebugTreeGrammar.g3:64:9: ( ^( '+' a= expr b= expr ) | ^( '-' a= expr b= expr ) | ^( '*' a= expr b= expr ) | ^( '/' a= expr b= expr ) | ^( '%' a= expr b= expr ) | ID | INT | call )
			int alt4=8;
			try
			{
				dbg.EnterDecision( 4 );

			switch ( input.LA(1) )
			{
			case 16:
				{
				alt4=1;
				}
				break;
			case 10:
				{
				alt4=2;
				}
				break;
			case 14:
				{
				alt4=3;
				}
				break;
			case 15:
				{
				alt4=4;
				}
				break;
			case 11:
				{
				alt4=5;
				}
				break;
			case ID:
				{
				alt4=6;
				}
				break;
			case INT:
				{
				alt4=7;
				}
				break;
			case CALL:
				{
				alt4=8;
				}
				break;
			default:
				{
					NoViableAltException nvae = new NoViableAltException("", 4, 0, input);

					dbg.RecognitionException( nvae );
					throw nvae;
				}
			}

			}
			finally
			{
				dbg.ExitDecision( 4 );
			}

			switch ( alt4 )
			{
			case 1:
				dbg.EnterAlt( 1 );

				// BuildOptions\\DebugTreeGrammar.g3:64:9: ^( '+' a= expr b= expr )
				{
				dbg.Location( 64, 8 );
				dbg.Location( 64, 10 );
				Match(input,16,Follow._16_in_expr172); 

				Match(input, TokenTypes.Down, null); 
				dbg.Location( 64, 15 );
				PushFollow(Follow._expr_in_expr176);
				a=expr();

				state._fsp--;

				dbg.Location( 64, 22 );
				PushFollow(Follow._expr_in_expr180);
				b=expr();

				state._fsp--;


				Match(input, TokenTypes.Up, null); 
				dbg.Location( 64, 35 );
				 value = a.add(b); 

				}
				break;
			case 2:
				dbg.EnterAlt( 2 );

				// BuildOptions\\DebugTreeGrammar.g3:65:9: ^( '-' a= expr b= expr )
				{
				dbg.Location( 65, 8 );
				dbg.Location( 65, 10 );
				Match(input,10,Follow._10_in_expr200); 

				Match(input, TokenTypes.Down, null); 
				dbg.Location( 65, 15 );
				PushFollow(Follow._expr_in_expr204);
				a=expr();

				state._fsp--;

				dbg.Location( 65, 22 );
				PushFollow(Follow._expr_in_expr208);
				b=expr();

				state._fsp--;


				Match(input, TokenTypes.Up, null); 
				dbg.Location( 65, 35 );
				 value = a.subtract(b); 

				}
				break;
			case 3:
				dbg.EnterAlt( 3 );

				// BuildOptions\\DebugTreeGrammar.g3:66:9: ^( '*' a= expr b= expr )
				{
				dbg.Location( 66, 8 );
				dbg.Location( 66, 10 );
				Match(input,14,Follow._14_in_expr228); 

				Match(input, TokenTypes.Down, null); 
				dbg.Location( 66, 15 );
				PushFollow(Follow._expr_in_expr232);
				a=expr();

				state._fsp--;

				dbg.Location( 66, 22 );
				PushFollow(Follow._expr_in_expr236);
				b=expr();

				state._fsp--;


				Match(input, TokenTypes.Up, null); 
				dbg.Location( 66, 35 );
				 value = a.multiply(b); 

				}
				break;
			case 4:
				dbg.EnterAlt( 4 );

				// BuildOptions\\DebugTreeGrammar.g3:67:9: ^( '/' a= expr b= expr )
				{
				dbg.Location( 67, 8 );
				dbg.Location( 67, 10 );
				Match(input,15,Follow._15_in_expr256); 

				Match(input, TokenTypes.Down, null); 
				dbg.Location( 67, 15 );
				PushFollow(Follow._expr_in_expr260);
				a=expr();

				state._fsp--;

				dbg.Location( 67, 22 );
				PushFollow(Follow._expr_in_expr264);
				b=expr();

				state._fsp--;


				Match(input, TokenTypes.Up, null); 
				dbg.Location( 67, 35 );
				 value = a.divide(b); 

				}
				break;
			case 5:
				dbg.EnterAlt( 5 );

				// BuildOptions\\DebugTreeGrammar.g3:68:9: ^( '%' a= expr b= expr )
				{
				dbg.Location( 68, 8 );
				dbg.Location( 68, 10 );
				Match(input,11,Follow._11_in_expr284); 

				Match(input, TokenTypes.Down, null); 
				dbg.Location( 68, 15 );
				PushFollow(Follow._expr_in_expr288);
				a=expr();

				state._fsp--;

				dbg.Location( 68, 22 );
				PushFollow(Follow._expr_in_expr292);
				b=expr();

				state._fsp--;


				Match(input, TokenTypes.Up, null); 
				dbg.Location( 68, 35 );
				 value = a.remainder(b); 

				}
				break;
			case 6:
				dbg.EnterAlt( 6 );

				// BuildOptions\\DebugTreeGrammar.g3:69:9: ID
				{
				dbg.Location( 69, 8 );
				ID4=(CommonTree)Match(input,ID,Follow._ID_in_expr311); 
				dbg.Location( 69, 35 );
				 value = getValue((ID4!=null?ID4.Text:null)); 

				}
				break;
			case 7:
				dbg.EnterAlt( 7 );

				// BuildOptions\\DebugTreeGrammar.g3:70:9: INT
				{
				dbg.Location( 70, 8 );
				INT5=(CommonTree)Match(input,INT,Follow._INT_in_expr347); 
				dbg.Location( 70, 35 );
				 value = new BigInteger((INT5!=null?INT5.Text:null)); 

				}
				break;
			case 8:
				dbg.EnterAlt( 8 );

				// BuildOptions\\DebugTreeGrammar.g3:71:9: call
				{
				dbg.Location( 71, 8 );
				PushFollow(Follow._call_in_expr382);
				call6=call();

				state._fsp--;

				dbg.Location( 71, 35 );
				 value = call6; 

				}
				break;

			}
		}
		catch ( RecognitionException re )
		{
			ReportError(re);
			Recover(input,re);
		}
		finally
		{
		}
		dbg.Location(72, 4);

		}
		finally
		{
			dbg.ExitRule( GrammarFileName, "expr" );
			DecRuleLevel();
			if ( RuleLevel == 0 )
			{
				dbg.Terminate();
			}
		}

		return value;
	}
	// $ANTLR end "expr"


	// $ANTLR start "call"
	// BuildOptions\\DebugTreeGrammar.g3:74:0: call returns [BigInteger value] : ^( CALL ID expr ) ;
	private BigInteger call(  )
	{
		BigInteger value = default(BigInteger);

		CommonTree ID8=null;
		BigInteger expr7 = default(BigInteger);

		try
		{
			dbg.EnterRule( GrammarFileName, "call" );
			if ( RuleLevel == 0 )
			{
				dbg.Commence();
			}
			IncRuleLevel();
			dbg.Location( 74, -1 );

		try
		{
			// BuildOptions\\DebugTreeGrammar.g3:75:9: ( ^( CALL ID expr ) )
			dbg.EnterAlt( 1 );

			// BuildOptions\\DebugTreeGrammar.g3:75:9: ^( CALL ID expr )
			{
			dbg.Location( 75, 8 );
			dbg.Location( 75, 10 );
			Match(input,CALL,Follow._CALL_in_call430); 

			Match(input, TokenTypes.Down, null); 
			dbg.Location( 75, 15 );
			ID8=(CommonTree)Match(input,ID,Follow._ID_in_call432); 
			dbg.Location( 75, 18 );
			PushFollow(Follow._expr_in_call434);
			expr7=expr();

			state._fsp--;


			Match(input, TokenTypes.Up, null); 
			dbg.Location( 75, 35 );
			 BigInteger p = expr7;
			                                     CommonTree funcRoot = findFunction((ID8!=null?ID8.Text:null), p);
			                                     if (funcRoot == null) {
			                                         Console.Error.WriteLine("No match found for " + (ID8!=null?ID8.Text:null) + "(" + p + ")");
			                                     } else {
			                                         // Here we set up the local evaluator to run over the
			                                         // function definition with the parameter value.
			                                         // This re-reads a sub-AST of our input AST!
			                                         DebugTreeGrammar e = new DebugTreeGrammar(funcRoot, functionDefinitions, globalMemory, p);
			                                         value = e.expr();
			                                     }
			                                   

			}

		}
		catch ( RecognitionException re )
		{
			ReportError(re);
			Recover(input,re);
		}
		finally
		{
		}
		dbg.Location(87, 4);

		}
		finally
		{
			dbg.ExitRule( GrammarFileName, "call" );
			DecRuleLevel();
			if ( RuleLevel == 0 )
			{
				dbg.Terminate();
			}
		}

		return value;
	}
	// $ANTLR end "call"
	#endregion Rules


	#region Follow sets
	private static class Follow
	{
		public static readonly BitSet _stat_in_prog48 = new BitSet(new ulong[]{0x3CCF2UL});
		public static readonly BitSet _expr_in_stat63 = new BitSet(new ulong[]{0x2UL});
		public static readonly BitSet _17_in_stat98 = new BitSet(new ulong[]{0x4UL});
		public static readonly BitSet _ID_in_stat100 = new BitSet(new ulong[]{0x1CCD0UL});
		public static readonly BitSet _expr_in_stat102 = new BitSet(new ulong[]{0x8UL});
		public static readonly BitSet _FUNC_in_stat128 = new BitSet(new ulong[]{0x4UL});
		public static readonly BitSet _16_in_expr172 = new BitSet(new ulong[]{0x4UL});
		public static readonly BitSet _expr_in_expr176 = new BitSet(new ulong[]{0x1CCD0UL});
		public static readonly BitSet _expr_in_expr180 = new BitSet(new ulong[]{0x8UL});
		public static readonly BitSet _10_in_expr200 = new BitSet(new ulong[]{0x4UL});
		public static readonly BitSet _expr_in_expr204 = new BitSet(new ulong[]{0x1CCD0UL});
		public static readonly BitSet _expr_in_expr208 = new BitSet(new ulong[]{0x8UL});
		public static readonly BitSet _14_in_expr228 = new BitSet(new ulong[]{0x4UL});
		public static readonly BitSet _expr_in_expr232 = new BitSet(new ulong[]{0x1CCD0UL});
		public static readonly BitSet _expr_in_expr236 = new BitSet(new ulong[]{0x8UL});
		public static readonly BitSet _15_in_expr256 = new BitSet(new ulong[]{0x4UL});
		public static readonly BitSet _expr_in_expr260 = new BitSet(new ulong[]{0x1CCD0UL});
		public static readonly BitSet _expr_in_expr264 = new BitSet(new ulong[]{0x8UL});
		public static readonly BitSet _11_in_expr284 = new BitSet(new ulong[]{0x4UL});
		public static readonly BitSet _expr_in_expr288 = new BitSet(new ulong[]{0x1CCD0UL});
		public static readonly BitSet _expr_in_expr292 = new BitSet(new ulong[]{0x8UL});
		public static readonly BitSet _ID_in_expr311 = new BitSet(new ulong[]{0x2UL});
		public static readonly BitSet _INT_in_expr347 = new BitSet(new ulong[]{0x2UL});
		public static readonly BitSet _call_in_expr382 = new BitSet(new ulong[]{0x2UL});
		public static readonly BitSet _CALL_in_call430 = new BitSet(new ulong[]{0x4UL});
		public static readonly BitSet _ID_in_call432 = new BitSet(new ulong[]{0x1CCD0UL});
		public static readonly BitSet _expr_in_call434 = new BitSet(new ulong[]{0x8UL});

	}
	#endregion Follow sets
}
