// $ANTLR start "program"
    // MathExpr.g:148:1: program : ( exprOrFuncDecl ( ';' )* )* ;
    public MathExprParser.program_return program() // throws RecognitionException [1]
    {   
        MathExprParser.program_return retval = new MathExprParser.program_return();
        retval.Start = input.LT(1);
        int program_StartIndex = input.Index();
        AstNode root_0 = null;

        IToken char_literal107 = null;
        MathExprParser.exprOrFuncDecl_return exprOrFuncDecl106 = default(MathExprParser.exprOrFuncDecl_return);


        AstNode char_literal107_tree=null;

        try 
    	{
    	    if ( (state.backtracking > 0) && AlreadyParsedRule(input, 24) ) 
    	    {
    	    	return retval; 
    	    }
            // MathExpr.g:148:8: ( ( exprOrFuncDecl ( ';' )* )* )
            // MathExpr.g:148:10: ( exprOrFuncDecl ( ';' )* )*
            {
            	root_0 = (AstNode)adaptor.GetNilNode();

            	// MathExpr.g:148:10: ( exprOrFuncDecl ( ';' )* )*
            	do 
            	{
            	    int alt26 = 2;
            	    int LA26_0 = input.LA(1);

            	    if ( (LA26_0 == IF || (LA26_0 >= FOR && LA26_0 <= REPEAT) || LA26_0 == RETURN || LA26_0 == IDENT || LA26_0 == 53) )
            	    {
            	        alt26 = 1;
            	    }


            	    switch (alt26) 
            		{
            			case 1 :
            			    // MathExpr.g:148:12: exprOrFuncDecl ( ';' )*
            			    {
            			    	PushFollow(FOLLOW_exprOrFuncDecl_in_program1564);
            			    	exprOrFuncDecl106 = exprOrFuncDecl();
            			    	state.followingStackPointer--;
            			    	if (state.failed) return retval;
            			    	if ( state.backtracking == 0 ) adaptor.AddChild(root_0, exprOrFuncDecl106.Tree);
            			    	// MathExpr.g:148:30: ( ';' )*
            			    	do 
            			    	{
            			    	    int alt25 = 2;
            			    	    int LA25_0 = input.LA(1);

            			    	    if ( (LA25_0 == 55) )
            			    	    {
            			    	        alt25 = 1;
            			    	    }


            			    	    switch (alt25) 
            			    		{
            			    			case 1 :
            			    			    // MathExpr.g:0:0: ';'
            			    			    {
            			    			    	char_literal107=(IToken)Match(input,55,FOLLOW_55_in_program1566); if (state.failed) return retval;

            			    			    }
            			    			    break;

            			    			default:
            			    			    goto loop25;
            			    	    }
            			    	} while (true);

            			    	loop25:
            			    		;	// Stops C# compiler whining that label 'loop25' has no statements


            			    }
            			    break;

            			default:
            			    goto loop26;
            	    }
            	} while (true);

            	loop26:
            		;	// Stops C# compiler whining that label 'loop26' has no statements


            }

            retval.Stop = input.LT(-1);

            if ( (state.backtracking==0) )
            {	retval.Tree = (AstNode)adaptor.RulePostProcessing(root_0);
            	adaptor.SetTokenBoundaries(retval.Tree, (IToken) retval.Start, (IToken) retval.Stop);}
        }
        catch (RecognitionException re) 
    	{
            ReportError(re);
            Recover(input,re);
    	// Conversion of the second argument necessary, but harmless
    	retval.Tree = (AstNode)adaptor.ErrorNode(input, (IToken) retval.Start, input.LT(-1), re);

        }
        finally 
    	{
            if ( state.backtracking > 0 ) 
            {
            	Memoize(input, 24, program_StartIndex); 
            }
        }
        return retval;
    }
    // $ANTLR start "program"
    // antlr_temp_dir\\MathExpr.g:91:1: program : ( expr )* ;
    public MathExprParser.program_return program() // throws RecognitionException [1]
    {   
        MathExprParser.program_return retval = new MathExprParser.program_return();
        retval.Start = input.LT(1);

        object root_0 = null;

        MathExprParser.expr_return expr18 = default(MathExprParser.expr_return);



        try 
    	{
            // antlr_temp_dir\\MathExpr.g:91:8: ( ( expr )* )
            // antlr_temp_dir\\MathExpr.g:91:10: ( expr )*
            {
            	root_0 = (object)adaptor.GetNilNode();

            	// antlr_temp_dir\\MathExpr.g:91:10: ( expr )*
            	do 
            	{
            	    int alt5 = 2;
            	    int LA5_0 = input.LA(1);

            	    if ( (LA5_0 == PRINT || LA5_0 == IDENT) )
            	    {
            	        alt5 = 1;
            	    }


            	    switch (alt5) 
            		{
            			case 1 :
            			    // antlr_temp_dir\\MathExpr.g:91:10: expr
            			    {
            			    	PushFollow(FOLLOW_expr_in_program483);
            			    	expr18 = expr();
            			    	state.followingStackPointer--;

            			    	adaptor.AddChild(root_0, expr18.Tree);

            			    }
            			    break;

            			default:
            			    goto loop5;
            	    }
            	} while (true);

            	loop5:
            		;	// Stops C# compiler whining that label 'loop5' has no statements


            }

            retval.Stop = input.LT(-1);

            	retval.Tree = (object)adaptor.RulePostProcessing(root_0);
            	adaptor.SetTokenBoundaries(retval.Tree, (IToken) retval.Start, (IToken) retval.Stop);
        }
        catch (RecognitionException re) 
    	{
            ReportError(re);
            Recover(input,re);
    	// Conversion of the second argument necessary, but harmless
    	retval.Tree = (object)adaptor.ErrorNode(input, (IToken) retval.Start, input.LT(-1), re);

        }
        finally 
    	{
        }
        return retval;
    }
    // $ANTLR start "program"
    // MathExpr.g:208:1: program : exprList ;
    public MathExprParser.program_return program() // throws RecognitionException [1]
    {   
        MathExprParser.program_return retval = new MathExprParser.program_return();
        retval.Start = input.LT(1);
        int program_StartIndex = input.Index();
        AstNode root_0 = null;

        MathExprParser.exprList_return exprList178 = default(MathExprParser.exprList_return);



        try 
    	{
    	    if ( (state.backtracking > 0) && AlreadyParsedRule(input, 26) ) 
    	    {
    	    	return retval; 
    	    }
            // MathExpr.g:208:8: ( exprList )
            // MathExpr.g:208:11: exprList
            {
            	root_0 = (AstNode)adaptor.GetNilNode();

            	PushFollow(FOLLOW_exprList_in_program2093);
            	exprList178 = exprList();
            	state.followingStackPointer--;
            	if (state.failed) return retval;
            	if ( state.backtracking == 0 ) adaptor.AddChild(root_0, exprList178.Tree);

            }

            retval.Stop = input.LT(-1);

            if ( (state.backtracking==0) )
            {	retval.Tree = (AstNode)adaptor.RulePostProcessing(root_0);
            	adaptor.SetTokenBoundaries(retval.Tree, (IToken) retval.Start, (IToken) retval.Stop);}
        }
        catch (RecognitionException re) 
    	{
            ReportError(re);
            Recover(input,re);
    	// Conversion of the second argument necessary, but harmless
    	retval.Tree = (AstNode)adaptor.ErrorNode(input, (IToken) retval.Start, input.LT(-1), re);

        }
        finally 
    	{
            if ( state.backtracking > 0 ) 
            {
            	Memoize(input, 26, program_StartIndex); 
            }
        }
        return retval;
    }