From 455750599944e58d0a0a61ce54f6023dd1ba9230 Mon Sep 17 00:00:00 2001 From: Sander Hautvast Date: Fri, 24 Jan 2020 13:00:03 +0100 Subject: [PATCH] the scanner now recognizes some double character tokens like greater or equal (>=) --- src/scanner.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/tokens.rs | 11 ++++++++++ 2 files changed, 67 insertions(+) diff --git a/src/scanner.rs b/src/scanner.rs index c6c57fa..11a9e65 100644 --- a/src/scanner.rs +++ b/src/scanner.rs @@ -68,6 +68,37 @@ impl Scanner<'_> { '+' => self.add_token(PLUS), ';' => self.add_token(SEMICOLON), '*' => self.add_token(STAR), + '/' => { + if self.match_char('/') { + while self.peek(0) != '\n' && !self.is_at_end() { + self.advance(); + } + } else { + self.add_token(SLASH); + } + } + '!' => { + let token = if self.match_char('=') { BANGEQUAL } else { BANG }; + self.add_token(token); + } + '=' => { + let token = if self.match_char('=') { EQUALEQUAL } else { EQUAL }; + self.add_token(token); + } + '>' => { + let token = if self.match_char('=') { GREATEREQUAL } else { GREATER }; + self.add_token(token); + } + '<' => { + let token = if self.match_char('=') { LESSEQUAL } else { LESS }; + self.add_token(token); + } + '\n' => { + self.line += 1; + } + ' ' => {} + '\t' => {} + '\r' => {} _ => {} } } @@ -89,4 +120,29 @@ impl Scanner<'_> { fn is_at_end(&self) -> bool { self.current >= self.source.len() } + + /// returns the character not yet advanced to. + /// the integer ahead parameter can be used to look farther ahead. + /// peek(0) is the first etc. + fn peek(&self, ahead: usize) -> char { + if self.is_at_end() { + '\0' + } else { + self.source[self.current + ahead..self.current + ahead + 1].chars().next().unwrap() + } + } + + /// Advances only if the next character matches the given expected character and returns true, + /// or only returns false if there is no match. + fn match_char(&mut self, expected: char) -> bool { + if self.is_at_end() { + return false; + } + if self.source[self.current..self.current + 1].chars().next().unwrap() != expected { + return false; + } + + self.current += 1; + true + } } diff --git a/src/tokens.rs b/src/tokens.rs index 1b47446..1fe45ea 100644 --- a/src/tokens.rs +++ b/src/tokens.rs @@ -44,6 +44,17 @@ pub enum TokenType { PLUS, // + SEMICOLON, // ; STAR, // * + SLASH, // / + + // One or two character tokens. + BANG, // ! + BANGEQUAL, // != + EQUAL, // = + EQUALEQUAL, // == + GREATER, // > + GREATEREQUAL, // >= + LESS, // < + LESSEQUAL, // <= EOF // end of file } \ No newline at end of file