public final SS_play_expr additiveExpr(SS_statement stat) throws RecognitionException {
		SS_play_expr expr = null;


		Token j=null;
		SS_play_expr a =null;
		SS_play_expr b =null;

		try {
			// SayScript.g:285:3: (a= multiplyExpr[stat] (j= ( PLUS | DASH ) b= multiplyExpr[stat] )? )
			// SayScript.g:285:5: a= multiplyExpr[stat] (j= ( PLUS | DASH ) b= multiplyExpr[stat] )?
			{
			pushFollow(FOLLOW_multiplyExpr_in_additiveExpr2130);
			a=multiplyExpr(stat);
			state._fsp--;

			// SayScript.g:285:26: (j= ( PLUS | DASH ) b= multiplyExpr[stat] )?
			int alt17=2;
			int LA17_0 = input.LA(1);
			if ( (LA17_0==DASH||LA17_0==PLUS) ) {
				alt17=1;
			}
			switch (alt17) {
				case 1 :
					// SayScript.g:285:27: j= ( PLUS | DASH ) b= multiplyExpr[stat]
					{
					j=input.LT(1);
					if ( input.LA(1)==DASH||input.LA(1)==PLUS ) {
						input.consume();
						state.errorRecovery=false;
					}
					else {
						MismatchedSetException mse = new MismatchedSetException(null,input);
						throw mse;
					}
					pushFollow(FOLLOW_multiplyExpr_in_additiveExpr2144);
					b=multiplyExpr(stat);
					state._fsp--;

					expr = new SS_play_expr(); if((j!=null?j.getText():null).equals("+"))expr.type=SS_play_expr.SS_EXPR_PLUS; else expr.type=SS_play_expr.SS_EXPR_MINUS; expr.Left = a; expr.Right = b; 
					}
					break;

			}

			 if (b==null) expr=a; 
			}

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
		}
		finally {
			// do for sure before leaving
		}
		return expr;
	}