public final WaiprParser.prog_return prog() throws RecognitionException {
		WaiprParser.prog_return retval = new WaiprParser.prog_return();
		retval.start = input.LT(1);

		CommonTree root_0 = null;

		ParserRuleReturnScope machine1 =null;


		try {
			// Waipr.g:16:5: ( ( machine )+ )
			// Waipr.g:16:9: ( machine )+
			{
			root_0 = (CommonTree)adaptor.nil();


			// Waipr.g:16:9: ( machine )+
			int cnt1=0;
			loop1:
			while (true) {
				int alt1=2;
				int LA1_0 = input.LA(1);
				if ( (LA1_0==22) ) {
					alt1=1;
				}

				switch (alt1) {
				case 1 :
					// Waipr.g:16:9: machine
					{
					pushFollow(FOLLOW_machine_in_prog43);
					machine1=machine();
					state._fsp--;

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

					}
					break;

				default :
					if ( cnt1 >= 1 ) break loop1;
					EarlyExitException eee = new EarlyExitException(1, input);
					throw eee;
				}
				cnt1++;
			}

			}

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