whole_func_string: function NamedGroupRefOrChars(text, textLoc) {
    const groupName = text.slice(3, -1);
  
    if (namedGroups.hasOwnProperty(groupName)) {
      return Node({
        type: 'Backreference',
        kind: 'name',
        number: namedGroups[groupName],
        reference: groupName,
      }, textLoc);
    }
  
    // Else `\k<foo>` should be parsed as a list of `Char`s.
    // This is really a 0.01% edge case, but we should handle it.
  
    let startOffset = null;
    let startLine = null;
    let endLine = null;
    let startColumn = null;
  
    if (textLoc) {
      startOffset = textLoc.startOffset;
      startLine = textLoc.startLine;
      endLine = textLoc.endLine;
      startColumn = textLoc.startColumn;
    }
  
    const charRe = /^[\w$<>]/;
    let loc;
  
    const chars = [
      // Init to first \k, taking 2 symbols.
      Char(
        text.slice(1, 2),
        'simple',
        startOffset
          ? {
            startLine,
            endLine,
            startColumn,
            startOffset,
            endOffset: startOffset += 2,
            endColumn: startColumn += 2,
          }
          : null
      ),
    ];
  
    // For \k
    chars[0].escaped = true;
  
    // Other symbols.
    text = text.slice(2);
  
    while (text.length > 0) {
      let matched = null;
  
      // Unicode, \u003B or \u{003B}
      if ((matched = text.match(uRe)) || (matched = text.match(ucpRe))) {
        if (startOffset) {
          loc = {
            startLine,
            endLine,
            startColumn,
            startOffset,
            endOffset: (startOffset += matched[0].length),
            endColumn: (startColumn += matched[0].length),
          };
        }
        chars.push(Char(matched[0], 'unicode', loc));
        text = text.slice(matched[0].length);
      }
  
      // Simple char.
      else if ((matched = text.match(charRe))) {
        if (startOffset) {
          loc = {
            startLine,
            endLine,
            startColumn,
            startOffset,
            endOffset: ++startOffset,
            endColumn: ++startColumn,
          };
        }
        chars.push(Char(matched[0], 'simple', loc));
        text = text.slice(1);
      }
    }
  
    return chars;
  }
func_code_string: function NamedGroupRefOrChars(text, textLoc) {
    const groupName = text.slice(3, -1);
  
    if (namedGroups.hasOwnProperty(groupName)) {
      return Node({
        type: 'Backreference',
        kind: 'name',
        number: namedGroups[groupName],
        reference: groupName,
      }, textLoc);
    }
  
    // Else `\k<foo>` should be parsed as a list of `Char`s.
    // This is really a 0.01% edge case, but we should handle it.
  
    let startOffset = null;
    let startLine = null;
    let endLine = null;
    let startColumn = null;
  
    if (textLoc) {
      startOffset = textLoc.startOffset;
      startLine = textLoc.startLine;
      endLine = textLoc.endLine;
      startColumn = textLoc.startColumn;
    }
  
    const charRe = /^[\w$<>]/;
    let loc;
  
    const chars = [
      // Init to first \k, taking 2 symbols.
      Char(
        text.slice(1, 2),
        'simple',
        startOffset
          ? {
            startLine,
            endLine,
            startColumn,
            startOffset,
            endOffset: startOffset += 2,
            endColumn: startColumn += 2,
          }
          : null
      ),
    ];
  
    // For \k
    chars[0].escaped = true;
  
    // Other symbols.
    text = text.slice(2);
  
    while (text.length > 0) {
      let matched = null;
  
      // Unicode, \u003B or \u{003B}
      if ((matched = text.match(uRe)) || (matched = text.match(ucpRe))) {
        if (startOffset) {
          loc = {
            startLine,
            endLine,
            startColumn,
            startOffset,
            endOffset: (startOffset += matched[0].length),
            endColumn: (startColumn += matched[0].length),
          };
        }
        chars.push(Char(matched[0], 'unicode', loc));
        text = text.slice(matched[0].length);
      }
  
      // Simple char.
      else if ((matched = text.match(charRe))) {
        if (startOffset) {
          loc = {
            startLine,
            endLine,
            startColumn,
            startOffset,
            endOffset: ++startOffset,
            endColumn: ++startColumn,
          };
        }
        chars.push(Char(matched[0], 'simple', loc));
        text = text.slice(1);
      }
    }
  
    return chars;
  }
func_documentation_string: Extracts from `\k<foo>` pattern either a backreference
  to a named capturing group (if it presents), or parses it
  as a list of char: `\k`, `<`, `f`, etc.