public final ExpressionContext expression(int _p) throws RecognitionException {
		ParserRuleContext _parentctx = _ctx;
		int _parentState = getState();
		ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState, _p);
		ExpressionContext _prevctx = _localctx;
		int _startState = 174;
		enterRecursionRule(_localctx, RULE_expression);
		int _la;
		try {
			int _alt;
			enterOuterAlt(_localctx, 1);
			{
			setState(1084);
			switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) {
			case 1:
				{
				_localctx = new UnaryExprContext(_localctx);
				_ctx = _localctx;
				_prevctx = _localctx;

				setState(1072);
				_la = _input.LA(1);
				if ( !(_la==6 || _la==44 || _la==67 || _la==72) ) {
				_errHandler.recoverInline(this);
				}
				consume();
				setState(1073); expression(17);
				}
				break;

			case 2:
				{
				_localctx = new NotExprContext(_localctx);
				_ctx = _localctx;
				_prevctx = _localctx;
				setState(1074);
				_la = _input.LA(1);
				if ( !(_la==34 || _la==88) ) {
				_errHandler.recoverInline(this);
				}
				consume();
				setState(1075); expression(16);
				}
				break;

			case 3:
				{
				_localctx = new CastExprContext(_localctx);
				_ctx = _localctx;
				_prevctx = _localctx;
				setState(1076); match(45);
				setState(1077); typeRef();
				setState(1078); match(22);
				setState(1079); expression(15);
				}
				break;

			case 4:
				{
				_localctx = new PrimaryExprContext(_localctx);
				_ctx = _localctx;
				_prevctx = _localctx;
				setState(1081); primary();
				}
				break;

			case 5:
				{
				_localctx = new NewCreatorExprContext(_localctx);
				_ctx = _localctx;
				_prevctx = _localctx;
				setState(1082); match(29);
				setState(1083); creator();
				}
				break;
			}
			_ctx.stop = _input.LT(-1);
			setState(1212);
			_errHandler.sync(this);
			_alt = getInterpreter().adaptivePredict(_input,141,_ctx);
			while ( _alt!=2 && _alt!=-1 ) {
				if ( _alt==1 ) {
					if ( _parseListeners!=null ) triggerExitRuleEvent();
					_prevctx = _localctx;
					{
					setState(1210);
					switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) {
					case 1:
						{
						_localctx = new MulExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1086);
						if (!(13 >= _localctx._p)) throw new FailedPredicateException(this, "13 >= $_p");
						setState(1087);
						_la = _input.LA(1);
						if ( !(_la==3 || _la==20 || _la==86) ) {
						_errHandler.recoverInline(this);
						}
						consume();
						setState(1088); expression(14);
						}
						break;

					case 2:
						{
						_localctx = new SumExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1089);
						if (!(12 >= _localctx._p)) throw new FailedPredicateException(this, "12 >= $_p");
						setState(1090);
						_la = _input.LA(1);
						if ( !(_la==44 || _la==72) ) {
						_errHandler.recoverInline(this);
						}
						consume();
						setState(1091); expression(13);
						}
						break;

					case 3:
						{
						_localctx = new ShiftExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1092);
						if (!(11 >= _localctx._p)) throw new FailedPredicateException(this, "11 >= $_p");
						setState(1100);
						switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) {
						case 1:
							{
							setState(1093); match(5);
							setState(1094); match(5);
							}
							break;

						case 2:
							{
							setState(1095); match(81);
							setState(1096); match(81);
							setState(1097); match(81);
							}
							break;

						case 3:
							{
							setState(1098); match(81);
							setState(1099); match(81);
							}
							break;
						}
						setState(1102); expression(12);
						}
						break;

					case 4:
						{
						_localctx = new CompExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1103);
						if (!(10 >= _localctx._p)) throw new FailedPredicateException(this, "10 >= $_p");
						setState(1110);
						switch ( getInterpreter().adaptivePredict(_input,134,_ctx) ) {
						case 1:
							{
							setState(1104); match(5);
							setState(1105); match(25);
							}
							break;

						case 2:
							{
							setState(1106); match(81);
							setState(1107); match(25);
							}
							break;

						case 3:
							{
							setState(1108); match(81);
							}
							break;

						case 4:
							{
							setState(1109); match(5);
							}
							break;
						}
						setState(1112); expression(11);
						}
						break;

					case 5:
						{
						_localctx = new EqExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1113);
						if (!(8 >= _localctx._p)) throw new FailedPredicateException(this, "8 >= $_p");
						setState(1114);
						_la = _input.LA(1);
						if ( !(_la==9 || _la==87) ) {
						_errHandler.recoverInline(this);
						}
						consume();
						setState(1115); expression(9);
						}
						break;

					case 6:
						{
						_localctx = new BitAndExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1116);
						if (!(7 >= _localctx._p)) throw new FailedPredicateException(this, "7 >= $_p");
						setState(1117); match(2);
						setState(1118); expression(8);
						}
						break;

					case 7:
						{
						_localctx = new BitXorExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1119);
						if (!(6 >= _localctx._p)) throw new FailedPredicateException(this, "6 >= $_p");
						setState(1120); match(70);
						setState(1121); expression(7);
						}
						break;

					case 8:
						{
						_localctx = new BitOrExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1122);
						if (!(5 >= _localctx._p)) throw new FailedPredicateException(this, "5 >= $_p");
						setState(1123); match(32);
						setState(1124); expression(6);
						}
						break;

					case 9:
						{
						_localctx = new AndExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1125);
						if (!(4 >= _localctx._p)) throw new FailedPredicateException(this, "4 >= $_p");
						setState(1126); match(78);
						setState(1127); expression(5);
						}
						break;

					case 10:
						{
						_localctx = new OrExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1128);
						if (!(3 >= _localctx._p)) throw new FailedPredicateException(this, "3 >= $_p");
						setState(1129); match(80);
						setState(1130); expression(4);
						}
						break;

					case 11:
						{
						_localctx = new AssignExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1131);
						if (!(1 >= _localctx._p)) throw new FailedPredicateException(this, "1 >= $_p");
						setState(1151);
						switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) {
						case 1:
							{
							setState(1132); match(61);
							}
							break;

						case 2:
							{
							setState(1133); match(59);
							}
							break;

						case 3:
							{
							setState(1134); match(38);
							}
							break;

						case 4:
							{
							setState(1135); match(21);
							}
							break;

						case 5:
							{
							setState(1136); match(85);
							}
							break;

						case 6:
							{
							setState(1137); match(48);
							}
							break;

						case 7:
							{
							setState(1138); match(28);
							}
							break;

						case 8:
							{
							setState(1139); match(25);
							}
							break;

						case 9:
							{
							setState(1140); match(81);
							setState(1141); match(81);
							setState(1142); match(25);
							}
							break;

						case 10:
							{
							setState(1143); match(81);
							setState(1144); match(81);
							setState(1145); match(81);
							setState(1146); match(25);
							}
							break;

						case 11:
							{
							setState(1147); match(5);
							setState(1148); match(5);
							setState(1149); match(25);
							}
							break;

						case 12:
							{
							setState(1150); match(83);
							}
							break;
						}
						setState(1153); expression(1);
						}
						break;

					case 12:
						{
						_localctx = new TernaryExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1154);
						if (!(2 >= _localctx._p)) throw new FailedPredicateException(this, "2 >= $_p");
						setState(1155); match(51);
						setState(1156); expression(0);
						setState(1157); match(46);
						setState(1158); expression(3);
						}
						break;

					case 13:
						{
						_localctx = new FieldExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1160);
						if (!(26 >= _localctx._p)) throw new FailedPredicateException(this, "26 >= $_p");
						setState(1161); match(71);
						setState(1162); match(Identifier);
						}
						break;

					case 14:
						{
						_localctx = new ThisExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1163);
						if (!(25 >= _localctx._p)) throw new FailedPredicateException(this, "25 >= $_p");
						setState(1164); match(71);
						setState(1165); match(79);
						}
						break;

					case 15:
						{
						_localctx = new SuperExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1166);
						if (!(24 >= _localctx._p)) throw new FailedPredicateException(this, "24 >= $_p");
						setState(1167); match(71);
						setState(1168); match(18);
						setState(1169); match(45);
						setState(1171);
						_la = _input.LA(1);
						if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << 6) | (1L << 7) | (1L << 10) | (1L << 12) | (1L << 14) | (1L << 15) | (1L << 18) | (1L << 26) | (1L << 29) | (1L << 34) | (1L << 35) | (1L << 36) | (1L << 44) | (1L << 45) | (1L << 49) | (1L << 53))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (65 - 65)) | (1L << (67 - 65)) | (1L << (69 - 65)) | (1L << (72 - 65)) | (1L << (79 - 65)) | (1L << (88 - 65)) | (1L << (HexLiteral - 65)) | (1L << (DecimalLiteral - 65)) | (1L << (OctalLiteral - 65)) | (1L << (BinaryLiteral - 65)) | (1L << (FloatingPointLiteral - 65)) | (1L << (CharacterLiteral - 65)) | (1L << (StringLiteral - 65)) | (1L << (Identifier - 65)))) != 0)) {
							{
							setState(1170); expressionList();
							}
						}

						setState(1173); match(22);
						}
						break;

					case 16:
						{
						_localctx = new NewCallExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1174);
						if (!(23 >= _localctx._p)) throw new FailedPredicateException(this, "23 >= $_p");
						setState(1175); match(71);
						setState(1176); match(29);
						setState(1177); match(Identifier);
						setState(1178); match(45);
						setState(1180);
						_la = _input.LA(1);
						if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << 6) | (1L << 7) | (1L << 10) | (1L << 12) | (1L << 14) | (1L << 15) | (1L << 18) | (1L << 26) | (1L << 29) | (1L << 34) | (1L << 35) | (1L << 36) | (1L << 44) | (1L << 45) | (1L << 49) | (1L << 53))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (65 - 65)) | (1L << (67 - 65)) | (1L << (69 - 65)) | (1L << (72 - 65)) | (1L << (79 - 65)) | (1L << (88 - 65)) | (1L << (HexLiteral - 65)) | (1L << (DecimalLiteral - 65)) | (1L << (OctalLiteral - 65)) | (1L << (BinaryLiteral - 65)) | (1L << (FloatingPointLiteral - 65)) | (1L << (CharacterLiteral - 65)) | (1L << (StringLiteral - 65)) | (1L << (Identifier - 65)))) != 0)) {
							{
							setState(1179); expressionList();
							}
						}

						setState(1182); match(22);
						}
						break;

					case 17:
						{
						_localctx = new SuperMethodExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1183);
						if (!(22 >= _localctx._p)) throw new FailedPredicateException(this, "22 >= $_p");
						setState(1184); match(71);
						setState(1185); match(18);
						setState(1186); match(71);
						setState(1187); match(Identifier);
						setState(1189);
						switch ( getInterpreter().adaptivePredict(_input,138,_ctx) ) {
						case 1:
							{
							setState(1188); arguments();
							}
							break;
						}
						}
						break;

					case 18:
						{
						_localctx = new MethodCallExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1191);
						if (!(21 >= _localctx._p)) throw new FailedPredicateException(this, "21 >= $_p");
						setState(1192); match(71);
						setState(1193); explicitGenericInvocation();
						}
						break;

					case 19:
						{
						_localctx = new IndexExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1194);
						if (!(20 >= _localctx._p)) throw new FailedPredicateException(this, "20 >= $_p");
						setState(1195); match(4);
						setState(1196); expression(0);
						setState(1197); match(37);
						}
						break;

					case 20:
						{
						_localctx = new CallExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1199);
						if (!(19 >= _localctx._p)) throw new FailedPredicateException(this, "19 >= $_p");
						setState(1200); match(45);
						setState(1202);
						_la = _input.LA(1);
						if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << 6) | (1L << 7) | (1L << 10) | (1L << 12) | (1L << 14) | (1L << 15) | (1L << 18) | (1L << 26) | (1L << 29) | (1L << 34) | (1L << 35) | (1L << 36) | (1L << 44) | (1L << 45) | (1L << 49) | (1L << 53))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (65 - 65)) | (1L << (67 - 65)) | (1L << (69 - 65)) | (1L << (72 - 65)) | (1L << (79 - 65)) | (1L << (88 - 65)) | (1L << (HexLiteral - 65)) | (1L << (DecimalLiteral - 65)) | (1L << (OctalLiteral - 65)) | (1L << (BinaryLiteral - 65)) | (1L << (FloatingPointLiteral - 65)) | (1L << (CharacterLiteral - 65)) | (1L << (StringLiteral - 65)) | (1L << (Identifier - 65)))) != 0)) {
							{
							setState(1201); expressionList();
							}
						}

						setState(1204); match(22);
						}
						break;

					case 21:
						{
						_localctx = new PostExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1205);
						if (!(18 >= _localctx._p)) throw new FailedPredicateException(this, "18 >= $_p");
						setState(1206);
						_la = _input.LA(1);
						if ( !(_la==6 || _la==67) ) {
						_errHandler.recoverInline(this);
						}
						consume();
						}
						break;

					case 22:
						{
						_localctx = new InstanceofExprContext(new ExpressionContext(_parentctx, _parentState, _p));
						pushNewRecursionContext(_localctx, _startState, RULE_expression);
						setState(1207);
						if (!(9 >= _localctx._p)) throw new FailedPredicateException(this, "9 >= $_p");
						setState(1208); match(89);
						setState(1209); typeRef();
						}
						break;
					}
					} 
				}
				setState(1214);
				_errHandler.sync(this);
				_alt = getInterpreter().adaptivePredict(_input,141,_ctx);
			}
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			unrollRecursionContexts(_parentctx);
		}
		return _localctx;
	}