code: def run(self, grammar, code_lines, print_code):
      code = "".join(code_lines)
      modified_lines = self.apply(code_lines)
      modified_code = "".join(modified_lines)
  
      if print_code:
          if self._check_original:
              print("Original:")
              _print_copyable_lines(code_lines)
  
          print("\nModified:")
          _print_copyable_lines(modified_lines)
          print()
  
      if self._check_original:
          m = grammar.parse(code, diff_cache=True)
          start1 = _get_first_error_start_pos_or_none(m)
  
      grammar.parse(modified_code, diff_cache=True)
  
      if self._check_original:
          # Also check if it's possible to "revert" the changes.
          m = grammar.parse(code, diff_cache=True)
          start2 = _get_first_error_start_pos_or_none(m)
          assert start1 == start2, (start1, start2)
  
imports: from __future__ import print_function
  import logging
  import sys
  import os
  import random
  import pickle
  import parso
  from parso.utils import split_lines
  from test.test_diff_parser import _check_error_leaves_nodes
label_desc: Use image node_id 5 for calling the FileModification obj's underlying member method code with example usage: obj.run(grammar, code_lines, print_code) without return types