///|
pub fn[RL : TokenRecognizer] Lexer::parse_next(
  self : Lexer[RL],
  options : LexerOptions?,
) -> Result[LocatedToken, TokenRecognizerError]? {
  // 检查是否结束
  if self.is_ending && self.position.buffer_offset >= self.data.length() {
    return None
  }

  // 1. 记录跳过前的位置
  let before_offset = self.position.buffer_offset

  // 2. 跳过空白和注释
  if self.skip_whitespaces_and_comments() {
    // 返回 LineJump
    let range = Range::Range(before_offset, self.position.buffer_offset)

    return Some(Ok(LocatedToken(N3Token::LineJump, range)))
  }

  // 3. 没有空白需要处理,调用识别器
  let start_offset = self.position.buffer_offset
  let view = self.data[start_offset:]
  let start_pos = SourcePos::default()
  self.current_token_start = start_offset // ★ 添加这行
  match
    self.parser.recognize_next_token(view, self.is_ending, options, start_pos) {
    Some((consumed, result)) => {
      let actual_consumed = if consumed <= 0 { 1 } else { consumed }

      self.position.buffer_offset += actual_consumed
      self.position.global_offset += actual_consumed
      self.current_token_start = start_offset
      self.current_token_end = start_offset + consumed
      let range = Range::Range(start_offset, start_offset + consumed)

      // 统计换行
      let consumed_view = self.data[start_offset:start_offset + actual_consumed]
      let mut line_jumps = 0
      for b in consumed_view {
        if b == b'\n' {
          line_jumps += 1
        }
      }
      self.position.global_line += line_jumps

      match result {
        Ok(token) => {
          let range = Range::Range(start_offset, start_offset + actual_consumed)
          // debug("parse_next: token: \{token.into_token()}")
          Some(Ok(LocatedToken(token.into_token(), range)))
        }
        Err(e) => {
          let bytes = self.range_to_bytes(range)
          return Some(
            Err(TokenRecognizerError::InvalidToken(e.message(), bytes, range)),
          )
        }
      }
    }
    None => None
  }
}