docs: def token(self, i, restrict=None):
          """
          Get the i'th token, and if i is one past the end, then scan
          for another token; restrict is a list of tokens that
          are allowed, or 0 for any token.
          """
          tokens_len = len(self.tokens)
          if i == tokens_len:  # We are at the end, ge the next...
              tokens_len += self.scan(restrict)
          if i < tokens_len:
              if restrict and self.restrictions[i] and restrict > self.restrictions[i]:
                  raise NotImplementedError(
                      "Unimplemented: restriction set changed")
              return self.tokens[i]
          raise NoMoreTokens()