// $ANTLR start "fromJoin"
    // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:239:1: fromJoin : ( ( ( ( LEFT | RIGHT ) ( OUTER )? ) | FULL | INNER )? JOIN ( FETCH )? path ( asAlias )? ( propertyFetch )? ( withClause )? | ( ( ( LEFT | RIGHT ) ( OUTER )? ) | FULL | INNER )? JOIN ( FETCH )? ELEMENTS OPEN path CLOSE ( asAlias )? ( propertyFetch )? ( withClause )? );
    public HqlParser.fromJoin_return fromJoin() // throws RecognitionException [1]
    {   
        HqlParser.fromJoin_return retval = new HqlParser.fromJoin_return();
        retval.Start = input.LT(1);

        IASTNode root_0 = null;

        IToken set59 = null;
        IToken OUTER60 = null;
        IToken FULL61 = null;
        IToken INNER62 = null;
        IToken JOIN63 = null;
        IToken FETCH64 = null;
        IToken set69 = null;
        IToken OUTER70 = null;
        IToken FULL71 = null;
        IToken INNER72 = null;
        IToken JOIN73 = null;
        IToken FETCH74 = null;
        IToken ELEMENTS75 = null;
        IToken OPEN76 = null;
        IToken CLOSE78 = null;
        HqlParser.path_return path65 = default(HqlParser.path_return);

        HqlParser.asAlias_return asAlias66 = default(HqlParser.asAlias_return);

        HqlParser.propertyFetch_return propertyFetch67 = default(HqlParser.propertyFetch_return);

        HqlParser.withClause_return withClause68 = default(HqlParser.withClause_return);

        HqlParser.path_return path77 = default(HqlParser.path_return);

        HqlParser.asAlias_return asAlias79 = default(HqlParser.asAlias_return);

        HqlParser.propertyFetch_return propertyFetch80 = default(HqlParser.propertyFetch_return);

        HqlParser.withClause_return withClause81 = default(HqlParser.withClause_return);


        IASTNode set59_tree=null;
        IASTNode OUTER60_tree=null;
        IASTNode FULL61_tree=null;
        IASTNode INNER62_tree=null;
        IASTNode JOIN63_tree=null;
        IASTNode FETCH64_tree=null;
        IASTNode set69_tree=null;
        IASTNode OUTER70_tree=null;
        IASTNode FULL71_tree=null;
        IASTNode INNER72_tree=null;
        IASTNode JOIN73_tree=null;
        IASTNode FETCH74_tree=null;
        IASTNode ELEMENTS75_tree=null;
        IASTNode OPEN76_tree=null;
        IASTNode CLOSE78_tree=null;

        try 
    	{
            // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:2: ( ( ( ( LEFT | RIGHT ) ( OUTER )? ) | FULL | INNER )? JOIN ( FETCH )? path ( asAlias )? ( propertyFetch )? ( withClause )? | ( ( ( LEFT | RIGHT ) ( OUTER )? ) | FULL | INNER )? JOIN ( FETCH )? ELEMENTS OPEN path CLOSE ( asAlias )? ( propertyFetch )? ( withClause )? )
            int alt29 = 2;
            switch ( input.LA(1) ) 
            {
            case LEFT:
            case RIGHT:
            	{
                int LA29_1 = input.LA(2);

                if ( (LA29_1 == OUTER) )
                {
                    int LA29_5 = input.LA(3);

                    if ( (LA29_5 == JOIN) )
                    {
                        switch ( input.LA(4) ) 
                        {
                        case FETCH:
                        	{
                            int LA29_6 = input.LA(5);

                            if ( (LA29_6 == ELEMENTS) )
                            {
                                alt29 = 2;
                            }
                            else if ( (LA29_6 == IDENT) )
                            {
                                alt29 = 1;
                            }
                            else 
                            {
                                NoViableAltException nvae_d29s6 =
                                    new NoViableAltException("", 29, 6, input);

                                throw nvae_d29s6;
                            }
                            }
                            break;
                        case IDENT:
                        	{
                            alt29 = 1;
                            }
                            break;
                        case ELEMENTS:
                        	{
                            alt29 = 2;
                            }
                            break;
                        	default:
                        	    NoViableAltException nvae_d29s4 =
                        	        new NoViableAltException("", 29, 4, input);

                        	    throw nvae_d29s4;
                        }

                    }
                    else 
                    {
                        NoViableAltException nvae_d29s5 =
                            new NoViableAltException("", 29, 5, input);

                        throw nvae_d29s5;
                    }
                }
                else if ( (LA29_1 == JOIN) )
                {
                    switch ( input.LA(3) ) 
                    {
                    case FETCH:
                    	{
                        int LA29_6 = input.LA(4);

                        if ( (LA29_6 == ELEMENTS) )
                        {
                            alt29 = 2;
                        }
                        else if ( (LA29_6 == IDENT) )
                        {
                            alt29 = 1;
                        }
                        else 
                        {
                            NoViableAltException nvae_d29s6 =
                                new NoViableAltException("", 29, 6, input);

                            throw nvae_d29s6;
                        }
                        }
                        break;
                    case IDENT:
                    	{
                        alt29 = 1;
                        }
                        break;
                    case ELEMENTS:
                    	{
                        alt29 = 2;
                        }
                        break;
                    	default:
                    	    NoViableAltException nvae_d29s4 =
                    	        new NoViableAltException("", 29, 4, input);

                    	    throw nvae_d29s4;
                    }

                }
                else 
                {
                    NoViableAltException nvae_d29s1 =
                        new NoViableAltException("", 29, 1, input);

                    throw nvae_d29s1;
                }
                }
                break;
            case FULL:
            	{
                int LA29_2 = input.LA(2);

                if ( (LA29_2 == JOIN) )
                {
                    switch ( input.LA(3) ) 
                    {
                    case FETCH:
                    	{
                        int LA29_6 = input.LA(4);

                        if ( (LA29_6 == ELEMENTS) )
                        {
                            alt29 = 2;
                        }
                        else if ( (LA29_6 == IDENT) )
                        {
                            alt29 = 1;
                        }
                        else 
                        {
                            NoViableAltException nvae_d29s6 =
                                new NoViableAltException("", 29, 6, input);

                            throw nvae_d29s6;
                        }
                        }
                        break;
                    case IDENT:
                    	{
                        alt29 = 1;
                        }
                        break;
                    case ELEMENTS:
                    	{
                        alt29 = 2;
                        }
                        break;
                    	default:
                    	    NoViableAltException nvae_d29s4 =
                    	        new NoViableAltException("", 29, 4, input);

                    	    throw nvae_d29s4;
                    }

                }
                else 
                {
                    NoViableAltException nvae_d29s2 =
                        new NoViableAltException("", 29, 2, input);

                    throw nvae_d29s2;
                }
                }
                break;
            case INNER:
            	{
                int LA29_3 = input.LA(2);

                if ( (LA29_3 == JOIN) )
                {
                    switch ( input.LA(3) ) 
                    {
                    case FETCH:
                    	{
                        int LA29_6 = input.LA(4);

                        if ( (LA29_6 == ELEMENTS) )
                        {
                            alt29 = 2;
                        }
                        else if ( (LA29_6 == IDENT) )
                        {
                            alt29 = 1;
                        }
                        else 
                        {
                            NoViableAltException nvae_d29s6 =
                                new NoViableAltException("", 29, 6, input);

                            throw nvae_d29s6;
                        }
                        }
                        break;
                    case IDENT:
                    	{
                        alt29 = 1;
                        }
                        break;
                    case ELEMENTS:
                    	{
                        alt29 = 2;
                        }
                        break;
                    	default:
                    	    NoViableAltException nvae_d29s4 =
                    	        new NoViableAltException("", 29, 4, input);

                    	    throw nvae_d29s4;
                    }

                }
                else 
                {
                    NoViableAltException nvae_d29s3 =
                        new NoViableAltException("", 29, 3, input);

                    throw nvae_d29s3;
                }
                }
                break;
            case JOIN:
            	{
                switch ( input.LA(2) ) 
                {
                case FETCH:
                	{
                    int LA29_6 = input.LA(3);

                    if ( (LA29_6 == ELEMENTS) )
                    {
                        alt29 = 2;
                    }
                    else if ( (LA29_6 == IDENT) )
                    {
                        alt29 = 1;
                    }
                    else 
                    {
                        NoViableAltException nvae_d29s6 =
                            new NoViableAltException("", 29, 6, input);

                        throw nvae_d29s6;
                    }
                    }
                    break;
                case IDENT:
                	{
                    alt29 = 1;
                    }
                    break;
                case ELEMENTS:
                	{
                    alt29 = 2;
                    }
                    break;
                	default:
                	    NoViableAltException nvae_d29s4 =
                	        new NoViableAltException("", 29, 4, input);

                	    throw nvae_d29s4;
                }

                }
                break;
            	default:
            	    NoViableAltException nvae_d29s0 =
            	        new NoViableAltException("", 29, 0, input);

            	    throw nvae_d29s0;
            }

            switch (alt29) 
            {
                case 1 :
                    // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:4: ( ( ( LEFT | RIGHT ) ( OUTER )? ) | FULL | INNER )? JOIN ( FETCH )? path ( asAlias )? ( propertyFetch )? ( withClause )?
                    {
                    	root_0 = (IASTNode)adaptor.GetNilNode();

                    	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:4: ( ( ( LEFT | RIGHT ) ( OUTER )? ) | FULL | INNER )?
                    	int alt18 = 4;
                    	switch ( input.LA(1) ) 
                    	{
                    	    case LEFT:
                    	    case RIGHT:
                    	    	{
                    	        alt18 = 1;
                    	        }
                    	        break;
                    	    case FULL:
                    	    	{
                    	        alt18 = 2;
                    	        }
                    	        break;
                    	    case INNER:
                    	    	{
                    	        alt18 = 3;
                    	        }
                    	        break;
                    	}

                    	switch (alt18) 
                    	{
                    	    case 1 :
                    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:6: ( ( LEFT | RIGHT ) ( OUTER )? )
                    	        {
                    	        	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:6: ( ( LEFT | RIGHT ) ( OUTER )? )
                    	        	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:8: ( LEFT | RIGHT ) ( OUTER )?
                    	        	{
                    	        		set59 = (IToken)input.LT(1);
                    	        		if ( input.LA(1) == LEFT || input.LA(1) == RIGHT ) 
                    	        		{
                    	        		    input.Consume();
                    	        		    adaptor.AddChild(root_0, (IASTNode)adaptor.Create(set59));
                    	        		    state.errorRecovery = false;
                    	        		}
                    	        		else 
                    	        		{
                    	        		    MismatchedSetException mse = new MismatchedSetException(null,input);
                    	        		    throw mse;
                    	        		}

                    	        		// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:25: ( OUTER )?
                    	        		int alt17 = 2;
                    	        		int LA17_0 = input.LA(1);

                    	        		if ( (LA17_0 == OUTER) )
                    	        		{
                    	        		    alt17 = 1;
                    	        		}
                    	        		switch (alt17) 
                    	        		{
                    	        		    case 1 :
                    	        		        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:26: OUTER
                    	        		        {
                    	        		        	OUTER60=(IToken)Match(input,OUTER,FOLLOW_OUTER_in_fromJoin1140); 
                    	        		        		OUTER60_tree = (IASTNode)adaptor.Create(OUTER60);
                    	        		        		adaptor.AddChild(root_0, OUTER60_tree);


                    	        		        }
                    	        		        break;

                    	        		}


                    	        	}


                    	        }
                    	        break;
                    	    case 2 :
                    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:38: FULL
                    	        {
                    	        	FULL61=(IToken)Match(input,FULL,FOLLOW_FULL_in_fromJoin1148); 
                    	        		FULL61_tree = (IASTNode)adaptor.Create(FULL61);
                    	        		adaptor.AddChild(root_0, FULL61_tree);


                    	        }
                    	        break;
                    	    case 3 :
                    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:45: INNER
                    	        {
                    	        	INNER62=(IToken)Match(input,INNER,FOLLOW_INNER_in_fromJoin1152); 
                    	        		INNER62_tree = (IASTNode)adaptor.Create(INNER62);
                    	        		adaptor.AddChild(root_0, INNER62_tree);


                    	        }
                    	        break;

                    	}

                    	JOIN63=(IToken)Match(input,JOIN,FOLLOW_JOIN_in_fromJoin1157); 
                    		JOIN63_tree = (IASTNode)adaptor.Create(JOIN63);
                    		root_0 = (IASTNode)adaptor.BecomeRoot(JOIN63_tree, root_0);

                    	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:60: ( FETCH )?
                    	int alt19 = 2;
                    	int LA19_0 = input.LA(1);

                    	if ( (LA19_0 == FETCH) )
                    	{
                    	    alt19 = 1;
                    	}
                    	switch (alt19) 
                    	{
                    	    case 1 :
                    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:61: FETCH
                    	        {
                    	        	FETCH64=(IToken)Match(input,FETCH,FOLLOW_FETCH_in_fromJoin1161); 
                    	        		FETCH64_tree = (IASTNode)adaptor.Create(FETCH64);
                    	        		adaptor.AddChild(root_0, FETCH64_tree);


                    	        }
                    	        break;

                    	}

                    	PushFollow(FOLLOW_path_in_fromJoin1165);
                    	path65 = path();
                    	state.followingStackPointer--;

                    	adaptor.AddChild(root_0, path65.Tree);
                    	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:74: ( asAlias )?
                    	int alt20 = 2;
                    	int LA20_0 = input.LA(1);

                    	if ( (LA20_0 == AS || LA20_0 == IDENT) )
                    	{
                    	    alt20 = 1;
                    	}
                    	switch (alt20) 
                    	{
                    	    case 1 :
                    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:75: asAlias
                    	        {
                    	        	PushFollow(FOLLOW_asAlias_in_fromJoin1168);
                    	        	asAlias66 = asAlias();
                    	        	state.followingStackPointer--;

                    	        	adaptor.AddChild(root_0, asAlias66.Tree);

                    	        }
                    	        break;

                    	}

                    	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:85: ( propertyFetch )?
                    	int alt21 = 2;
                    	int LA21_0 = input.LA(1);

                    	if ( (LA21_0 == FETCH) )
                    	{
                    	    alt21 = 1;
                    	}
                    	switch (alt21) 
                    	{
                    	    case 1 :
                    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:86: propertyFetch
                    	        {
                    	        	PushFollow(FOLLOW_propertyFetch_in_fromJoin1173);
                    	        	propertyFetch67 = propertyFetch();
                    	        	state.followingStackPointer--;

                    	        	adaptor.AddChild(root_0, propertyFetch67.Tree);

                    	        }
                    	        break;

                    	}

                    	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:102: ( withClause )?
                    	int alt22 = 2;
                    	int LA22_0 = input.LA(1);

                    	if ( (LA22_0 == WITH) )
                    	{
                    	    alt22 = 1;
                    	}
                    	switch (alt22) 
                    	{
                    	    case 1 :
                    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:240:103: withClause
                    	        {
                    	        	PushFollow(FOLLOW_withClause_in_fromJoin1178);
                    	        	withClause68 = withClause();
                    	        	state.followingStackPointer--;

                    	        	adaptor.AddChild(root_0, withClause68.Tree);

                    	        }
                    	        break;

                    	}


                    }
                    break;
                case 2 :
                    // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:4: ( ( ( LEFT | RIGHT ) ( OUTER )? ) | FULL | INNER )? JOIN ( FETCH )? ELEMENTS OPEN path CLOSE ( asAlias )? ( propertyFetch )? ( withClause )?
                    {
                    	root_0 = (IASTNode)adaptor.GetNilNode();

                    	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:4: ( ( ( LEFT | RIGHT ) ( OUTER )? ) | FULL | INNER )?
                    	int alt24 = 4;
                    	switch ( input.LA(1) ) 
                    	{
                    	    case LEFT:
                    	    case RIGHT:
                    	    	{
                    	        alt24 = 1;
                    	        }
                    	        break;
                    	    case FULL:
                    	    	{
                    	        alt24 = 2;
                    	        }
                    	        break;
                    	    case INNER:
                    	    	{
                    	        alt24 = 3;
                    	        }
                    	        break;
                    	}

                    	switch (alt24) 
                    	{
                    	    case 1 :
                    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:6: ( ( LEFT | RIGHT ) ( OUTER )? )
                    	        {
                    	        	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:6: ( ( LEFT | RIGHT ) ( OUTER )? )
                    	        	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:8: ( LEFT | RIGHT ) ( OUTER )?
                    	        	{
                    	        		set69 = (IToken)input.LT(1);
                    	        		if ( input.LA(1) == LEFT || input.LA(1) == RIGHT ) 
                    	        		{
                    	        		    input.Consume();
                    	        		    adaptor.AddChild(root_0, (IASTNode)adaptor.Create(set69));
                    	        		    state.errorRecovery = false;
                    	        		}
                    	        		else 
                    	        		{
                    	        		    MismatchedSetException mse = new MismatchedSetException(null,input);
                    	        		    throw mse;
                    	        		}

                    	        		// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:25: ( OUTER )?
                    	        		int alt23 = 2;
                    	        		int LA23_0 = input.LA(1);

                    	        		if ( (LA23_0 == OUTER) )
                    	        		{
                    	        		    alt23 = 1;
                    	        		}
                    	        		switch (alt23) 
                    	        		{
                    	        		    case 1 :
                    	        		        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:26: OUTER
                    	        		        {
                    	        		        	OUTER70=(IToken)Match(input,OUTER,FOLLOW_OUTER_in_fromJoin1200); 
                    	        		        		OUTER70_tree = (IASTNode)adaptor.Create(OUTER70);
                    	        		        		adaptor.AddChild(root_0, OUTER70_tree);


                    	        		        }
                    	        		        break;

                    	        		}


                    	        	}


                    	        }
                    	        break;
                    	    case 2 :
                    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:38: FULL
                    	        {
                    	        	FULL71=(IToken)Match(input,FULL,FOLLOW_FULL_in_fromJoin1208); 
                    	        		FULL71_tree = (IASTNode)adaptor.Create(FULL71);
                    	        		adaptor.AddChild(root_0, FULL71_tree);


                    	        }
                    	        break;
                    	    case 3 :
                    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:45: INNER
                    	        {
                    	        	INNER72=(IToken)Match(input,INNER,FOLLOW_INNER_in_fromJoin1212); 
                    	        		INNER72_tree = (IASTNode)adaptor.Create(INNER72);
                    	        		adaptor.AddChild(root_0, INNER72_tree);


                    	        }
                    	        break;

                    	}

                    	JOIN73=(IToken)Match(input,JOIN,FOLLOW_JOIN_in_fromJoin1217); 
                    		JOIN73_tree = (IASTNode)adaptor.Create(JOIN73);
                    		root_0 = (IASTNode)adaptor.BecomeRoot(JOIN73_tree, root_0);

                    	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:60: ( FETCH )?
                    	int alt25 = 2;
                    	int LA25_0 = input.LA(1);

                    	if ( (LA25_0 == FETCH) )
                    	{
                    	    alt25 = 1;
                    	}
                    	switch (alt25) 
                    	{
                    	    case 1 :
                    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:61: FETCH
                    	        {
                    	        	FETCH74=(IToken)Match(input,FETCH,FOLLOW_FETCH_in_fromJoin1221); 
                    	        		FETCH74_tree = (IASTNode)adaptor.Create(FETCH74);
                    	        		adaptor.AddChild(root_0, FETCH74_tree);


                    	        }
                    	        break;

                    	}

                    	ELEMENTS75=(IToken)Match(input,ELEMENTS,FOLLOW_ELEMENTS_in_fromJoin1225); 
                    	OPEN76=(IToken)Match(input,OPEN,FOLLOW_OPEN_in_fromJoin1228); 
                    	PushFollow(FOLLOW_path_in_fromJoin1231);
                    	path77 = path();
                    	state.followingStackPointer--;

                    	adaptor.AddChild(root_0, path77.Tree);
                    	CLOSE78=(IToken)Match(input,CLOSE,FOLLOW_CLOSE_in_fromJoin1233); 
                    	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:97: ( asAlias )?
                    	int alt26 = 2;
                    	int LA26_0 = input.LA(1);

                    	if ( (LA26_0 == AS || LA26_0 == IDENT) )
                    	{
                    	    alt26 = 1;
                    	}
                    	switch (alt26) 
                    	{
                    	    case 1 :
                    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:98: asAlias
                    	        {
                    	        	PushFollow(FOLLOW_asAlias_in_fromJoin1237);
                    	        	asAlias79 = asAlias();
                    	        	state.followingStackPointer--;

                    	        	adaptor.AddChild(root_0, asAlias79.Tree);

                    	        }
                    	        break;

                    	}

                    	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:108: ( propertyFetch )?
                    	int alt27 = 2;
                    	int LA27_0 = input.LA(1);

                    	if ( (LA27_0 == FETCH) )
                    	{
                    	    alt27 = 1;
                    	}
                    	switch (alt27) 
                    	{
                    	    case 1 :
                    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:109: propertyFetch
                    	        {
                    	        	PushFollow(FOLLOW_propertyFetch_in_fromJoin1242);
                    	        	propertyFetch80 = propertyFetch();
                    	        	state.followingStackPointer--;

                    	        	adaptor.AddChild(root_0, propertyFetch80.Tree);

                    	        }
                    	        break;

                    	}

                    	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:125: ( withClause )?
                    	int alt28 = 2;
                    	int LA28_0 = input.LA(1);

                    	if ( (LA28_0 == WITH) )
                    	{
                    	    alt28 = 1;
                    	}
                    	switch (alt28) 
                    	{
                    	    case 1 :
                    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:241:126: withClause
                    	        {
                    	        	PushFollow(FOLLOW_withClause_in_fromJoin1247);
                    	        	withClause81 = withClause();
                    	        	state.followingStackPointer--;

                    	        	adaptor.AddChild(root_0, withClause81.Tree);

                    	        }
                    	        break;

                    	}


                    }
                    break;

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

            	retval.Tree = (IASTNode)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 = (IASTNode)adaptor.ErrorNode(input, (IToken) retval.Start, input.LT(-1), re);

        }
        finally 
    	{
        }
        return retval;
    }
    // $ANTLR start "fromJoin"
    // Hql.g:245:1: fromJoin : ( ( ( ( LEFT | RIGHT ) ( OUTER )? ) | FULL | INNER )? JOIN ( FETCH )? path ( asAlias )? ( propertyFetch )? ( withClause )? | ( ( ( LEFT | RIGHT ) ( OUTER )? ) | FULL | INNER )? JOIN ( FETCH )? ELEMENTS OPEN path CLOSE ( asAlias )? ( propertyFetch )? ( withClause )? );
    public HqlParser.fromJoin_return fromJoin() // throws RecognitionException [1]
    {   
        HqlParser.fromJoin_return retval = new HqlParser.fromJoin_return();
        retval.Start = input.LT(1);

        IASTNode root_0 = null;

        IToken set63 = null;
        IToken OUTER64 = null;
        IToken FULL65 = null;
        IToken INNER66 = null;
        IToken JOIN67 = null;
        IToken FETCH68 = null;
        IToken set73 = null;
        IToken OUTER74 = null;
        IToken FULL75 = null;
        IToken INNER76 = null;
        IToken JOIN77 = null;
        IToken FETCH78 = null;
        IToken ELEMENTS79 = null;
        IToken OPEN80 = null;
        IToken CLOSE82 = null;
        HqlParser.path_return path69 = default(HqlParser.path_return);

        HqlParser.asAlias_return asAlias70 = default(HqlParser.asAlias_return);

        HqlParser.propertyFetch_return propertyFetch71 = default(HqlParser.propertyFetch_return);

        HqlParser.withClause_return withClause72 = default(HqlParser.withClause_return);

        HqlParser.path_return path81 = default(HqlParser.path_return);

        HqlParser.asAlias_return asAlias83 = default(HqlParser.asAlias_return);

        HqlParser.propertyFetch_return propertyFetch84 = default(HqlParser.propertyFetch_return);

        HqlParser.withClause_return withClause85 = default(HqlParser.withClause_return);


        IASTNode set63_tree=null;
        IASTNode OUTER64_tree=null;
        IASTNode FULL65_tree=null;
        IASTNode INNER66_tree=null;
        IASTNode JOIN67_tree=null;
        IASTNode FETCH68_tree=null;
        IASTNode set73_tree=null;
        IASTNode OUTER74_tree=null;
        IASTNode FULL75_tree=null;
        IASTNode INNER76_tree=null;
        IASTNode JOIN77_tree=null;
        IASTNode FETCH78_tree=null;
        IASTNode ELEMENTS79_tree=null;
        IASTNode OPEN80_tree=null;
        IASTNode CLOSE82_tree=null;

        try 
    	{
            // Hql.g:246:2: ( ( ( ( LEFT | RIGHT ) ( OUTER )? ) | FULL | INNER )? JOIN ( FETCH )? path ( asAlias )? ( propertyFetch )? ( withClause )? | ( ( ( LEFT | RIGHT ) ( OUTER )? ) | FULL | INNER )? JOIN ( FETCH )? ELEMENTS OPEN path CLOSE ( asAlias )? ( propertyFetch )? ( withClause )? )
            int alt32 = 2;
            switch ( input.LA(1) ) 
            {
            case LEFT:
            case RIGHT:
            	{
                int LA32_1 = input.LA(2);

                if ( (LA32_1 == OUTER) )
                {
                    int LA32_5 = input.LA(3);

                    if ( (LA32_5 == JOIN) )
                    {
                        switch ( input.LA(4) ) 
                        {
                        case FETCH:
                        	{
                            int LA32_6 = input.LA(5);

                            if ( (LA32_6 == ELEMENTS) )
                            {
                                alt32 = 2;
                            }
                            else if ( (LA32_6 == IDENT) )
                            {
                                alt32 = 1;
                            }
                            else 
                            {
                                NoViableAltException nvae_d32s6 =
                                    new NoViableAltException("", 32, 6, input);

                                throw nvae_d32s6;
                            }
                            }
                            break;
                        case ELEMENTS:
                        	{
                            alt32 = 2;
                            }
                            break;
                        case IDENT:
                        	{
                            alt32 = 1;
                            }
                            break;
                        	default:
                        	    NoViableAltException nvae_d32s4 =
                        	        new NoViableAltException("", 32, 4, input);

                        	    throw nvae_d32s4;
                        }

                    }
                    else 
                    {
                        NoViableAltException nvae_d32s5 =
                            new NoViableAltException("", 32, 5, input);

                        throw nvae_d32s5;
                    }
                }
                else if ( (LA32_1 == JOIN) )
                {
                    switch ( input.LA(3) ) 
                    {
                    case FETCH:
                    	{
                        int LA32_6 = input.LA(4);

                        if ( (LA32_6 == ELEMENTS) )
                        {
                            alt32 = 2;
                        }
                        else if ( (LA32_6 == IDENT) )
                        {
                            alt32 = 1;
                        }
                        else 
                        {
                            NoViableAltException nvae_d32s6 =
                                new NoViableAltException("", 32, 6, input);

                            throw nvae_d32s6;
                        }
                        }
                        break;
                    case ELEMENTS:
                    	{
                        alt32 = 2;
                        }
                        break;
                    case IDENT:
                    	{
                        alt32 = 1;
                        }
                        break;
                    	default:
                    	    NoViableAltException nvae_d32s4 =
                    	        new NoViableAltException("", 32, 4, input);

                    	    throw nvae_d32s4;
                    }

                }
                else 
                {
                    NoViableAltException nvae_d32s1 =
                        new NoViableAltException("", 32, 1, input);

                    throw nvae_d32s1;
                }
                }
                break;
            case FULL:
            	{
                int LA32_2 = input.LA(2);

                if ( (LA32_2 == JOIN) )
                {
                    switch ( input.LA(3) ) 
                    {
                    case FETCH:
                    	{
                        int LA32_6 = input.LA(4);

                        if ( (LA32_6 == ELEMENTS) )
                        {
                            alt32 = 2;
                        }
                        else if ( (LA32_6 == IDENT) )
                        {
                            alt32 = 1;
                        }
                        else 
                        {
                            NoViableAltException nvae_d32s6 =
                                new NoViableAltException("", 32, 6, input);

                            throw nvae_d32s6;
                        }
                        }
                        break;
                    case ELEMENTS:
                    	{
                        alt32 = 2;
                        }
                        break;
                    case IDENT:
                    	{
                        alt32 = 1;
                        }
                        break;
                    	default:
                    	    NoViableAltException nvae_d32s4 =
                    	        new NoViableAltException("", 32, 4, input);

                    	    throw nvae_d32s4;
                    }

                }
                else 
                {
                    NoViableAltException nvae_d32s2 =
                        new NoViableAltException("", 32, 2, input);

                    throw nvae_d32s2;
                }
                }
                break;
            case INNER:
            	{
                int LA32_3 = input.LA(2);

                if ( (LA32_3 == JOIN) )
                {
                    switch ( input.LA(3) ) 
                    {
                    case FETCH:
                    	{
                        int LA32_6 = input.LA(4);

                        if ( (LA32_6 == ELEMENTS) )
                        {
                            alt32 = 2;
                        }
                        else if ( (LA32_6 == IDENT) )
                        {
                            alt32 = 1;
                        }
                        else 
                        {
                            NoViableAltException nvae_d32s6 =
                                new NoViableAltException("", 32, 6, input);

                            throw nvae_d32s6;
                        }
                        }
                        break;
                    case ELEMENTS:
                    	{
                        alt32 = 2;
                        }
                        break;
                    case IDENT:
                    	{
                        alt32 = 1;
                        }
                        break;
                    	default:
                    	    NoViableAltException nvae_d32s4 =
                    	        new NoViableAltException("", 32, 4, input);

                    	    throw nvae_d32s4;
                    }

                }
                else 
                {
                    NoViableAltException nvae_d32s3 =
                        new NoViableAltException("", 32, 3, input);

                    throw nvae_d32s3;
                }
                }
                break;
            case JOIN:
            	{
                switch ( input.LA(2) ) 
                {
                case FETCH:
                	{
                    int LA32_6 = input.LA(3);

                    if ( (LA32_6 == ELEMENTS) )
                    {
                        alt32 = 2;
                    }
                    else if ( (LA32_6 == IDENT) )
                    {
                        alt32 = 1;
                    }
                    else 
                    {
                        NoViableAltException nvae_d32s6 =
                            new NoViableAltException("", 32, 6, input);

                        throw nvae_d32s6;
                    }
                    }
                    break;
                case ELEMENTS:
                	{
                    alt32 = 2;
                    }
                    break;
                case IDENT:
                	{
                    alt32 = 1;
                    }
                    break;
                	default:
                	    NoViableAltException nvae_d32s4 =
                	        new NoViableAltException("", 32, 4, input);

                	    throw nvae_d32s4;
                }

                }
                break;
            	default:
            	    NoViableAltException nvae_d32s0 =
            	        new NoViableAltException("", 32, 0, input);

            	    throw nvae_d32s0;
            }

            switch (alt32) 
            {
                case 1 :
                    // Hql.g:246:4: ( ( ( LEFT | RIGHT ) ( OUTER )? ) | FULL | INNER )? JOIN ( FETCH )? path ( asAlias )? ( propertyFetch )? ( withClause )?
                    {
                    	root_0 = (IASTNode)adaptor.GetNilNode();

                    	// Hql.g:246:4: ( ( ( LEFT | RIGHT ) ( OUTER )? ) | FULL | INNER )?
                    	int alt21 = 4;
                    	switch ( input.LA(1) ) 
                    	{
                    	    case LEFT:
                    	    case RIGHT:
                    	    	{
                    	        alt21 = 1;
                    	        }
                    	        break;
                    	    case FULL:
                    	    	{
                    	        alt21 = 2;
                    	        }
                    	        break;
                    	    case INNER:
                    	    	{
                    	        alt21 = 3;
                    	        }
                    	        break;
                    	}

                    	switch (alt21) 
                    	{
                    	    case 1 :
                    	        // Hql.g:246:6: ( ( LEFT | RIGHT ) ( OUTER )? )
                    	        {
                    	        	// Hql.g:246:6: ( ( LEFT | RIGHT ) ( OUTER )? )
                    	        	// Hql.g:246:8: ( LEFT | RIGHT ) ( OUTER )?
                    	        	{
                    	        		set63 = (IToken)input.LT(1);
                    	        		if ( input.LA(1) == LEFT || input.LA(1) == RIGHT ) 
                    	        		{
                    	        		    input.Consume();
                    	        		    adaptor.AddChild(root_0, (IASTNode)adaptor.Create(set63));
                    	        		    state.errorRecovery = false;
                    	        		}
                    	        		else 
                    	        		{
                    	        		    MismatchedSetException mse = new MismatchedSetException(null,input);
                    	        		    throw mse;
                    	        		}

                    	        		// Hql.g:246:25: ( OUTER )?
                    	        		int alt20 = 2;
                    	        		int LA20_0 = input.LA(1);

                    	        		if ( (LA20_0 == OUTER) )
                    	        		{
                    	        		    alt20 = 1;
                    	        		}
                    	        		switch (alt20) 
                    	        		{
                    	        		    case 1 :
                    	        		        // Hql.g:246:26: OUTER
                    	        		        {
                    	        		        	OUTER64=(IToken)Match(input,OUTER,FOLLOW_OUTER_in_fromJoin1180); 
                    	        		        		OUTER64_tree = (IASTNode)adaptor.Create(OUTER64);
                    	        		        		adaptor.AddChild(root_0, OUTER64_tree);


                    	        		        }
                    	        		        break;

                    	        		}


                    	        	}


                    	        }
                    	        break;
                    	    case 2 :
                    	        // Hql.g:246:38: FULL
                    	        {
                    	        	FULL65=(IToken)Match(input,FULL,FOLLOW_FULL_in_fromJoin1188); 
                    	        		FULL65_tree = (IASTNode)adaptor.Create(FULL65);
                    	        		adaptor.AddChild(root_0, FULL65_tree);


                    	        }
                    	        break;
                    	    case 3 :
                    	        // Hql.g:246:45: INNER
                    	        {
                    	        	INNER66=(IToken)Match(input,INNER,FOLLOW_INNER_in_fromJoin1192); 
                    	        		INNER66_tree = (IASTNode)adaptor.Create(INNER66);
                    	        		adaptor.AddChild(root_0, INNER66_tree);


                    	        }
                    	        break;

                    	}

                    	JOIN67=(IToken)Match(input,JOIN,FOLLOW_JOIN_in_fromJoin1197); 
                    		JOIN67_tree = (IASTNode)adaptor.Create(JOIN67);
                    		root_0 = (IASTNode)adaptor.BecomeRoot(JOIN67_tree, root_0);

                    	// Hql.g:246:60: ( FETCH )?
                    	int alt22 = 2;
                    	int LA22_0 = input.LA(1);

                    	if ( (LA22_0 == FETCH) )
                    	{
                    	    alt22 = 1;
                    	}
                    	switch (alt22) 
                    	{
                    	    case 1 :
                    	        // Hql.g:246:61: FETCH
                    	        {
                    	        	FETCH68=(IToken)Match(input,FETCH,FOLLOW_FETCH_in_fromJoin1201); 
                    	        		FETCH68_tree = (IASTNode)adaptor.Create(FETCH68);
                    	        		adaptor.AddChild(root_0, FETCH68_tree);


                    	        }
                    	        break;

                    	}

                    	PushFollow(FOLLOW_path_in_fromJoin1205);
                    	path69 = path();
                    	state.followingStackPointer--;

                    	adaptor.AddChild(root_0, path69.Tree);
                    	// Hql.g:246:74: ( asAlias )?
                    	int alt23 = 2;
                    	int LA23_0 = input.LA(1);

                    	if ( (LA23_0 == AS || LA23_0 == IDENT) )
                    	{
                    	    alt23 = 1;
                    	}
                    	switch (alt23) 
                    	{
                    	    case 1 :
                    	        // Hql.g:246:75: asAlias
                    	        {
                    	        	PushFollow(FOLLOW_asAlias_in_fromJoin1208);
                    	        	asAlias70 = asAlias();
                    	        	state.followingStackPointer--;

                    	        	adaptor.AddChild(root_0, asAlias70.Tree);

                    	        }
                    	        break;

                    	}

                    	// Hql.g:246:85: ( propertyFetch )?
                    	int alt24 = 2;
                    	int LA24_0 = input.LA(1);

                    	if ( (LA24_0 == FETCH) )
                    	{
                    	    alt24 = 1;
                    	}
                    	switch (alt24) 
                    	{
                    	    case 1 :
                    	        // Hql.g:246:86: propertyFetch
                    	        {
                    	        	PushFollow(FOLLOW_propertyFetch_in_fromJoin1213);
                    	        	propertyFetch71 = propertyFetch();
                    	        	state.followingStackPointer--;

                    	        	adaptor.AddChild(root_0, propertyFetch71.Tree);

                    	        }
                    	        break;

                    	}

                    	// Hql.g:246:102: ( withClause )?
                    	int alt25 = 2;
                    	int LA25_0 = input.LA(1);

                    	if ( (LA25_0 == WITH) )
                    	{
                    	    alt25 = 1;
                    	}
                    	switch (alt25) 
                    	{
                    	    case 1 :
                    	        // Hql.g:246:103: withClause
                    	        {
                    	        	PushFollow(FOLLOW_withClause_in_fromJoin1218);
                    	        	withClause72 = withClause();
                    	        	state.followingStackPointer--;

                    	        	adaptor.AddChild(root_0, withClause72.Tree);

                    	        }
                    	        break;

                    	}


                    }
                    break;
                case 2 :
                    // Hql.g:247:4: ( ( ( LEFT | RIGHT ) ( OUTER )? ) | FULL | INNER )? JOIN ( FETCH )? ELEMENTS OPEN path CLOSE ( asAlias )? ( propertyFetch )? ( withClause )?
                    {
                    	root_0 = (IASTNode)adaptor.GetNilNode();

                    	// Hql.g:247:4: ( ( ( LEFT | RIGHT ) ( OUTER )? ) | FULL | INNER )?
                    	int alt27 = 4;
                    	switch ( input.LA(1) ) 
                    	{
                    	    case LEFT:
                    	    case RIGHT:
                    	    	{
                    	        alt27 = 1;
                    	        }
                    	        break;
                    	    case FULL:
                    	    	{
                    	        alt27 = 2;
                    	        }
                    	        break;
                    	    case INNER:
                    	    	{
                    	        alt27 = 3;
                    	        }
                    	        break;
                    	}

                    	switch (alt27) 
                    	{
                    	    case 1 :
                    	        // Hql.g:247:6: ( ( LEFT | RIGHT ) ( OUTER )? )
                    	        {
                    	        	// Hql.g:247:6: ( ( LEFT | RIGHT ) ( OUTER )? )
                    	        	// Hql.g:247:8: ( LEFT | RIGHT ) ( OUTER )?
                    	        	{
                    	        		set73 = (IToken)input.LT(1);
                    	        		if ( input.LA(1) == LEFT || input.LA(1) == RIGHT ) 
                    	        		{
                    	        		    input.Consume();
                    	        		    adaptor.AddChild(root_0, (IASTNode)adaptor.Create(set73));
                    	        		    state.errorRecovery = false;
                    	        		}
                    	        		else 
                    	        		{
                    	        		    MismatchedSetException mse = new MismatchedSetException(null,input);
                    	        		    throw mse;
                    	        		}

                    	        		// Hql.g:247:25: ( OUTER )?
                    	        		int alt26 = 2;
                    	        		int LA26_0 = input.LA(1);

                    	        		if ( (LA26_0 == OUTER) )
                    	        		{
                    	        		    alt26 = 1;
                    	        		}
                    	        		switch (alt26) 
                    	        		{
                    	        		    case 1 :
                    	        		        // Hql.g:247:26: OUTER
                    	        		        {
                    	        		        	OUTER74=(IToken)Match(input,OUTER,FOLLOW_OUTER_in_fromJoin1240); 
                    	        		        		OUTER74_tree = (IASTNode)adaptor.Create(OUTER74);
                    	        		        		adaptor.AddChild(root_0, OUTER74_tree);


                    	        		        }
                    	        		        break;

                    	        		}


                    	        	}


                    	        }
                    	        break;
                    	    case 2 :
                    	        // Hql.g:247:38: FULL
                    	        {
                    	        	FULL75=(IToken)Match(input,FULL,FOLLOW_FULL_in_fromJoin1248); 
                    	        		FULL75_tree = (IASTNode)adaptor.Create(FULL75);
                    	        		adaptor.AddChild(root_0, FULL75_tree);


                    	        }
                    	        break;
                    	    case 3 :
                    	        // Hql.g:247:45: INNER
                    	        {
                    	        	INNER76=(IToken)Match(input,INNER,FOLLOW_INNER_in_fromJoin1252); 
                    	        		INNER76_tree = (IASTNode)adaptor.Create(INNER76);
                    	        		adaptor.AddChild(root_0, INNER76_tree);


                    	        }
                    	        break;

                    	}

                    	JOIN77=(IToken)Match(input,JOIN,FOLLOW_JOIN_in_fromJoin1257); 
                    		JOIN77_tree = (IASTNode)adaptor.Create(JOIN77);
                    		root_0 = (IASTNode)adaptor.BecomeRoot(JOIN77_tree, root_0);

                    	// Hql.g:247:60: ( FETCH )?
                    	int alt28 = 2;
                    	int LA28_0 = input.LA(1);

                    	if ( (LA28_0 == FETCH) )
                    	{
                    	    alt28 = 1;
                    	}
                    	switch (alt28) 
                    	{
                    	    case 1 :
                    	        // Hql.g:247:61: FETCH
                    	        {
                    	        	FETCH78=(IToken)Match(input,FETCH,FOLLOW_FETCH_in_fromJoin1261); 
                    	        		FETCH78_tree = (IASTNode)adaptor.Create(FETCH78);
                    	        		adaptor.AddChild(root_0, FETCH78_tree);


                    	        }
                    	        break;

                    	}

                    	ELEMENTS79=(IToken)Match(input,ELEMENTS,FOLLOW_ELEMENTS_in_fromJoin1265); 
                    	OPEN80=(IToken)Match(input,OPEN,FOLLOW_OPEN_in_fromJoin1268); 
                    	PushFollow(FOLLOW_path_in_fromJoin1271);
                    	path81 = path();
                    	state.followingStackPointer--;

                    	adaptor.AddChild(root_0, path81.Tree);
                    	CLOSE82=(IToken)Match(input,CLOSE,FOLLOW_CLOSE_in_fromJoin1273); 
                    	// Hql.g:247:97: ( asAlias )?
                    	int alt29 = 2;
                    	int LA29_0 = input.LA(1);

                    	if ( (LA29_0 == AS || LA29_0 == IDENT) )
                    	{
                    	    alt29 = 1;
                    	}
                    	switch (alt29) 
                    	{
                    	    case 1 :
                    	        // Hql.g:247:98: asAlias
                    	        {
                    	        	PushFollow(FOLLOW_asAlias_in_fromJoin1277);
                    	        	asAlias83 = asAlias();
                    	        	state.followingStackPointer--;

                    	        	adaptor.AddChild(root_0, asAlias83.Tree);

                    	        }
                    	        break;

                    	}

                    	// Hql.g:247:108: ( propertyFetch )?
                    	int alt30 = 2;
                    	int LA30_0 = input.LA(1);

                    	if ( (LA30_0 == FETCH) )
                    	{
                    	    alt30 = 1;
                    	}
                    	switch (alt30) 
                    	{
                    	    case 1 :
                    	        // Hql.g:247:109: propertyFetch
                    	        {
                    	        	PushFollow(FOLLOW_propertyFetch_in_fromJoin1282);
                    	        	propertyFetch84 = propertyFetch();
                    	        	state.followingStackPointer--;

                    	        	adaptor.AddChild(root_0, propertyFetch84.Tree);

                    	        }
                    	        break;

                    	}

                    	// Hql.g:247:125: ( withClause )?
                    	int alt31 = 2;
                    	int LA31_0 = input.LA(1);

                    	if ( (LA31_0 == WITH) )
                    	{
                    	    alt31 = 1;
                    	}
                    	switch (alt31) 
                    	{
                    	    case 1 :
                    	        // Hql.g:247:126: withClause
                    	        {
                    	        	PushFollow(FOLLOW_withClause_in_fromJoin1287);
                    	        	withClause85 = withClause();
                    	        	state.followingStackPointer--;

                    	        	adaptor.AddChild(root_0, withClause85.Tree);

                    	        }
                    	        break;

                    	}


                    }
                    break;

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

            	retval.Tree = (IASTNode)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 = (IASTNode)adaptor.ErrorNode(input, (IToken) retval.Start, input.LT(-1), re);

        }
        finally 
    	{
        }
        return retval;
    }