code: def transform(grammar, text):
      
      results = []
      intervals = []
      for result, start, stop in all_matches(grammar, text):
          if result is not ignore_transform:
              internal_assert(isinstance(result, str), "got non-string transform result", result)
              if start == 0 and stop == len(text):
                  return result
              results.append(result)
              intervals.append((start, stop))
  
      if not results:
          return None
  
      split_indices = [0]
      split_indices.extend(start for start, _ in intervals)
      split_indices.extend(stop for _, stop in intervals)
      split_indices.sort()
      split_indices.append(None)
  
      out = []
      for i in range(len(split_indices) - 1):
          if i % 2 == 0:
              start, stop = split_indices[i], split_indices[i + 1]
              out.append(text[start:stop])
          else:
              out.append(results[i // 2])
      if i // 2 < len(results) - 1:
          raise CoconutInternalException("unused transform results", results[i // 2 + 1:])
      if stop is not None:
          raise CoconutInternalException("failed to properly split text to be transformed")
      return "".join(out)
docs: Transform text by replacing matches to grammar.