Scans the next token from the source
(&mut self)
| 463 | |
| 464 | // Scans the next token from the source |
| 465 | fn scan_token(&mut self) -> Token<'a> { |
| 466 | self.skip_white_spaces(); |
| 467 | |
| 468 | self.start = self.current; |
| 469 | |
| 470 | let c = match self.advance() { |
| 471 | Some(c) => c, |
| 472 | None => return Token::new(TokenType::Eof, "", self.line), |
| 473 | }; |
| 474 | |
| 475 | match c { |
| 476 | '(' => self.make_token(TokenType::OpenParen), |
| 477 | ')' => self.make_token(TokenType::CloseParen), |
| 478 | '[' => self.make_token(TokenType::OpenBracket), |
| 479 | ']' => self.make_token(TokenType::CloseBracket), |
| 480 | '{' => self.make_token(TokenType::OpenBrace), |
| 481 | '}' => self.make_token(TokenType::CloseBrace), |
| 482 | ';' => self.make_token(TokenType::Semicolon), |
| 483 | ',' => self.make_token(TokenType::Comma), |
| 484 | '@' => self.make_token(TokenType::At), |
| 485 | '$' => self.make_token(TokenType::Dollar), |
| 486 | '?' => self.make_token(TokenType::Question), |
| 487 | '_' => { |
| 488 | // Check if the next character is not alphanumeric or another underscore |
| 489 | if !matches!(self.peek(), Some(c) if c.is_alphanumeric() || c == '_') { |
| 490 | self.make_token(TokenType::Underscore) |
| 491 | } else { |
| 492 | // Otherwise, scan it as an identifier |
| 493 | self.scan_identifier() |
| 494 | } |
| 495 | } |
| 496 | '.' => { |
| 497 | let kind = if self.peek() == Some('.') { |
| 498 | self.advance(); |
| 499 | if self.peek() == Some('=') { |
| 500 | self.advance(); |
| 501 | TokenType::DotDotEq |
| 502 | } else { |
| 503 | TokenType::DotDot |
| 504 | } |
| 505 | } else { |
| 506 | TokenType::Dot |
| 507 | }; |
| 508 | self.make_token(kind) |
| 509 | } |
| 510 | '|' => { |
| 511 | let kind = if self.peek() == Some('>') { |
| 512 | self.advance(); |
| 513 | TokenType::PipeArrow |
| 514 | } else { |
| 515 | TokenType::Pipe |
| 516 | }; |
| 517 | self.make_token(kind) |
| 518 | } |
| 519 | '-' => { |
| 520 | let p = self.peek(); |
| 521 | let kind = if p == Some('>') { |
| 522 | self.advance(); |
no test coverage detected