whole_func_string: function parseString(endQuote) {
      chars.push('"');
      i++;
      var c = curr();
      while (i < jsString.length && c !== endQuote) {
        if (c === '"' && prev() !== '\\') {
          // unescaped double quote, escape it
          chars.push('\\"');
        }
        else if (controlChars.hasOwnProperty(c)) {
          // replace unescaped control characters with escaped ones
          chars.push(controlChars[c])
        }
        else if (c === '\\') {
          // remove the escape character when followed by a single quote ', not needed
          i++;
          c = curr();
          if (c !== '\'') {
            chars.push('\\');
          }
          chars.push(c);
        }
        else {
          // regular character
          chars.push(c);
        }
  
        i++;
        c = curr();
      }
      if (c === endQuote) {
        chars.push('"');
        i++;
      }
    }
func_code_string: function parseString(endQuote) {
      chars.push('"');
      i++;
      var c = curr();
      while (i < jsString.length && c !== endQuote) {
        if (c === '"' && prev() !== '\\') {
          // unescaped double quote, escape it
          chars.push('\\"');
        }
        else if (controlChars.hasOwnProperty(c)) {
          // replace unescaped control characters with escaped ones
          chars.push(controlChars[c])
        }
        else if (c === '\\') {
          // remove the escape character when followed by a single quote ', not needed
          i++;
          c = curr();
          if (c !== '\'') {
            chars.push('\\');
          }
          chars.push(c);
        }
        else {
          // regular character
          chars.push(c);
        }
  
        i++;
        c = curr();
      }
      if (c === endQuote) {
        chars.push('"');
        i++;
      }
    }
func_documentation_string: parse single or double quoted string