code: def next_(self):
      self.scan_over_(Lexer.CHAR_WHITESPACE_)
      location = self.location_()
      start = self.pos_
      text = self.text_
      limit = len(text)
      if start >= limit:
          raise StopIteration()
      cur_char = text[start]
      next_char = text[start + 1] if start + 1 < limit else None
  
      if cur_char == "\n":
          self.pos_ += 1
          self.line_ += 1
          self.line_start_ = self.pos_
          return (Lexer.NEWLINE, None, location)
      if cur_char == "\r":
          self.pos_ += 2 if next_char == "\n" else 1
          self.line_ += 1
          self.line_start_ = self.pos_
          return (Lexer.NEWLINE, None, location)
      if cur_char == "#":
          self.scan_until_(Lexer.CHAR_NEWLINE_)
          return (Lexer.COMMENT, text[start : self.pos_], location)
  
      if self.mode_ is Lexer.MODE_FILENAME_:
          if cur_char != "(":
              raise FeatureLibError(
                  "Expected '(' before file name", location
              )
          self.scan_until_(")")
          cur_char = text[self.pos_] if self.pos_ < limit else None
          if cur_char != ")":
              raise FeatureLibError(
                  "Expected ')' after file name", location
              )
          self.pos_ += 1
          self.mode_ = Lexer.MODE_NORMAL_
          return (
              Lexer.FILENAME,
              text[start + 1 : self.pos_ - 1],
              location,
          )
  
      if cur_char == "\\" and next_char in Lexer.CHAR_DIGIT_:
          self.pos_ += 1
          self.scan_over_(Lexer.CHAR_DIGIT_)
          return (
              Lexer.CID,
              int(text[start + 1 : self.pos_], 10),
              location,
          )
      if cur_char == "@":
          self.pos_ += 1
          self.scan_over_(Lexer.CHAR_NAME_CONTINUATION_)
          glyphclass = text[start + 1 : self.pos_]
          if len(glyphclass) < 1:
              raise FeatureLibError(
                  "Expected glyph class name", location
              )
          if len(glyphclass) > 63:
              raise FeatureLibError(
                  "Glyph class names must not be longer than 63 characters",
                  location,
              )
          if not Lexer.RE_GLYPHCLASS.match(glyphclass):
              raise FeatureLibError(
                  "Glyph class names must consist of letters, digits, "
                  "underscore, period or hyphen",
                  location,
              )
          return (Lexer.GLYPHCLASS, glyphclass, location)
      if cur_char in Lexer.CHAR_NAME_START_:
          self.pos_ += 1
          self.scan_over_(Lexer.CHAR_NAME_CONTINUATION_)
          token = text[start : self.pos_]
          if token == "include":
              self.mode_ = Lexer.MODE_FILENAME_
          return (Lexer.NAME, token, location)
      if cur_char == "0" and next_char in "xX":
          self.pos_ += 2
          self.scan_over_(Lexer.CHAR_HEXDIGIT_)
          return (
              Lexer.HEXADECIMAL,
              int(text[start : self.pos_], 16),
              location,
          )
      if cur_char == "0" and next_char in Lexer.CHAR_DIGIT_:
          self.scan_over_(Lexer.CHAR_DIGIT_)
          return (
              Lexer.OCTAL,
              int(text[start : self.pos_], 8),
              location,
          )
      if cur_char in Lexer.CHAR_DIGIT_:
          self.scan_over_(Lexer.CHAR_DIGIT_)
          if self.pos_ >= limit or text[self.pos_] != ".":
              return (
                  Lexer.NUMBER,
                  int(text[start : self.pos_], 10),
                  location,
              )
          self.scan_over_(".")
          self.scan_over_(Lexer.CHAR_DIGIT_)
          return (Lexer.FLOAT, float(text[start : self.pos_]), location)
      if cur_char == "-" and next_char in Lexer.CHAR_DIGIT_:
          self.pos_ += 1
          self.scan_over_(Lexer.CHAR_DIGIT_)
          if self.pos_ >= limit or text[self.pos_] != ".":
              return (
                  Lexer.NUMBER,
                  int(text[start : self.pos_], 10),
                  location,
              )
          self.scan_over_(".")
          self.scan_over_(Lexer.CHAR_DIGIT_)
          return (Lexer.FLOAT, float(text[start : self.pos_]), location)
      if cur_char in Lexer.CHAR_SYMBOL_:
          self.pos_ += 1
          return (Lexer.SYMBOL, cur_char, location)
      if cur_char == '"':
          self.pos_ += 1
          self.scan_until_('"')
          if (
              self.pos_ < self.text_length_
              and self.text_[self.pos_] == '"'
          ):
              self.pos_ += 1
              # strip newlines embedded within a string
              string = re.sub(
                  "[\r\n]", "", text[start + 1 : self.pos_ - 1]
              )
              return (Lexer.STRING, string, location)
          else:
              raise FeatureLibError(
                  "Expected '\"' to terminate string", location
              )
      raise FeatureLibError(
          "Unexpected character: %r" % cur_char, location
      )
  
imports: from fontTools.feaLib.error import FeatureLibError, IncludedFeaNotFound
  from fontTools.feaLib.location import FeatureLibLocation
  import re
  import os
label_desc: Use image node_id 6 for calling the Lexer obj's underlying member method code with example usage: obj.next_() and returns: Lexer,  None,  location, Lexer,  None,  location, Lexer,  text,  location, Lexer,  text,  location, Lexer,  int,  location, Lexer,  glyphclass,  location, Lexer,  token,  location, Lexer,  int,  location, Lexer,  int,  location, Lexer,  float,  location, Lexer,  float,  location, Lexer,  cur_char,  location, Lexer,  int,  location, Lexer,  int,  location, Lexer,  string,  location