diff options
| author | Mel <einebeere@gmail.com> | 2021-10-22 23:58:52 +0200 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2021-10-22 23:58:52 +0200 |
| commit | 93f441d6fd47f44e99e28f1e0687bfa1a56830c5 (patch) | |
| tree | a080186680e7d5765d902952e2a3a924e97ad43b /src/lex | |
| parent | d4b8a0708232e2c4459f0e1a3b2f2814316359e8 (diff) | |
| download | rabbithole-93f441d6fd47f44e99e28f1e0687bfa1a56830c5.tar.zst rabbithole-93f441d6fd47f44e99e28f1e0687bfa1a56830c5.zip | |
Skip comments in lexer
Diffstat (limited to 'src/lex')
| -rw-r--r-- | src/lex/lexer.rs | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/src/lex/lexer.rs b/src/lex/lexer.rs index f9278aa..c8c1a2f 100644 --- a/src/lex/lexer.rs +++ b/src/lex/lexer.rs @@ -18,7 +18,9 @@ impl Iterator for Lexer<'_> { return None; } - if let None = self.chars.peek() { + self.skip_non_code(); + + if self.peek().is_none() { self.done = true; return Some(Token { location: self.location, @@ -26,9 +28,7 @@ impl Iterator for Lexer<'_> { }); } - self.skip_whitespace(); - - let c = *self.chars.peek()?; + let c = self.peek()?; let token = if c.is_numeric() { self.number() @@ -112,6 +112,10 @@ impl<'s> Lexer<'s> { } } + fn peek(&mut self) -> Option<char> { + self.chars.peek().copied() + } + fn advance(&mut self) -> Option<char> { let next = self.chars.next(); if let Some(c) = next { @@ -119,7 +123,7 @@ impl<'s> Lexer<'s> { self.location.row += 1; self.location.col = 0; } else { - self.location.row += 1; + self.location.col += 1; } } @@ -130,13 +134,25 @@ impl<'s> Lexer<'s> { self.chars.next_if_eq(&c).is_some() } - fn skip_whitespace(&mut self) { - while self - .chars - .peek() - .map_or(false, |x| x.is_whitespace() || *x == '\n') - { - self.advance(); + fn skip_non_code(&mut self) { + let mut is_in_comment = false; + loop { + if let Some(c) = self.peek() { + if is_in_comment { + if c == '\n' { + is_in_comment = false; + } + } else { + if c == '#' { + is_in_comment = true; + } else if !c.is_whitespace() && c != '\n' { + break; + } + } + self.advance(); + } else { + break; + } } } @@ -146,11 +162,7 @@ impl<'s> Lexer<'s> { let mut is_integer = true; let mut buffer = String::new(); - while self - .chars - .peek() - .map_or(false, |&c| c.is_numeric() || c == '.') - { + while self.peek().map_or(false, |c| c.is_numeric() || c == '.') { let c = self.advance().unwrap(); if c == '.' { is_integer = false; @@ -174,7 +186,7 @@ impl<'s> Lexer<'s> { let mut buffer = String::new(); - while self.chars.peek().map_or(false, |&c| c.is_alphabetic()) { + while self.peek().map_or(false, |c| c.is_alphabetic()) { let c = self.advance().unwrap(); buffer.push(c); } |
