code: def include(self, tokens):
      # Try to extract the filename and then process an include file
      if not tokens:
          return
      if tokens:
          if tokens[0].value != "<" and tokens[0].type != self.t_STRING:
              tokens = self.expand_macros(tokens)
  
          if tokens[0].value == "<":
              # Include <...>
              i = 1
              while i < len(tokens):
                  if tokens[i].value == ">":
                      break
                  i += 1
              else:
                  print("Malformed #include <...>")
                  return
              filename = "".join([x.value for x in tokens[1:i]])
              path = self.path + [""] + self.temp_path
          elif tokens[0].type == self.t_STRING:
              filename = tokens[0].value[1:-1]
              path = self.temp_path + [""] + self.path
          else:
              print("Malformed #include statement")
              return
      for p in path:
          iname = os.path.join(p, filename)
          try:
              data = open(iname, "r").read()
              dname = os.path.dirname(iname)
              if dname:
                  self.temp_path.insert(0, dname)
              for tok in self.parsegen(data, filename):
                  yield tok
              if dname:
                  del self.temp_path[0]
              break
          except IOError:
              pass
      else:
          print("Couldn't find '%s'" % filename)
  
imports: import sys
  import re
  import copy
  import time
  import os.path
label_desc: Use image node_id 14 for calling the Preprocessor obj's underlying member method code with example usage: obj.include(tokens) without return types