public final StatementContext statement() throws RecognitionException {
		StatementContext _localctx = new StatementContext(_ctx, getState());
		enterRule(_localctx, 144, RULE_statement);
		int _la;
		try {
			int _alt;
			setState(934);
			switch ( getInterpreter().adaptivePredict(_input,107,_ctx) ) {
			case 1:
				enterOuterAlt(_localctx, 1);
				{
				setState(830); block();
				}
				break;

			case 2:
				enterOuterAlt(_localctx, 2);
				{
				setState(831); match(ASSERT);
				setState(832); expression(0);
				setState(835);
				_la = _input.LA(1);
				if (_la==COLON) {
					{
					setState(833); match(COLON);
					setState(834); expression(0);
					}
				}

				setState(837); match(SEMI);
				}
				break;

			case 3:
				enterOuterAlt(_localctx, 3);
				{
				setState(839); match(IF);
				setState(840); parExpression();
				setState(841); statement();
				setState(844);
				switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) {
				case 1:
					{
					setState(842); match(ELSE);
					setState(843); statement();
					}
					break;
				}
				}
				break;

			case 4:
				enterOuterAlt(_localctx, 4);
				{
				setState(846); match(FOR);
				setState(847); match(LPAREN);
				setState(848); forControl();
				setState(849); match(RPAREN);
				setState(850); statement();
				}
				break;

			case 5:
				enterOuterAlt(_localctx, 5);
				{
				setState(852); match(WHILE);
				setState(853); parExpression();
				setState(854); statement();
				}
				break;

			case 6:
				enterOuterAlt(_localctx, 6);
				{
				setState(856); match(DO);
				setState(857); statement();
				setState(858); match(WHILE);
				setState(859); parExpression();
				setState(860); match(SEMI);
				}
				break;

			case 7:
				enterOuterAlt(_localctx, 7);
				{
				setState(862); match(TRY);
				setState(863); block();
				setState(873);
				switch (_input.LA(1)) {
				case CATCH:
					{
					setState(865);
					_errHandler.sync(this);
					_la = _input.LA(1);
					do {
						{
						{
						setState(864); catchClause();
						}
						}
						setState(867);
						_errHandler.sync(this);
						_la = _input.LA(1);
					} while ( _la==CATCH );
					setState(870);
					_la = _input.LA(1);
					if (_la==FINALLY) {
						{
						setState(869); finallyBlock();
						}
					}

					}
					break;
				case FINALLY:
					{
					setState(872); finallyBlock();
					}
					break;
				default:
					throw new NoViableAltException(this);
				}
				}
				break;

			case 8:
				enterOuterAlt(_localctx, 8);
				{
				setState(875); match(TRY);
				setState(876); resourceSpecification();
				setState(877); block();
				setState(881);
				_errHandler.sync(this);
				_la = _input.LA(1);
				while (_la==CATCH) {
					{
					{
					setState(878); catchClause();
					}
					}
					setState(883);
					_errHandler.sync(this);
					_la = _input.LA(1);
				}
				setState(885);
				_la = _input.LA(1);
				if (_la==FINALLY) {
					{
					setState(884); finallyBlock();
					}
				}

				}
				break;

			case 9:
				enterOuterAlt(_localctx, 9);
				{
				setState(887); match(SWITCH);
				setState(888); parExpression();
				setState(889); match(LBRACE);
				setState(893);
				_errHandler.sync(this);
				_alt = getInterpreter().adaptivePredict(_input,102,_ctx);
				while ( _alt!=2 && _alt!=-1 ) {
					if ( _alt==1 ) {
						{
						{
						setState(890); switchBlockStatementGroup();
						}
						}
					}
					setState(895);
					_errHandler.sync(this);
					_alt = getInterpreter().adaptivePredict(_input,102,_ctx);
				}
				setState(899);
				_errHandler.sync(this);
				_la = _input.LA(1);
				while (_la==CASE || _la==DEFAULT) {
					{
					{
					setState(896); switchLabel();
					}
					}
					setState(901);
					_errHandler.sync(this);
					_la = _input.LA(1);
				}
				setState(902); match(RBRACE);
				}
				break;

			case 10:
				enterOuterAlt(_localctx, 10);
				{
				setState(904); match(SYNCHRONIZED);
				setState(905); parExpression();
				setState(906); block();
				}
				break;

			case 11:
				enterOuterAlt(_localctx, 11);
				{
				setState(908); match(RETURN);
				setState(910);
				_la = _input.LA(1);
				if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << BOOLEAN) | (1L << BYTE) | (1L << CHAR) | (1L << DOUBLE) | (1L << FLOAT) | (1L << INT) | (1L << LONG) | (1L << NEW) | (1L << SHORT) | (1L << SUPER) | (1L << THIS) | (1L << VOID) | (1L << IntegerLiteral) | (1L << FloatingPointLiteral) | (1L << BooleanLiteral) | (1L << CharacterLiteral) | (1L << StringLiteral) | (1L << NullLiteral) | (1L << LPAREN))) != 0) || ((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & ((1L << (LT - 68)) | (1L << (BANG - 68)) | (1L << (TILDE - 68)) | (1L << (INC - 68)) | (1L << (DEC - 68)) | (1L << (ADD - 68)) | (1L << (SUB - 68)) | (1L << (Identifier - 68)))) != 0)) {
					{
					setState(909); expression(0);
					}
				}

				setState(912); match(SEMI);
				}
				break;

			case 12:
				enterOuterAlt(_localctx, 12);
				{
				setState(913); match(THROW);
				setState(914); expression(0);
				setState(915); match(SEMI);
				}
				break;

			case 13:
				enterOuterAlt(_localctx, 13);
				{
				setState(917); match(BREAK);
				setState(919);
				_la = _input.LA(1);
				if (_la==Identifier) {
					{
					setState(918); match(Identifier);
					}
				}

				setState(921); match(SEMI);
				}
				break;

			case 14:
				enterOuterAlt(_localctx, 14);
				{
				setState(922); match(CONTINUE);
				setState(924);
				_la = _input.LA(1);
				if (_la==Identifier) {
					{
					setState(923); match(Identifier);
					}
				}

				setState(926); match(SEMI);
				}
				break;

			case 15:
				enterOuterAlt(_localctx, 15);
				{
				setState(927); match(SEMI);
				}
				break;

			case 16:
				enterOuterAlt(_localctx, 16);
				{
				setState(928); statementExpression();
				setState(929); match(SEMI);
				}
				break;

			case 17:
				enterOuterAlt(_localctx, 17);
				{
				setState(931); match(Identifier);
				setState(932); match(COLON);
				setState(933); statement();
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}