// $ANTLR start "selectClause"
    // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:216:1: selectClause : SELECT ( DISTINCT )? ( selectedPropertiesList | newExpression | selectObject ) ;
    public HqlParser.selectClause_return selectClause() // throws RecognitionException [1]
    {   
        HqlParser.selectClause_return retval = new HqlParser.selectClause_return();
        retval.Start = input.LT(1);

        IASTNode root_0 = null;

        IToken SELECT41 = null;
        IToken DISTINCT42 = null;
        HqlParser.selectedPropertiesList_return selectedPropertiesList43 = default(HqlParser.selectedPropertiesList_return);

        HqlParser.newExpression_return newExpression44 = default(HqlParser.newExpression_return);

        HqlParser.selectObject_return selectObject45 = default(HqlParser.selectObject_return);


        IASTNode SELECT41_tree=null;
        IASTNode DISTINCT42_tree=null;

        try 
    	{
            // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:217:2: ( SELECT ( DISTINCT )? ( selectedPropertiesList | newExpression | selectObject ) )
            // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:217:4: SELECT ( DISTINCT )? ( selectedPropertiesList | newExpression | selectObject )
            {
            	root_0 = (IASTNode)adaptor.GetNilNode();

            	SELECT41=(IToken)Match(input,SELECT,FOLLOW_SELECT_in_selectClause990); 
            		SELECT41_tree = (IASTNode)adaptor.Create(SELECT41);
            		root_0 = (IASTNode)adaptor.BecomeRoot(SELECT41_tree, root_0);

            	 WeakKeywords(); 
            	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:219:3: ( DISTINCT )?
            	int alt14 = 2;
            	int LA14_0 = input.LA(1);

            	if ( (LA14_0 == DISTINCT) )
            	{
            	    alt14 = 1;
            	}
            	switch (alt14) 
            	{
            	    case 1 :
            	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:219:4: DISTINCT
            	        {
            	        	DISTINCT42=(IToken)Match(input,DISTINCT,FOLLOW_DISTINCT_in_selectClause1002); 
            	        		DISTINCT42_tree = (IASTNode)adaptor.Create(DISTINCT42);
            	        		adaptor.AddChild(root_0, DISTINCT42_tree);


            	        }
            	        break;

            	}

            	// /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:219:15: ( selectedPropertiesList | newExpression | selectObject )
            	int alt15 = 3;
            	switch ( input.LA(1) ) 
            	{
            	case ALL:
            	case ANY:
            	case AVG:
            	case COUNT:
            	case ELEMENTS:
            	case EXISTS:
            	case FALSE:
            	case INDICES:
            	case MAX:
            	case MIN:
            	case NOT:
            	case NULL:
            	case SOME:
            	case SUM:
            	case TRUE:
            	case CASE:
            	case EMPTY:
            	case NUM_INT:
            	case NUM_DOUBLE:
            	case NUM_FLOAT:
            	case NUM_LONG:
            	case OPEN:
            	case BNOT:
            	case PLUS:
            	case MINUS:
            	case COLON:
            	case PARAM:
            	case QUOTED_String:
            	case IDENT:
            		{
            	    alt15 = 1;
            	    }
            	    break;
            	case NEW:
            		{
            	    alt15 = 2;
            	    }
            	    break;
            	case OBJECT:
            		{
            	    alt15 = 3;
            	    }
            	    break;
            		default:
            		    NoViableAltException nvae_d15s0 =
            		        new NoViableAltException("", 15, 0, input);

            		    throw nvae_d15s0;
            	}

            	switch (alt15) 
            	{
            	    case 1 :
            	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:219:17: selectedPropertiesList
            	        {
            	        	PushFollow(FOLLOW_selectedPropertiesList_in_selectClause1008);
            	        	selectedPropertiesList43 = selectedPropertiesList();
            	        	state.followingStackPointer--;

            	        	adaptor.AddChild(root_0, selectedPropertiesList43.Tree);

            	        }
            	        break;
            	    case 2 :
            	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:219:42: newExpression
            	        {
            	        	PushFollow(FOLLOW_newExpression_in_selectClause1012);
            	        	newExpression44 = newExpression();
            	        	state.followingStackPointer--;

            	        	adaptor.AddChild(root_0, newExpression44.Tree);

            	        }
            	        break;
            	    case 3 :
            	        // /Users/Steve/Projects/NHibernate/Branches/2.1.x/nhibernate/src/NHibernate/Hql/Ast/ANTLR/Hql.g:219:58: selectObject
            	        {
            	        	PushFollow(FOLLOW_selectObject_in_selectClause1016);
            	        	selectObject45 = selectObject();
            	        	state.followingStackPointer--;

            	        	adaptor.AddChild(root_0, selectObject45.Tree);

            	        }
            	        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 "selectClause"
    // Hql.g:222:1: selectClause : SELECT ( DISTINCT )? ( selectedPropertiesList | newExpression | selectObject ) ;
    public HqlParser.selectClause_return selectClause() // throws RecognitionException [1]
    {   
        HqlParser.selectClause_return retval = new HqlParser.selectClause_return();
        retval.Start = input.LT(1);

        IASTNode root_0 = null;

        IToken SELECT45 = null;
        IToken DISTINCT46 = null;
        HqlParser.selectedPropertiesList_return selectedPropertiesList47 = default(HqlParser.selectedPropertiesList_return);

        HqlParser.newExpression_return newExpression48 = default(HqlParser.newExpression_return);

        HqlParser.selectObject_return selectObject49 = default(HqlParser.selectObject_return);


        IASTNode SELECT45_tree=null;
        IASTNode DISTINCT46_tree=null;

        try 
    	{
            // Hql.g:223:2: ( SELECT ( DISTINCT )? ( selectedPropertiesList | newExpression | selectObject ) )
            // Hql.g:223:4: SELECT ( DISTINCT )? ( selectedPropertiesList | newExpression | selectObject )
            {
            	root_0 = (IASTNode)adaptor.GetNilNode();

            	SELECT45=(IToken)Match(input,SELECT,FOLLOW_SELECT_in_selectClause1030); 
            		SELECT45_tree = (IASTNode)adaptor.Create(SELECT45);
            		root_0 = (IASTNode)adaptor.BecomeRoot(SELECT45_tree, root_0);

            	 WeakKeywords(); 
            	// Hql.g:225:3: ( DISTINCT )?
            	int alt17 = 2;
            	int LA17_0 = input.LA(1);

            	if ( (LA17_0 == DISTINCT) )
            	{
            	    alt17 = 1;
            	}
            	switch (alt17) 
            	{
            	    case 1 :
            	        // Hql.g:225:4: DISTINCT
            	        {
            	        	DISTINCT46=(IToken)Match(input,DISTINCT,FOLLOW_DISTINCT_in_selectClause1042); 
            	        		DISTINCT46_tree = (IASTNode)adaptor.Create(DISTINCT46);
            	        		adaptor.AddChild(root_0, DISTINCT46_tree);


            	        }
            	        break;

            	}

            	// Hql.g:225:15: ( selectedPropertiesList | newExpression | selectObject )
            	int alt18 = 3;
            	switch ( input.LA(1) ) 
            	{
            	case ALL:
            	case ANY:
            	case AVG:
            	case COUNT:
            	case ELEMENTS:
            	case EXISTS:
            	case FALSE:
            	case INDICES:
            	case MAX:
            	case MIN:
            	case NOT:
            	case NULL:
            	case SOME:
            	case SUM:
            	case TRUE:
            	case CASE:
            	case EMPTY:
            	case NUM_INT:
            	case NUM_DOUBLE:
            	case NUM_DECIMAL:
            	case NUM_FLOAT:
            	case NUM_LONG:
            	case OPEN:
            	case COLON:
            	case PARAM:
            	case BNOT:
            	case PLUS:
            	case MINUS:
            	case QUOTED_String:
            	case IDENT:
            		{
            	    alt18 = 1;
            	    }
            	    break;
            	case NEW:
            		{
            	    alt18 = 2;
            	    }
            	    break;
            	case OBJECT:
            		{
            	    alt18 = 3;
            	    }
            	    break;
            		default:
            		    NoViableAltException nvae_d18s0 =
            		        new NoViableAltException("", 18, 0, input);

            		    throw nvae_d18s0;
            	}

            	switch (alt18) 
            	{
            	    case 1 :
            	        // Hql.g:225:17: selectedPropertiesList
            	        {
            	        	PushFollow(FOLLOW_selectedPropertiesList_in_selectClause1048);
            	        	selectedPropertiesList47 = selectedPropertiesList();
            	        	state.followingStackPointer--;

            	        	adaptor.AddChild(root_0, selectedPropertiesList47.Tree);

            	        }
            	        break;
            	    case 2 :
            	        // Hql.g:225:42: newExpression
            	        {
            	        	PushFollow(FOLLOW_newExpression_in_selectClause1052);
            	        	newExpression48 = newExpression();
            	        	state.followingStackPointer--;

            	        	adaptor.AddChild(root_0, newExpression48.Tree);

            	        }
            	        break;
            	    case 3 :
            	        // Hql.g:225:58: selectObject
            	        {
            	        	PushFollow(FOLLOW_selectObject_in_selectClause1056);
            	        	selectObject49 = selectObject();
            	        	state.followingStackPointer--;

            	        	adaptor.AddChild(root_0, selectObject49.Tree);

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