docs: public final void mRULE_COMMENT_RICH_TEXT_END() throws RecognitionException {
          try {
              int _type = RULE_COMMENT_RICH_TEXT_END;
              int _channel = DEFAULT_TOKEN_CHANNEL;
              // InternalSARL.g:48779:28: ( '\\uFFFD\\uFFFD' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' ( RULE_IN_RICH_STRING )* ( '\\'\\'\\'' | ( '\\'' ( '\\'' )? )? EOF ) | EOF ) )
              // InternalSARL.g:48779:30: '\\uFFFD\\uFFFD' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' ( RULE_IN_RICH_STRING )* ( '\\'\\'\\'' | ( '\\'' ( '\\'' )? )? EOF ) | EOF )
              {
              match("\uFFFD\uFFFD"); 
  
              // InternalSARL.g:48779:45: (~ ( ( '\\n' | '\\r' ) ) )*
              loop28:
              do {
                  int alt28=2;
                  int LA28_0 = input.LA(1);
  
                  if ( ((LA28_0>='\u0000' && LA28_0<='\t')||(LA28_0>='\u000B' && LA28_0<='\f')||(LA28_0>='\u000E' && LA28_0<='\uFFFF')) ) {
                      alt28=1;
                  }
  
  
                  switch (alt28) {
              	case 1 :
              	    // InternalSARL.g:48779:45: ~ ( ( '\\n' | '\\r' ) )
              	    {
              	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
              	        input.consume();
  
              	    }
              	    else {
              	        MismatchedSetException mse = new MismatchedSetException(null,input);
              	        recover(mse);
              	        throw mse;}
  
  
              	    }
              	    break;
  
              	default :
              	    break loop28;
                  }
              } while (true);
  
              // InternalSARL.g:48779:61: ( ( '\\r' )? '\\n' ( RULE_IN_RICH_STRING )* ( '\\'\\'\\'' | ( '\\'' ( '\\'' )? )? EOF ) | EOF )
              int alt34=2;
              int LA34_0 = input.LA(1);
  
              if ( (LA34_0=='\n'||LA34_0=='\r') ) {
                  alt34=1;
              }
              else {
                  alt34=2;}
              switch (alt34) {
                  case 1 :
                      // InternalSARL.g:48779:62: ( '\\r' )? '\\n' ( RULE_IN_RICH_STRING )* ( '\\'\\'\\'' | ( '\\'' ( '\\'' )? )? EOF )
                      {
                      // InternalSARL.g:48779:62: ( '\\r' )?
                      int alt29=2;
                      int LA29_0 = input.LA(1);
  
                      if ( (LA29_0=='\r') ) {
                          alt29=1;
                      }
                      switch (alt29) {
                          case 1 :
                              // InternalSARL.g:48779:62: '\\r'
                              {
                              match('\r'); 
  
                              }
                              break;
  
                      }
  
                      match('\n'); 
                      // InternalSARL.g:48779:73: ( RULE_IN_RICH_STRING )*
                      loop30:
                      do {
                          int alt30=2;
                          int LA30_0 = input.LA(1);
  
                          if ( (LA30_0=='\'') ) {
                              int LA30_1 = input.LA(2);
  
                              if ( (LA30_1=='\'') ) {
                                  int LA30_4 = input.LA(3);
  
                                  if ( ((LA30_4>='\u0000' && LA30_4<='&')||(LA30_4>='(' && LA30_4<='\uFFFC')||(LA30_4>='\uFFFE' && LA30_4<='\uFFFF')) ) {
                                      alt30=1;
                                  }
  
  
                              }
                              else if ( ((LA30_1>='\u0000' && LA30_1<='&')||(LA30_1>='(' && LA30_1<='\uFFFC')||(LA30_1>='\uFFFE' && LA30_1<='\uFFFF')) ) {
                                  alt30=1;
                              }
  
  
                          }
                          else if ( ((LA30_0>='\u0000' && LA30_0<='&')||(LA30_0>='(' && LA30_0<='\uFFFC')||(LA30_0>='\uFFFE' && LA30_0<='\uFFFF')) ) {
                              alt30=1;
                          }
  
  
                          switch (alt30) {
                      	case 1 :
                      	    // InternalSARL.g:48779:73: RULE_IN_RICH_STRING
                      	    {
                      	    mRULE_IN_RICH_STRING(); 
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop30;
                          }
                      } while (true);
  
                      // InternalSARL.g:48779:94: ( '\\'\\'\\'' | ( '\\'' ( '\\'' )? )? EOF )
                      int alt33=2;
                      int LA33_0 = input.LA(1);
  
                      if ( (LA33_0=='\'') ) {
                          int LA33_1 = input.LA(2);
  
                          if ( (LA33_1=='\'') ) {
                              int LA33_3 = input.LA(3);
  
                              if ( (LA33_3=='\'') ) {
                                  alt33=1;
                              }
                              else {
                                  alt33=2;}
                          }
                          else {
                              alt33=2;}
                      }
                      else {
                          alt33=2;}
                      switch (alt33) {
                          case 1 :
                              // InternalSARL.g:48779:95: '\\'\\'\\''
                              {
                              match("'''"); 
  
  
                              }
                              break;
                          case 2 :
                              // InternalSARL.g:48779:104: ( '\\'' ( '\\'' )? )? EOF
                              {
                              // InternalSARL.g:48779:104: ( '\\'' ( '\\'' )? )?
                              int alt32=2;
                              int LA32_0 = input.LA(1);
  
                              if ( (LA32_0=='\'') ) {
                                  alt32=1;
                              }
                              switch (alt32) {
                                  case 1 :
                                      // InternalSARL.g:48779:105: '\\'' ( '\\'' )?
                                      {
                                      match('\''); 
                                      // InternalSARL.g:48779:110: ( '\\'' )?
                                      int alt31=2;
                                      int LA31_0 = input.LA(1);
  
                                      if ( (LA31_0=='\'') ) {
                                          alt31=1;
                                      }
                                      switch (alt31) {
                                          case 1 :
                                              // InternalSARL.g:48779:110: '\\''
                                              {
                                              match('\''); 
  
                                              }
                                              break;
  
                                      }
  
  
                                      }
                                      break;
  
                              }
  
                              match(EOF); 
  
                              }
                              break;
  
                      }
  
  
                      }
                      break;
                  case 2 :
                      // InternalSARL.g:48779:123: EOF
                      {
                      match(EOF); 
  
                      }
                      break;
  
              }
  
  
              }
  
              state.type = _type;
              state.channel = _channel;
          }
          finally {
          }
      }