public final hqlParser.groupByClause_return groupByClause() throws RecognitionException {
		hqlParser.groupByClause_return retval = new hqlParser.groupByClause_return();
		retval.start = input.LT(1);

		CommonTree root_0 = null;

		Token GROUP121=null;
		Token string_literal122=null;
		Token COMMA124=null;
		ParserRuleReturnScope expression123 =null;
		ParserRuleReturnScope expression125 =null;

		CommonTree GROUP121_tree=null;
		CommonTree string_literal122_tree=null;
		CommonTree COMMA124_tree=null;

		try {
			// hql.g:331:2: ( GROUP ^ 'by' ! expression ( COMMA ! expression )* )
			// hql.g:331:4: GROUP ^ 'by' ! expression ( COMMA ! expression )*
			{
			root_0 = (CommonTree)adaptor.nil();


			GROUP121=(Token)match(input,GROUP,FOLLOW_GROUP_in_groupByClause1573);
			GROUP121_tree = (CommonTree)adaptor.create(GROUP121);
			root_0 = (CommonTree)adaptor.becomeRoot(GROUP121_tree, root_0);

			string_literal122=(Token)match(input,LITERAL_by,FOLLOW_LITERAL_by_in_groupByClause1579);
			pushFollow(FOLLOW_expression_in_groupByClause1582);
			expression123=expression();
			state._fsp--;

			adaptor.addChild(root_0, expression123.getTree());

			// hql.g:332:20: ( COMMA ! expression )*
			loop39:
			while (true) {
				int alt39=2;
				int LA39_0 = input.LA(1);
				if ( (LA39_0==COMMA) ) {
					alt39=1;
				}

				switch (alt39) {
				case 1 :
					// hql.g:332:22: COMMA ! expression
					{
					COMMA124=(Token)match(input,COMMA,FOLLOW_COMMA_in_groupByClause1586);
					pushFollow(FOLLOW_expression_in_groupByClause1589);
					expression125=expression();
					state._fsp--;

					adaptor.addChild(root_0, expression125.getTree());

					}
					break;

				default :
					break loop39;
				}
			}

			}

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

			retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (CommonTree)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
public final hqlParser . groupByClause_return groupByClause ( ) throws RecognitionException { hqlParser . groupByClause_return retval = new hqlParser . groupByClause_return ( ) ; retval . start = input . LT ( 1 ) ; CommonTree root_0 = null ; Token GROUP121 = null ; Token string_literal122 = null ; Token COMMA124 = null ; ParserRuleReturnScope expression123 = null ; ParserRuleReturnScope expression125 = null ; CommonTree GROUP121_tree = null ; CommonTree string_literal122_tree = null ; CommonTree COMMA124_tree = null ; try { { root_0 = ( CommonTree ) adaptor . nil ( ) ; GROUP121 = ( Token ) match ( input , GROUP , FOLLOW_GROUP_in_groupByClause1573 ) ; GROUP121_tree = ( CommonTree ) adaptor . create ( GROUP121 ) ; root_0 = ( CommonTree ) adaptor . becomeRoot ( GROUP121_tree , root_0 ) ; string_literal122 = ( Token ) match ( input , LITERAL_by , FOLLOW_LITERAL_by_in_groupByClause1579 ) ; pushFollow ( FOLLOW_expression_in_groupByClause1582 ) ; expression123 = expression ( ) ; state . _fsp -- ; adaptor . addChild ( root_0 , expression123 . getTree ( ) ) ; loop39 : while ( true ) { int alt39 = 2 ; int LA39_0 = input . LA ( 1 ) ; if ( ( LA39_0 == COMMA ) ) { alt39 = 1 ; } switch ( alt39 ) { case 1 : { COMMA124 = ( Token ) match ( input , COMMA , FOLLOW_COMMA_in_groupByClause1586 ) ; pushFollow ( FOLLOW_expression_in_groupByClause1589 ) ; expression125 = expression ( ) ; state . _fsp -- ; adaptor . addChild ( root_0 , expression125 . getTree ( ) ) ; } break ; default : break loop39 ; } } } retval . stop = input . LT ( - 1 ) ; retval . tree = ( CommonTree ) adaptor . rulePostProcessing ( root_0 ) ; adaptor . setTokenBoundaries ( retval . tree , retval . start , retval . stop ) ; } catch ( RecognitionException re ) { reportError ( re ) ; recover ( input , re ) ; retval . tree = ( CommonTree ) adaptor . errorNode ( input , retval . start , input . LT ( - 1 ) , re ) ; } finally { } return retval ; }
hql.g:330:1: groupByClause : GROUP ^ 'by' ! expression ( COMMA ! expression )* ;