docs: public final void mRULE_STRING() throws RecognitionException {
          try {
              int _type = RULE_STRING;
              int _channel = DEFAULT_TOKEN_CHANNEL;
              // InternalSARL.g:48795:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
              // InternalSARL.g:48795:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
              {
              // InternalSARL.g:48795:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
              int alt48=2;
              int LA48_0 = input.LA(1);
  
              if ( (LA48_0=='\"') ) {
                  alt48=1;
              }
              else if ( (LA48_0=='\'') ) {
                  alt48=2;
              }
              else {
                  NoViableAltException nvae =
                      new NoViableAltException("", 48, 0, input);
  
                  throw nvae;
              }
              switch (alt48) {
                  case 1 :
                      // InternalSARL.g:48795:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
                      {
                      match('\"'); 
                      // InternalSARL.g:48795:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
                      loop44:
                      do {
                          int alt44=3;
                          int LA44_0 = input.LA(1);
  
                          if ( (LA44_0=='\\') ) {
                              alt44=1;
                          }
                          else if ( ((LA44_0>='\u0000' && LA44_0<='!')||(LA44_0>='#' && LA44_0<='[')||(LA44_0>=']' && LA44_0<='\uFFFF')) ) {
                              alt44=2;
                          }
  
  
                          switch (alt44) {
                      	case 1 :
                      	    // InternalSARL.g:48795:21: '\\\\' .
                      	    {
                      	    match('\\'); 
                      	    matchAny(); 
  
                      	    }
                      	    break;
                      	case 2 :
                      	    // InternalSARL.g:48795: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 loop44;
                          }
                      } while (true);
  
                      // InternalSARL.g:48795:44: ( '\"' )?
                      int alt45=2;
                      int LA45_0 = input.LA(1);
  
                      if ( (LA45_0=='\"') ) {
                          alt45=1;
                      }
                      switch (alt45) {
                          case 1 :
                              // InternalSARL.g:48795:44: '\"'
                              {
                              match('\"'); 
  
                              }
                              break;
  
                      }
  
  
                      }
                      break;
                  case 2 :
                      // InternalSARL.g:48795:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
                      {
                      match('\''); 
                      // InternalSARL.g:48795:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
                      loop46:
                      do {
                          int alt46=3;
                          int LA46_0 = input.LA(1);
  
                          if ( (LA46_0=='\\') ) {
                              alt46=1;
                          }
                          else if ( ((LA46_0>='\u0000' && LA46_0<='&')||(LA46_0>='(' && LA46_0<='[')||(LA46_0>=']' && LA46_0<='\uFFFF')) ) {
                              alt46=2;
                          }
  
  
                          switch (alt46) {
                      	case 1 :
                      	    // InternalSARL.g:48795:55: '\\\\' .
                      	    {
                      	    match('\\'); 
                      	    matchAny(); 
  
                      	    }
                      	    break;
                      	case 2 :
                      	    // InternalSARL.g:48795:62: ~ ( ( '\\\\' | '\\'' ) )
                      	    {
                      	    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 loop46;
                          }
                      } while (true);
  
                      // InternalSARL.g:48795:79: ( '\\'' )?
                      int alt47=2;
                      int LA47_0 = input.LA(1);
  
                      if ( (LA47_0=='\'') ) {
                          alt47=1;
                      }
                      switch (alt47) {
                          case 1 :
                              // InternalSARL.g:48795:79: '\\''
                              {
                              match('\''); 
  
                              }
                              break;
  
                      }
  
  
                      }
                      break;
  
              }
  
  
              }
  
              state.type = _type;
              state.channel = _channel;
          }
          finally {
          }
      }