public final TWS_SCHEDULESParser.untilDefinition_return untilDefinition() throws RecognitionException {
		TWS_SCHEDULESParser.untilDefinition_return retval = new TWS_SCHEDULESParser.untilDefinition_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token time=null;
		Token string_literal163=null;
		Token char_literal165=null;
		Token NUMBER166=null;
		Token string_literal168=null;
		ParserRuleReturnScope timeZoneDefinition164 =null;
		ParserRuleReturnScope day167 =null;
		ParserRuleReturnScope action169 =null;

		Object time_tree=null;
		Object string_literal163_tree=null;
		Object char_literal165_tree=null;
		Object NUMBER166_tree=null;
		Object string_literal168_tree=null;

		try {
			// /home/fferchic/workspace_antlr/af.jstech.migration/src/af/jstech/migration/jobstream/TWS_SCHEDULES.g:275:43: ( 'UNTIL' time= NUMBER ( timeZoneDefinition )? ( '+' NUMBER day )? ( 'ONUNTIL' action )? )
			// /home/fferchic/workspace_antlr/af.jstech.migration/src/af/jstech/migration/jobstream/TWS_SCHEDULES.g:276:2: 'UNTIL' time= NUMBER ( timeZoneDefinition )? ( '+' NUMBER day )? ( 'ONUNTIL' action )?
			{
			root_0 = (Object)adaptor.nil();


			string_literal163=(Token)match(input,74,FOLLOW_74_in_untilDefinition1184); 
			string_literal163_tree = (Object)adaptor.create(string_literal163);
			adaptor.addChild(root_0, string_literal163_tree);

			time=(Token)match(input,NUMBER,FOLLOW_NUMBER_in_untilDefinition1188); 
			time_tree = (Object)adaptor.create(time);
			adaptor.addChild(root_0, time_tree);

			// /home/fferchic/workspace_antlr/af.jstech.migration/src/af/jstech/migration/jobstream/TWS_SCHEDULES.g:276:23: ( timeZoneDefinition )?
			int alt72=2;
			int LA72_0 = input.LA(1);
			if ( (LA72_0==72||LA72_0==81) ) {
				alt72=1;
			}
			switch (alt72) {
				case 1 :
					// /home/fferchic/workspace_antlr/af.jstech.migration/src/af/jstech/migration/jobstream/TWS_SCHEDULES.g:276:23: timeZoneDefinition
					{
					pushFollow(FOLLOW_timeZoneDefinition_in_untilDefinition1191);
					timeZoneDefinition164=timeZoneDefinition();
					state._fsp--;

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

					}
					break;

			}

			// /home/fferchic/workspace_antlr/af.jstech.migration/src/af/jstech/migration/jobstream/TWS_SCHEDULES.g:276:43: ( '+' NUMBER day )?
			int alt73=2;
			int LA73_0 = input.LA(1);
			if ( (LA73_0==14) ) {
				alt73=1;
			}
			switch (alt73) {
				case 1 :
					// /home/fferchic/workspace_antlr/af.jstech.migration/src/af/jstech/migration/jobstream/TWS_SCHEDULES.g:276:44: '+' NUMBER day
					{
					char_literal165=(Token)match(input,14,FOLLOW_14_in_untilDefinition1195); 
					char_literal165_tree = (Object)adaptor.create(char_literal165);
					adaptor.addChild(root_0, char_literal165_tree);

					NUMBER166=(Token)match(input,NUMBER,FOLLOW_NUMBER_in_untilDefinition1197); 
					NUMBER166_tree = (Object)adaptor.create(NUMBER166);
					adaptor.addChild(root_0, NUMBER166_tree);

					pushFollow(FOLLOW_day_in_untilDefinition1199);
					day167=day();
					state._fsp--;

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

					}
					break;

			}

			// /home/fferchic/workspace_antlr/af.jstech.migration/src/af/jstech/migration/jobstream/TWS_SCHEDULES.g:276:61: ( 'ONUNTIL' action )?
			int alt74=2;
			int LA74_0 = input.LA(1);
			if ( (LA74_0==61) ) {
				alt74=1;
			}
			switch (alt74) {
				case 1 :
					// /home/fferchic/workspace_antlr/af.jstech.migration/src/af/jstech/migration/jobstream/TWS_SCHEDULES.g:276:62: 'ONUNTIL' action
					{
					string_literal168=(Token)match(input,61,FOLLOW_61_in_untilDefinition1204); 
					string_literal168_tree = (Object)adaptor.create(string_literal168);
					adaptor.addChild(root_0, string_literal168_tree);

					pushFollow(FOLLOW_action_in_untilDefinition1206);
					action169=action();
					state._fsp--;

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

					}
					break;

			}

			retval.endTime = Launcher.normalizeTime((time!=null?time.getText():null)) ;
			}

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

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

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}