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


		Token e=null;
		SS_play_expr a =null;
		SS_play_expr b =null;

		try {
			// SayScript.g:262:3: (a= relationalExpr[stat] (e= ( EQEQ | NOTEQ ) b= relationalExpr[stat] )? )
			// SayScript.g:262:5: a= relationalExpr[stat] (e= ( EQEQ | NOTEQ ) b= relationalExpr[stat] )?
			{
			pushFollow(FOLLOW_relationalExpr_in_equalityExpr2033);
			a=relationalExpr(stat);
			state._fsp--;

			// SayScript.g:262:28: (e= ( EQEQ | NOTEQ ) b= relationalExpr[stat] )?
			int alt15=2;
			int LA15_0 = input.LA(1);
			if ( (LA15_0==EQEQ||LA15_0==NOTEQ) ) {
				alt15=1;
			}
			switch (alt15) {
				case 1 :
					// SayScript.g:262:29: e= ( EQEQ | NOTEQ ) b= relationalExpr[stat]
					{
					e=input.LT(1);
					if ( input.LA(1)==EQEQ||input.LA(1)==NOTEQ ) {
						input.consume();
						state.errorRecovery=false;
					}
					else {
						MismatchedSetException mse = new MismatchedSetException(null,input);
						throw mse;
					}
					pushFollow(FOLLOW_relationalExpr_in_equalityExpr2049);
					b=relationalExpr(stat);
					state._fsp--;

					expr = new SS_play_expr(); if((e!=null?e.getText():null).equals("==")) expr.type=SS_play_expr.SS_EXPR_EQ; else expr.type=SS_play_expr.SS_EXPR_NEQ; 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;
	}