public final HiveParser.recordReader_return recordReader() throws RecognitionException {
		HiveParser.recordReader_return retval = new HiveParser.recordReader_return();
		retval.start = input.LT(1);

		CommonTree root_0 = null;

		Token KW_RECORDREADER563=null;
		Token StringLiteral564=null;

		CommonTree KW_RECORDREADER563_tree=null;
		CommonTree StringLiteral564_tree=null;
		RewriteRuleTokenStream stream_StringLiteral=new RewriteRuleTokenStream(adaptor,"token StringLiteral");
		RewriteRuleTokenStream stream_KW_RECORDREADER=new RewriteRuleTokenStream(adaptor,"token KW_RECORDREADER");

		 msgs.push("record reader specification"); 
		try {
			// HiveParser.g:1505:5: ( KW_RECORDREADER StringLiteral -> ^( TOK_RECORDREADER StringLiteral ) | -> ^( TOK_RECORDREADER ) )
			int alt155=2;
			int LA155_0 = input.LA(1);
			if ( (LA155_0==KW_RECORDREADER) ) {
				alt155=1;
			}
			else if ( (LA155_0==EOF||LA155_0==KW_CLUSTER||LA155_0==KW_DISTRIBUTE||LA155_0==KW_FROM||LA155_0==KW_GROUP||LA155_0==KW_HAVING||LA155_0==KW_INSERT||LA155_0==KW_LATERAL||LA155_0==KW_LIMIT||LA155_0==KW_MAP||LA155_0==KW_ORDER||LA155_0==KW_REDUCE||LA155_0==KW_SELECT||LA155_0==KW_SORT||LA155_0==KW_UNION||LA155_0==KW_WHERE||LA155_0==KW_WINDOW||LA155_0==RPAREN) ) {
				alt155=2;
			}

			else {
				NoViableAltException nvae =
					new NoViableAltException("", 155, 0, input);
				throw nvae;
			}

			switch (alt155) {
				case 1 :
					// HiveParser.g:1505:7: KW_RECORDREADER StringLiteral
					{
					KW_RECORDREADER563=(Token)match(input,KW_RECORDREADER,FOLLOW_KW_RECORDREADER_in_recordReader8702);  
					stream_KW_RECORDREADER.add(KW_RECORDREADER563);

					StringLiteral564=(Token)match(input,StringLiteral,FOLLOW_StringLiteral_in_recordReader8704);  
					stream_StringLiteral.add(StringLiteral564);

					// AST REWRITE
					// elements: StringLiteral
					// token labels: 
					// rule labels: retval
					// token list labels: 
					// rule list labels: 
					// wildcard labels: 
					retval.tree = root_0;
					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

					root_0 = (CommonTree)adaptor.nil();
					// 1505:37: -> ^( TOK_RECORDREADER StringLiteral )
					{
						// HiveParser.g:1505:40: ^( TOK_RECORDREADER StringLiteral )
						{
						CommonTree root_1 = (CommonTree)adaptor.nil();
						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(TOK_RECORDREADER, "TOK_RECORDREADER"), root_1);
						adaptor.addChild(root_1, stream_StringLiteral.nextNode());
						adaptor.addChild(root_0, root_1);
						}

					}


					retval.tree = root_0;

					}
					break;
				case 2 :
					// HiveParser.g:1506:9: 
					{
					// AST REWRITE
					// elements: 
					// token labels: 
					// rule labels: retval
					// token list labels: 
					// rule list labels: 
					// wildcard labels: 
					retval.tree = root_0;
					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

					root_0 = (CommonTree)adaptor.nil();
					// 1506:9: -> ^( TOK_RECORDREADER )
					{
						// HiveParser.g:1506:12: ^( TOK_RECORDREADER )
						{
						CommonTree root_1 = (CommonTree)adaptor.nil();
						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(TOK_RECORDREADER, "TOK_RECORDREADER"), root_1);
						adaptor.addChild(root_0, root_1);
						}

					}


					retval.tree = root_0;

					}
					break;

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

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

			 msgs.pop(); 
		}

		catch (RecognitionException e) {
		 reportError(e);
		  throw e;
		}

		finally {
			// do for sure before leaving
		}
		return retval;
	}