// $ANTLR start "relationalExpression"
    // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:401:1: relationalExpression : concatenation ( ( ( ( LT | GT | LE | GE ) bitwiseNotExpression )* ) | (n= NOT )? ( (i= IN inList ) | (b= BETWEEN betweenList ) | (l= LIKE concatenation likeEscape ) | ( MEMBER ( OF )? p= path ) ) ) ;
    public HqlParser.relationalExpression_return relationalExpression() // throws RecognitionException [1]
    {   
        HqlParser.relationalExpression_return retval = new HqlParser.relationalExpression_return();
        retval.Start = input.LT(1);

        IASTNode root_0 = null;

        IToken n = null;
        IToken i = null;
        IToken b = null;
        IToken l = null;
        IToken LT154 = null;
        IToken GT155 = null;
        IToken LE156 = null;
        IToken GE157 = null;
        IToken MEMBER163 = null;
        IToken OF164 = null;
        HqlParser.path_return p = default(HqlParser.path_return);

        HqlParser.concatenation_return concatenation153 = default(HqlParser.concatenation_return);

        HqlParser.bitwiseNotExpression_return bitwiseNotExpression158 = default(HqlParser.bitwiseNotExpression_return);

        HqlParser.inList_return inList159 = default(HqlParser.inList_return);

        HqlParser.betweenList_return betweenList160 = default(HqlParser.betweenList_return);

        HqlParser.concatenation_return concatenation161 = default(HqlParser.concatenation_return);

        HqlParser.likeEscape_return likeEscape162 = default(HqlParser.likeEscape_return);


        IASTNode n_tree=null;
        IASTNode i_tree=null;
        IASTNode b_tree=null;
        IASTNode l_tree=null;
        IASTNode LT154_tree=null;
        IASTNode GT155_tree=null;
        IASTNode LE156_tree=null;
        IASTNode GE157_tree=null;
        IASTNode MEMBER163_tree=null;
        IASTNode OF164_tree=null;

        try 
    	{
            // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:402:2: ( concatenation ( ( ( ( LT | GT | LE | GE ) bitwiseNotExpression )* ) | (n= NOT )? ( (i= IN inList ) | (b= BETWEEN betweenList ) | (l= LIKE concatenation likeEscape ) | ( MEMBER ( OF )? p= path ) ) ) )
            // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:402:4: concatenation ( ( ( ( LT | GT | LE | GE ) bitwiseNotExpression )* ) | (n= NOT )? ( (i= IN inList ) | (b= BETWEEN betweenList ) | (l= LIKE concatenation likeEscape ) | ( MEMBER ( OF )? p= path ) ) )
            {
            	root_0 = (IASTNode)adaptor.GetNilNode();

            	PushFollow(FOLLOW_concatenation_in_relationalExpression1973);
            	concatenation153 = concatenation();
            	state.followingStackPointer--;

            	adaptor.AddChild(root_0, concatenation153.Tree);
            	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:402:18: ( ( ( ( LT | GT | LE | GE ) bitwiseNotExpression )* ) | (n= NOT )? ( (i= IN inList ) | (b= BETWEEN betweenList ) | (l= LIKE concatenation likeEscape ) | ( MEMBER ( OF )? p= path ) ) )
            	int alt56 = 2;
            	int LA56_0 = input.LA(1);

            	if ( (LA56_0 == EOF || (LA56_0 >= AND && LA56_0 <= ASCENDING) || LA56_0 == DESCENDING || (LA56_0 >= FROM && LA56_0 <= HAVING) || LA56_0 == INNER || (LA56_0 >= IS && LA56_0 <= LEFT) || (LA56_0 >= OR && LA56_0 <= ORDER) || LA56_0 == RIGHT || LA56_0 == UNION || LA56_0 == WHERE || (LA56_0 >= END && LA56_0 <= WHEN) || (LA56_0 >= COMMA && LA56_0 <= EQ) || (LA56_0 >= CLOSE && LA56_0 <= GE) || LA56_0 == CLOSE_BRACKET || (LA56_0 >= 130 && LA56_0 <= 131)) )
            	{
            	    alt56 = 1;
            	}
            	else if ( (LA56_0 == BETWEEN || LA56_0 == IN || LA56_0 == LIKE || LA56_0 == NOT || LA56_0 == MEMBER) )
            	{
            	    alt56 = 2;
            	}
            	else 
            	{
            	    NoViableAltException nvae_d56s0 =
            	        new NoViableAltException("", 56, 0, input);

            	    throw nvae_d56s0;
            	}
            	switch (alt56) 
            	{
            	    case 1 :
            	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:403:3: ( ( ( LT | GT | LE | GE ) bitwiseNotExpression )* )
            	        {
            	        	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:403:3: ( ( ( LT | GT | LE | GE ) bitwiseNotExpression )* )
            	        	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:403:5: ( ( LT | GT | LE | GE ) bitwiseNotExpression )*
            	        	{
            	        		// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:403:5: ( ( LT | GT | LE | GE ) bitwiseNotExpression )*
            	        		do 
            	        		{
            	        		    int alt52 = 2;
            	        		    int LA52_0 = input.LA(1);

            	        		    if ( ((LA52_0 >= LT && LA52_0 <= GE)) )
            	        		    {
            	        		        alt52 = 1;
            	        		    }


            	        		    switch (alt52) 
            	        			{
            	        				case 1 :
            	        				    // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:403:7: ( LT | GT | LE | GE ) bitwiseNotExpression
            	        				    {
            	        				    	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:403:7: ( LT | GT | LE | GE )
            	        				    	int alt51 = 4;
            	        				    	switch ( input.LA(1) ) 
            	        				    	{
            	        				    	case LT:
            	        				    		{
            	        				    	    alt51 = 1;
            	        				    	    }
            	        				    	    break;
            	        				    	case GT:
            	        				    		{
            	        				    	    alt51 = 2;
            	        				    	    }
            	        				    	    break;
            	        				    	case LE:
            	        				    		{
            	        				    	    alt51 = 3;
            	        				    	    }
            	        				    	    break;
            	        				    	case GE:
            	        				    		{
            	        				    	    alt51 = 4;
            	        				    	    }
            	        				    	    break;
            	        				    		default:
            	        				    		    NoViableAltException nvae_d51s0 =
            	        				    		        new NoViableAltException("", 51, 0, input);

            	        				    		    throw nvae_d51s0;
            	        				    	}

            	        				    	switch (alt51) 
            	        				    	{
            	        				    	    case 1 :
            	        				    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:403:9: LT
            	        				    	        {
            	        				    	        	LT154=(IToken)Match(input,LT,FOLLOW_LT_in_relationalExpression1985); 
            	        				    	        		LT154_tree = (IASTNode)adaptor.Create(LT154);
            	        				    	        		root_0 = (IASTNode)adaptor.BecomeRoot(LT154_tree, root_0);


            	        				    	        }
            	        				    	        break;
            	        				    	    case 2 :
            	        				    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:403:15: GT
            	        				    	        {
            	        				    	        	GT155=(IToken)Match(input,GT,FOLLOW_GT_in_relationalExpression1990); 
            	        				    	        		GT155_tree = (IASTNode)adaptor.Create(GT155);
            	        				    	        		root_0 = (IASTNode)adaptor.BecomeRoot(GT155_tree, root_0);


            	        				    	        }
            	        				    	        break;
            	        				    	    case 3 :
            	        				    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:403:21: LE
            	        				    	        {
            	        				    	        	LE156=(IToken)Match(input,LE,FOLLOW_LE_in_relationalExpression1995); 
            	        				    	        		LE156_tree = (IASTNode)adaptor.Create(LE156);
            	        				    	        		root_0 = (IASTNode)adaptor.BecomeRoot(LE156_tree, root_0);


            	        				    	        }
            	        				    	        break;
            	        				    	    case 4 :
            	        				    	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:403:27: GE
            	        				    	        {
            	        				    	        	GE157=(IToken)Match(input,GE,FOLLOW_GE_in_relationalExpression2000); 
            	        				    	        		GE157_tree = (IASTNode)adaptor.Create(GE157);
            	        				    	        		root_0 = (IASTNode)adaptor.BecomeRoot(GE157_tree, root_0);


            	        				    	        }
            	        				    	        break;

            	        				    	}

            	        				    	PushFollow(FOLLOW_bitwiseNotExpression_in_relationalExpression2005);
            	        				    	bitwiseNotExpression158 = bitwiseNotExpression();
            	        				    	state.followingStackPointer--;

            	        				    	adaptor.AddChild(root_0, bitwiseNotExpression158.Tree);

            	        				    }
            	        				    break;

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

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


            	        	}


            	        }
            	        break;
            	    case 2 :
            	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:405:5: (n= NOT )? ( (i= IN inList ) | (b= BETWEEN betweenList ) | (l= LIKE concatenation likeEscape ) | ( MEMBER ( OF )? p= path ) )
            	        {
            	        	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:405:5: (n= NOT )?
            	        	int alt53 = 2;
            	        	int LA53_0 = input.LA(1);

            	        	if ( (LA53_0 == NOT) )
            	        	{
            	        	    alt53 = 1;
            	        	}
            	        	switch (alt53) 
            	        	{
            	        	    case 1 :
            	        	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:405:6: n= NOT
            	        	        {
            	        	        	n=(IToken)Match(input,NOT,FOLLOW_NOT_in_relationalExpression2022); 

            	        	        }
            	        	        break;

            	        	}

            	        	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:405:15: ( (i= IN inList ) | (b= BETWEEN betweenList ) | (l= LIKE concatenation likeEscape ) | ( MEMBER ( OF )? p= path ) )
            	        	int alt55 = 4;
            	        	switch ( input.LA(1) ) 
            	        	{
            	        	case IN:
            	        		{
            	        	    alt55 = 1;
            	        	    }
            	        	    break;
            	        	case BETWEEN:
            	        		{
            	        	    alt55 = 2;
            	        	    }
            	        	    break;
            	        	case LIKE:
            	        		{
            	        	    alt55 = 3;
            	        	    }
            	        	    break;
            	        	case MEMBER:
            	        		{
            	        	    alt55 = 4;
            	        	    }
            	        	    break;
            	        		default:
            	        		    NoViableAltException nvae_d55s0 =
            	        		        new NoViableAltException("", 55, 0, input);

            	        		    throw nvae_d55s0;
            	        	}

            	        	switch (alt55) 
            	        	{
            	        	    case 1 :
            	        	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:408:4: (i= IN inList )
            	        	        {
            	        	        	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:408:4: (i= IN inList )
            	        	        	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:408:5: i= IN inList
            	        	        	{
            	        	        		i=(IToken)Match(input,IN,FOLLOW_IN_in_relationalExpression2043); 
            	        	        			i_tree = (IASTNode)adaptor.Create(i);
            	        	        			root_0 = (IASTNode)adaptor.BecomeRoot(i_tree, root_0);


            	        	        							i.Type = (n == null) ? IN : NOT_IN;
            	        	        							i.Text = (n == null) ? "in" : "not in";
            	        	        						
            	        	        		PushFollow(FOLLOW_inList_in_relationalExpression2052);
            	        	        		inList159 = inList();
            	        	        		state.followingStackPointer--;

            	        	        		adaptor.AddChild(root_0, inList159.Tree);

            	        	        	}


            	        	        }
            	        	        break;
            	        	    case 2 :
            	        	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:413:6: (b= BETWEEN betweenList )
            	        	        {
            	        	        	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:413:6: (b= BETWEEN betweenList )
            	        	        	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:413:7: b= BETWEEN betweenList
            	        	        	{
            	        	        		b=(IToken)Match(input,BETWEEN,FOLLOW_BETWEEN_in_relationalExpression2063); 
            	        	        			b_tree = (IASTNode)adaptor.Create(b);
            	        	        			root_0 = (IASTNode)adaptor.BecomeRoot(b_tree, root_0);


            	        	        							b.Type = (n == null) ? BETWEEN : NOT_BETWEEN;
            	        	        							b.Text = (n == null) ? "between" : "not between";
            	        	        						
            	        	        		PushFollow(FOLLOW_betweenList_in_relationalExpression2072);
            	        	        		betweenList160 = betweenList();
            	        	        		state.followingStackPointer--;

            	        	        		adaptor.AddChild(root_0, betweenList160.Tree);

            	        	        	}


            	        	        }
            	        	        break;
            	        	    case 3 :
            	        	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:418:6: (l= LIKE concatenation likeEscape )
            	        	        {
            	        	        	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:418:6: (l= LIKE concatenation likeEscape )
            	        	        	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:418:7: l= LIKE concatenation likeEscape
            	        	        	{
            	        	        		l=(IToken)Match(input,LIKE,FOLLOW_LIKE_in_relationalExpression2084); 
            	        	        			l_tree = (IASTNode)adaptor.Create(l);
            	        	        			root_0 = (IASTNode)adaptor.BecomeRoot(l_tree, root_0);


            	        	        							l.Type = (n == null) ? LIKE : NOT_LIKE;
            	        	        							l.Text = (n == null) ? "like" : "not like";
            	        	        						
            	        	        		PushFollow(FOLLOW_concatenation_in_relationalExpression2093);
            	        	        		concatenation161 = concatenation();
            	        	        		state.followingStackPointer--;

            	        	        		adaptor.AddChild(root_0, concatenation161.Tree);
            	        	        		PushFollow(FOLLOW_likeEscape_in_relationalExpression2095);
            	        	        		likeEscape162 = likeEscape();
            	        	        		state.followingStackPointer--;

            	        	        		adaptor.AddChild(root_0, likeEscape162.Tree);

            	        	        	}


            	        	        }
            	        	        break;
            	        	    case 4 :
            	        	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:423:6: ( MEMBER ( OF )? p= path )
            	        	        {
            	        	        	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:423:6: ( MEMBER ( OF )? p= path )
            	        	        	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:423:7: MEMBER ( OF )? p= path
            	        	        	{
            	        	        		MEMBER163=(IToken)Match(input,MEMBER,FOLLOW_MEMBER_in_relationalExpression2104); 
            	        	        		// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:423:15: ( OF )?
            	        	        		int alt54 = 2;
            	        	        		int LA54_0 = input.LA(1);

            	        	        		if ( (LA54_0 == OF) )
            	        	        		{
            	        	        		    alt54 = 1;
            	        	        		}
            	        	        		switch (alt54) 
            	        	        		{
            	        	        		    case 1 :
            	        	        		        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:423:16: OF
            	        	        		        {
            	        	        		        	OF164=(IToken)Match(input,OF,FOLLOW_OF_in_relationalExpression2108); 

            	        	        		        }
            	        	        		        break;

            	        	        		}

            	        	        		PushFollow(FOLLOW_path_in_relationalExpression2115);
            	        	        		p = path();
            	        	        		state.followingStackPointer--;


            	        	        						root_0 = ProcessMemberOf(n,((p != null) ? ((IASTNode)p.Tree) : null), root_0);
            	        	        					  

            	        	        	}


            	        	        }
            	        	        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 "relationalExpression"
    // Hql.g:419:1: relationalExpression : concatenation ( ( ( ( LT | GT | LE | GE ) bitwiseNotExpression )* ) | (n= NOT )? ( (i= IN inList ) | (b= BETWEEN betweenList ) | (l= LIKE concatenation likeEscape ) | ( MEMBER ( OF )? p= path ) ) ) ;
    public HqlParser.relationalExpression_return relationalExpression() // throws RecognitionException [1]
    {   
        HqlParser.relationalExpression_return retval = new HqlParser.relationalExpression_return();
        retval.Start = input.LT(1);

        IASTNode root_0 = null;

        IToken n = null;
        IToken i = null;
        IToken b = null;
        IToken l = null;
        IToken LT167 = null;
        IToken GT168 = null;
        IToken LE169 = null;
        IToken GE170 = null;
        IToken MEMBER176 = null;
        IToken OF177 = null;
        HqlParser.path_return p = default(HqlParser.path_return);

        HqlParser.concatenation_return concatenation166 = default(HqlParser.concatenation_return);

        HqlParser.bitwiseNotExpression_return bitwiseNotExpression171 = default(HqlParser.bitwiseNotExpression_return);

        HqlParser.inList_return inList172 = default(HqlParser.inList_return);

        HqlParser.betweenList_return betweenList173 = default(HqlParser.betweenList_return);

        HqlParser.concatenation_return concatenation174 = default(HqlParser.concatenation_return);

        HqlParser.likeEscape_return likeEscape175 = default(HqlParser.likeEscape_return);


        IASTNode n_tree=null;
        IASTNode i_tree=null;
        IASTNode b_tree=null;
        IASTNode l_tree=null;
        IASTNode LT167_tree=null;
        IASTNode GT168_tree=null;
        IASTNode LE169_tree=null;
        IASTNode GE170_tree=null;
        IASTNode MEMBER176_tree=null;
        IASTNode OF177_tree=null;

        try 
    	{
            // Hql.g:420:2: ( concatenation ( ( ( ( LT | GT | LE | GE ) bitwiseNotExpression )* ) | (n= NOT )? ( (i= IN inList ) | (b= BETWEEN betweenList ) | (l= LIKE concatenation likeEscape ) | ( MEMBER ( OF )? p= path ) ) ) )
            // Hql.g:420:4: concatenation ( ( ( ( LT | GT | LE | GE ) bitwiseNotExpression )* ) | (n= NOT )? ( (i= IN inList ) | (b= BETWEEN betweenList ) | (l= LIKE concatenation likeEscape ) | ( MEMBER ( OF )? p= path ) ) )
            {
            	root_0 = (IASTNode)adaptor.GetNilNode();

            	PushFollow(FOLLOW_concatenation_in_relationalExpression2071);
            	concatenation166 = concatenation();
            	state.followingStackPointer--;

            	adaptor.AddChild(root_0, concatenation166.Tree);
            	// Hql.g:420:18: ( ( ( ( LT | GT | LE | GE ) bitwiseNotExpression )* ) | (n= NOT )? ( (i= IN inList ) | (b= BETWEEN betweenList ) | (l= LIKE concatenation likeEscape ) | ( MEMBER ( OF )? p= path ) ) )
            	int alt62 = 2;
            	int LA62_0 = input.LA(1);

            	if ( (LA62_0 == EOF || (LA62_0 >= AND && LA62_0 <= ASCENDING) || LA62_0 == DESCENDING || (LA62_0 >= FROM && LA62_0 <= HAVING) || LA62_0 == INNER || (LA62_0 >= IS && LA62_0 <= LEFT) || (LA62_0 >= OR && LA62_0 <= ORDER) || LA62_0 == RIGHT || LA62_0 == SKIP || LA62_0 == TAKE || LA62_0 == UNION || LA62_0 == WHERE || (LA62_0 >= END && LA62_0 <= WHEN) || (LA62_0 >= COMMA && LA62_0 <= EQ) || LA62_0 == CLOSE || (LA62_0 >= NE && LA62_0 <= GE) || LA62_0 == CLOSE_BRACKET || (LA62_0 >= 133 && LA62_0 <= 134)) )
            	{
            	    alt62 = 1;
            	}
            	else if ( (LA62_0 == BETWEEN || LA62_0 == IN || LA62_0 == LIKE || LA62_0 == NOT || LA62_0 == MEMBER) )
            	{
            	    alt62 = 2;
            	}
            	else 
            	{
            	    NoViableAltException nvae_d62s0 =
            	        new NoViableAltException("", 62, 0, input);

            	    throw nvae_d62s0;
            	}
            	switch (alt62) 
            	{
            	    case 1 :
            	        // Hql.g:421:3: ( ( ( LT | GT | LE | GE ) bitwiseNotExpression )* )
            	        {
            	        	// Hql.g:421:3: ( ( ( LT | GT | LE | GE ) bitwiseNotExpression )* )
            	        	// Hql.g:421:5: ( ( LT | GT | LE | GE ) bitwiseNotExpression )*
            	        	{
            	        		// Hql.g:421:5: ( ( LT | GT | LE | GE ) bitwiseNotExpression )*
            	        		do 
            	        		{
            	        		    int alt58 = 2;
            	        		    int LA58_0 = input.LA(1);

            	        		    if ( ((LA58_0 >= LT && LA58_0 <= GE)) )
            	        		    {
            	        		        alt58 = 1;
            	        		    }


            	        		    switch (alt58) 
            	        			{
            	        				case 1 :
            	        				    // Hql.g:421:7: ( LT | GT | LE | GE ) bitwiseNotExpression
            	        				    {
            	        				    	// Hql.g:421:7: ( LT | GT | LE | GE )
            	        				    	int alt57 = 4;
            	        				    	switch ( input.LA(1) ) 
            	        				    	{
            	        				    	case LT:
            	        				    		{
            	        				    	    alt57 = 1;
            	        				    	    }
            	        				    	    break;
            	        				    	case GT:
            	        				    		{
            	        				    	    alt57 = 2;
            	        				    	    }
            	        				    	    break;
            	        				    	case LE:
            	        				    		{
            	        				    	    alt57 = 3;
            	        				    	    }
            	        				    	    break;
            	        				    	case GE:
            	        				    		{
            	        				    	    alt57 = 4;
            	        				    	    }
            	        				    	    break;
            	        				    		default:
            	        				    		    NoViableAltException nvae_d57s0 =
            	        				    		        new NoViableAltException("", 57, 0, input);

            	        				    		    throw nvae_d57s0;
            	        				    	}

            	        				    	switch (alt57) 
            	        				    	{
            	        				    	    case 1 :
            	        				    	        // Hql.g:421:9: LT
            	        				    	        {
            	        				    	        	LT167=(IToken)Match(input,LT,FOLLOW_LT_in_relationalExpression2083); 
            	        				    	        		LT167_tree = (IASTNode)adaptor.Create(LT167);
            	        				    	        		root_0 = (IASTNode)adaptor.BecomeRoot(LT167_tree, root_0);


            	        				    	        }
            	        				    	        break;
            	        				    	    case 2 :
            	        				    	        // Hql.g:421:15: GT
            	        				    	        {
            	        				    	        	GT168=(IToken)Match(input,GT,FOLLOW_GT_in_relationalExpression2088); 
            	        				    	        		GT168_tree = (IASTNode)adaptor.Create(GT168);
            	        				    	        		root_0 = (IASTNode)adaptor.BecomeRoot(GT168_tree, root_0);


            	        				    	        }
            	        				    	        break;
            	        				    	    case 3 :
            	        				    	        // Hql.g:421:21: LE
            	        				    	        {
            	        				    	        	LE169=(IToken)Match(input,LE,FOLLOW_LE_in_relationalExpression2093); 
            	        				    	        		LE169_tree = (IASTNode)adaptor.Create(LE169);
            	        				    	        		root_0 = (IASTNode)adaptor.BecomeRoot(LE169_tree, root_0);


            	        				    	        }
            	        				    	        break;
            	        				    	    case 4 :
            	        				    	        // Hql.g:421:27: GE
            	        				    	        {
            	        				    	        	GE170=(IToken)Match(input,GE,FOLLOW_GE_in_relationalExpression2098); 
            	        				    	        		GE170_tree = (IASTNode)adaptor.Create(GE170);
            	        				    	        		root_0 = (IASTNode)adaptor.BecomeRoot(GE170_tree, root_0);


            	        				    	        }
            	        				    	        break;

            	        				    	}

            	        				    	PushFollow(FOLLOW_bitwiseNotExpression_in_relationalExpression2103);
            	        				    	bitwiseNotExpression171 = bitwiseNotExpression();
            	        				    	state.followingStackPointer--;

            	        				    	adaptor.AddChild(root_0, bitwiseNotExpression171.Tree);

            	        				    }
            	        				    break;

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

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


            	        	}


            	        }
            	        break;
            	    case 2 :
            	        // Hql.g:423:5: (n= NOT )? ( (i= IN inList ) | (b= BETWEEN betweenList ) | (l= LIKE concatenation likeEscape ) | ( MEMBER ( OF )? p= path ) )
            	        {
            	        	// Hql.g:423:5: (n= NOT )?
            	        	int alt59 = 2;
            	        	int LA59_0 = input.LA(1);

            	        	if ( (LA59_0 == NOT) )
            	        	{
            	        	    alt59 = 1;
            	        	}
            	        	switch (alt59) 
            	        	{
            	        	    case 1 :
            	        	        // Hql.g:423:6: n= NOT
            	        	        {
            	        	        	n=(IToken)Match(input,NOT,FOLLOW_NOT_in_relationalExpression2120); 

            	        	        }
            	        	        break;

            	        	}

            	        	// Hql.g:423:15: ( (i= IN inList ) | (b= BETWEEN betweenList ) | (l= LIKE concatenation likeEscape ) | ( MEMBER ( OF )? p= path ) )
            	        	int alt61 = 4;
            	        	switch ( input.LA(1) ) 
            	        	{
            	        	case IN:
            	        		{
            	        	    alt61 = 1;
            	        	    }
            	        	    break;
            	        	case BETWEEN:
            	        		{
            	        	    alt61 = 2;
            	        	    }
            	        	    break;
            	        	case LIKE:
            	        		{
            	        	    alt61 = 3;
            	        	    }
            	        	    break;
            	        	case MEMBER:
            	        		{
            	        	    alt61 = 4;
            	        	    }
            	        	    break;
            	        		default:
            	        		    NoViableAltException nvae_d61s0 =
            	        		        new NoViableAltException("", 61, 0, input);

            	        		    throw nvae_d61s0;
            	        	}

            	        	switch (alt61) 
            	        	{
            	        	    case 1 :
            	        	        // Hql.g:426:4: (i= IN inList )
            	        	        {
            	        	        	// Hql.g:426:4: (i= IN inList )
            	        	        	// Hql.g:426:5: i= IN inList
            	        	        	{
            	        	        		i=(IToken)Match(input,IN,FOLLOW_IN_in_relationalExpression2141); 
            	        	        			i_tree = (IASTNode)adaptor.Create(i);
            	        	        			root_0 = (IASTNode)adaptor.BecomeRoot(i_tree, root_0);


            	        	        							i.Type = (n == null) ? IN : NOT_IN;
            	        	        							i.Text = (n == null) ? "in" : "not in";
            	        	        						
            	        	        		PushFollow(FOLLOW_inList_in_relationalExpression2150);
            	        	        		inList172 = inList();
            	        	        		state.followingStackPointer--;

            	        	        		adaptor.AddChild(root_0, inList172.Tree);

            	        	        	}


            	        	        }
            	        	        break;
            	        	    case 2 :
            	        	        // Hql.g:431:6: (b= BETWEEN betweenList )
            	        	        {
            	        	        	// Hql.g:431:6: (b= BETWEEN betweenList )
            	        	        	// Hql.g:431:7: b= BETWEEN betweenList
            	        	        	{
            	        	        		b=(IToken)Match(input,BETWEEN,FOLLOW_BETWEEN_in_relationalExpression2161); 
            	        	        			b_tree = (IASTNode)adaptor.Create(b);
            	        	        			root_0 = (IASTNode)adaptor.BecomeRoot(b_tree, root_0);


            	        	        							b.Type = (n == null) ? BETWEEN : NOT_BETWEEN;
            	        	        							b.Text = (n == null) ? "between" : "not between";
            	        	        						
            	        	        		PushFollow(FOLLOW_betweenList_in_relationalExpression2170);
            	        	        		betweenList173 = betweenList();
            	        	        		state.followingStackPointer--;

            	        	        		adaptor.AddChild(root_0, betweenList173.Tree);

            	        	        	}


            	        	        }
            	        	        break;
            	        	    case 3 :
            	        	        // Hql.g:436:6: (l= LIKE concatenation likeEscape )
            	        	        {
            	        	        	// Hql.g:436:6: (l= LIKE concatenation likeEscape )
            	        	        	// Hql.g:436:7: l= LIKE concatenation likeEscape
            	        	        	{
            	        	        		l=(IToken)Match(input,LIKE,FOLLOW_LIKE_in_relationalExpression2182); 
            	        	        			l_tree = (IASTNode)adaptor.Create(l);
            	        	        			root_0 = (IASTNode)adaptor.BecomeRoot(l_tree, root_0);


            	        	        							l.Type = (n == null) ? LIKE : NOT_LIKE;
            	        	        							l.Text = (n == null) ? "like" : "not like";
            	        	        						
            	        	        		PushFollow(FOLLOW_concatenation_in_relationalExpression2191);
            	        	        		concatenation174 = concatenation();
            	        	        		state.followingStackPointer--;

            	        	        		adaptor.AddChild(root_0, concatenation174.Tree);
            	        	        		PushFollow(FOLLOW_likeEscape_in_relationalExpression2193);
            	        	        		likeEscape175 = likeEscape();
            	        	        		state.followingStackPointer--;

            	        	        		adaptor.AddChild(root_0, likeEscape175.Tree);

            	        	        	}


            	        	        }
            	        	        break;
            	        	    case 4 :
            	        	        // Hql.g:441:6: ( MEMBER ( OF )? p= path )
            	        	        {
            	        	        	// Hql.g:441:6: ( MEMBER ( OF )? p= path )
            	        	        	// Hql.g:441:7: MEMBER ( OF )? p= path
            	        	        	{
            	        	        		MEMBER176=(IToken)Match(input,MEMBER,FOLLOW_MEMBER_in_relationalExpression2202); 
            	        	        		// Hql.g:441:15: ( OF )?
            	        	        		int alt60 = 2;
            	        	        		int LA60_0 = input.LA(1);

            	        	        		if ( (LA60_0 == OF) )
            	        	        		{
            	        	        		    alt60 = 1;
            	        	        		}
            	        	        		switch (alt60) 
            	        	        		{
            	        	        		    case 1 :
            	        	        		        // Hql.g:441:16: OF
            	        	        		        {
            	        	        		        	OF177=(IToken)Match(input,OF,FOLLOW_OF_in_relationalExpression2206); 

            	        	        		        }
            	        	        		        break;

            	        	        		}

            	        	        		PushFollow(FOLLOW_path_in_relationalExpression2213);
            	        	        		p = path();
            	        	        		state.followingStackPointer--;


            	        	        						root_0 = ProcessMemberOf(n,((p != null) ? ((IASTNode)p.Tree) : null), root_0);
            	        	        					  

            	        	        	}


            	        	        }
            	        	        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;
    }