code: def _parse(self, root, line, idx):
          
          # Base (or degenerate..) case.
          if len(line) == 0:
              return [], idx
  
          parse = []
          curr = 0
          node = root
          cidx = idx
          while curr < len(line):
              node = node.children.get(line[curr])
              curr += 1
              if not node:
                  break
              if node.sentinel:
                  subparse, cidx = self._parse(root, line[curr:], idx + curr)
                  # Always keep the latest valid parse, which will be
                  # the longest-matched (greedy match) graphemes.
                  parse = [line[:curr]]
                  parse.extend(subparse)
          if parse:
              idx = cidx
          return parse, idx
docs: :param root: Tree node.
          :param line: String to parse.
          :param idx: Global counter of characters parsed.
          :return: (list of parsed graphemes, incremented character count)