public final TransformationContext transformation() throws RecognitionException {
		TransformationContext _localctx = new TransformationContext(_ctx, getState());
		enterRule(_localctx, 90, RULE_transformation);
		int _la;
		try {
			int _alt;
			setState(928);
			switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) {
			case 1:
				_localctx = new CallTransformationContext(_localctx);
				enterOuterAlt(_localctx, 1);
				{
				setState(878);
				_la = _input.LA(1);
				if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__53) | (1L << T__52) | (1L << T__49) | (1L << T__47) | (1L << T__46) | (1L << T__44) | (1L << T__34) | (1L << T__29) | (1L << T__20) | (1L << T__3) | (1L << GID) | (1L << ID) | (1L << MSTRING))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (AddOP - 72)) | (1L << (MulOP - 72)) | (1L << (UnaryOP - 72)) | (1L << (HEX - 72)) | (1L << (DEC - 72)) | (1L << (OCT - 72)) | (1L << (BIN - 72)) | (1L << (FLOAT - 72)) | (1L << (CHAR - 72)) | (1L << (STRING - 72)))) != 0)) {
					{
					setState(877); guard();
					}
				}

				setState(880); match(T__48);
				setState(890);
				switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) {
				case 1:
					{
					setState(881); ((CallTransformationContext)_localctx).ID = match(ID);
					((CallTransformationContext)_localctx).clhs.add(((CallTransformationContext)_localctx).ID);
					setState(886);
					_errHandler.sync(this);
					_la = _input.LA(1);
					while (_la==T__45) {
						{
						{
						setState(882); match(T__45);
						setState(883); ((CallTransformationContext)_localctx).ID = match(ID);
						((CallTransformationContext)_localctx).clhs.add(((CallTransformationContext)_localctx).ID);
						}
						}
						setState(888);
						_errHandler.sync(this);
						_la = _input.LA(1);
					}
					setState(889); match(AssignOP);
					}
					break;
				}
				setState(892); ((CallTransformationContext)_localctx).p = match(ID);
				setState(893); tupleExp();
				setState(897);
				_errHandler.sync(this);
				_la = _input.LA(1);
				while (_la==T__35) {
					{
					{
					setState(894); ((CallTransformationContext)_localctx).annotation = annotation();
					((CallTransformationContext)_localctx).cans.add(((CallTransformationContext)_localctx).annotation);
					}
					}
					setState(899);
					_errHandler.sync(this);
					_la = _input.LA(1);
				}
				setState(902);
				switch (_input.LA(1)) {
				case T__23:
					{
					setState(900); gotoj();
					}
					break;
				case T__25:
					{
					setState(901); match(T__25);
					}
					break;
				default:
					throw new NoViableAltException(this);
				}
				setState(907);
				_errHandler.sync(this);
				_la = _input.LA(1);
				while (_la==T__35) {
					{
					{
					setState(904); ((CallTransformationContext)_localctx).annotation = annotation();
					((CallTransformationContext)_localctx).tanns.add(((CallTransformationContext)_localctx).annotation);
					}
					}
					setState(909);
					_errHandler.sync(this);
					_la = _input.LA(1);
				}
				}
				break;
			case 2:
				_localctx = new BlockTransformationContext(_localctx);
				enterOuterAlt(_localctx, 2);
				{
				setState(911);
				switch ( getInterpreter().adaptivePredict(_input,123,_ctx) ) {
				case 1:
					{
					setState(910); guard();
					}
					break;
				}
				setState(916);
				_errHandler.sync(this);
				_alt = getInterpreter().adaptivePredict(_input,124,_ctx);
				while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
					if ( _alt==1 ) {
						{
						{
						setState(913); action();
						}
						} 
					}
					setState(918);
					_errHandler.sync(this);
					_alt = getInterpreter().adaptivePredict(_input,124,_ctx);
				}
				setState(920);
				_la = _input.LA(1);
				if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__28) | (1L << T__23) | (1L << T__20) | (1L << T__17))) != 0)) {
					{
					setState(919); jump();
					}
				}

				setState(925);
				_errHandler.sync(this);
				_la = _input.LA(1);
				while (_la==T__35) {
					{
					{
					setState(922); ((BlockTransformationContext)_localctx).annotation = annotation();
					((BlockTransformationContext)_localctx).tanns.add(((BlockTransformationContext)_localctx).annotation);
					}
					}
					setState(927);
					_errHandler.sync(this);
					_la = _input.LA(1);
				}
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.reportError(this, re);
			_errHandler.recover(this, re);
		}
		finally {
			exitRule();
		}
		return _localctx;
	}