docs: public final void mRULE_STRING() throws RecognitionException {
          try {
              int _type = RULE_STRING;
              int _channel = DEFAULT_TOKEN_CHANNEL;
              // InternalXtext.g:3760:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' ) )
              // InternalXtext.g:3760:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
              {
              // InternalXtext.g:3760:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
              int alt6=2;
              int LA6_0 = input.LA(1);
  
              if ( (LA6_0=='\"') ) {
                  alt6=1;
              }
              else if ( (LA6_0=='\'') ) {
                  alt6=2;
              }
              else {
                  NoViableAltException nvae =
                      new NoViableAltException("", 6, 0, input);
  
                  throw nvae;
              }
              switch (alt6) {
                  case 1 :
                      // InternalXtext.g:3760:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
                      {
                      match('\"'); 
                      // InternalXtext.g:3760:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
                      loop4:
                      do {
                          int alt4=3;
                          int LA4_0 = input.LA(1);
  
                          if ( (LA4_0=='\\') ) {
                              alt4=1;
                          }
                          else if ( ((LA4_0>='\u0000' && LA4_0<='!')||(LA4_0>='#' && LA4_0<='[')||(LA4_0>=']' && LA4_0<='\uFFFF')) ) {
                              alt4=2;
                          }
  
  
                          switch (alt4) {
                      	case 1 :
                      	    // InternalXtext.g:3760:21: '\\\\' .
                      	    {
                      	    match('\\'); 
                      	    matchAny(); 
  
                      	    }
                      	    break;
                      	case 2 :
                      	    // InternalXtext.g:3760:28: ~ ( ( '\\\\' | '\"' ) )
                      	    {
                      	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                      	        input.consume();
  
                      	    }
                      	    else {
                      	        MismatchedSetException mse = new MismatchedSetException(null,input);
                      	        recover(mse);
                      	        throw mse;}
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop4;
                          }
                      } while (true);
  
                      match('\"'); 
  
                      }
                      break;
                  case 2 :
                      // InternalXtext.g:3760:48: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
                      {
                      match('\''); 
                      // InternalXtext.g:3760:53: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
                      loop5:
                      do {
                          int alt5=3;
                          int LA5_0 = input.LA(1);
  
                          if ( (LA5_0=='\\') ) {
                              alt5=1;
                          }
                          else if ( ((LA5_0>='\u0000' && LA5_0<='&')||(LA5_0>='(' && LA5_0<='[')||(LA5_0>=']' && LA5_0<='\uFFFF')) ) {
                              alt5=2;
                          }
  
  
                          switch (alt5) {
                      	case 1 :
                      	    // InternalXtext.g:3760:54: '\\\\' .
                      	    {
                      	    match('\\'); 
                      	    matchAny(); 
  
                      	    }
                      	    break;
                      	case 2 :
                      	    // InternalXtext.g:3760:61: ~ ( ( '\\\\' | '\\'' ) )
                      	    {
                      	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                      	        input.consume();
  
                      	    }
                      	    else {
                      	        MismatchedSetException mse = new MismatchedSetException(null,input);
                      	        recover(mse);
                      	        throw mse;}
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop5;
                          }
                      } while (true);
  
                      match('\''); 
  
                      }
                      break;
  
              }
  
  
              }
  
              state.type = _type;
              state.channel = _channel;
          }
          finally {
          }
      }