class_docstr: A Lexer that follows include statements.
  
  The OpenType feature file specification states that due to
  historical reasons, relative imports should be resolved in this
  order:
  
  1. If the source font is UFO format, then relative to the UFO's
     font directory
  2. relative to the top-level include file
  3. relative to the parent include file
  
  We only support 1 (via includeDir) and 2.
class_docstr_tok: ["A","Lexer","that","follows","include","statements",".","The","OpenType","feature","file","specification","states","that","due","to","historical","reasons",",","relative","imports","should","be","resolved","in","this","order",":","1",".","If","the","source","font","is","UFO","format",",","then","relative","to","the","UFO's","font","directory","2.","relative","to","the","top-level","include","file","3.","relative","to","the","parent","include","file","We","only","support","1","(","via","includeDir",")","and","2","."]
code: def __next__(self):  # Python 3
      while self.lexers_:
          lexer = self.lexers_[-1]
          try:
              token_type, token, location = next(lexer)
          except StopIteration:
              self.lexers_.pop()
              continue
          if token_type is Lexer.NAME and token == "include":
              fname_type, fname_token, fname_location = lexer.next()
              if fname_type is not Lexer.FILENAME:
                  raise FeatureLibError(
                      "Expected file name", fname_location
                  )
              # semi_type, semi_token, semi_location = lexer.next()
              # if semi_type is not Lexer.SYMBOL or semi_token != ";":
              #    raise FeatureLibError("Expected ';'", semi_location)
              if os.path.isabs(fname_token):
                  path = fname_token
              else:
                  if self.includeDir is not None:
                      curpath = self.includeDir
                  elif self.featurefilepath is not None:
                      curpath = os.path.dirname(self.featurefilepath)
                  else:
                      # if the IncludingLexer was initialized from an in-memory
                      # file-like stream, it doesn't have a 'name' pointing to
                      # its filesystem path, therefore we fall back to using the
                      # current working directory to resolve relative includes
                      curpath = os.getcwd()
                  path = os.path.join(curpath, fname_token)
              if len(self.lexers_) >= 5:
                  raise FeatureLibError(
                      "Too many recursive includes", fname_location
                  )
              try:
                  self.lexers_.append(self.make_lexer_(path))
              except FileNotFoundError as err:
                  raise IncludedFeaNotFound(
                      fname_token, fname_location
                  ) from err
          else:
              return (token_type, token, location)
      raise StopIteration()
  
imports: from fontTools.feaLib.error import FeatureLibError, IncludedFeaNotFound
  from fontTools.feaLib.location import FeatureLibLocation
  import re
  import os
label_desc: Use image node_id 4 for calling the IncludingLexer obj's underlying member method code with example usage: obj.__next__() and returns: token_type,  token,  location