remove check_keyword
change ymmtvmwsonltkquyprslmovzsrtylppy
commit 5a60855c90d68f5426f3f8a066aa3c570fffe034
author Alpha Chen <alpha@kejadlen.dev>
date
parent lrllkqtu
diff --git a/rust/src/scanner.rs b/rust/src/scanner.rs
index 3a2d6aa..9ba9350 100644
--- a/rust/src/scanner.rs
+++ b/rust/src/scanner.rs
@@ -183,51 +183,35 @@ impl<'a> Scanner<'a> {
 
     fn identifier_type(&self) -> TokenKind {
         match self.source[0] as char {
-            'a' => self.check_keyword(1, "nd", TokenKind::And),
-            'c' => self.check_keyword(1, "lass", TokenKind::Class),
-            'e' => self.check_keyword(1, "lse", TokenKind::Else),
-            'i' => self.check_keyword(1, "f", TokenKind::If),
-            'n' => self.check_keyword(1, "il", TokenKind::Nil),
-            'o' => self.check_keyword(1, "r", TokenKind::Or),
-            'p' => self.check_keyword(1, "rint", TokenKind::Print),
-            'r' => self.check_keyword(1, "eturn", TokenKind::Return),
-            's' => self.check_keyword(1, "uper", TokenKind::Super),
-            'v' => self.check_keyword(1, "ar", TokenKind::Var),
-            'w' => self.check_keyword(1, "hile", TokenKind::While),
-            'f' => {
-                if self.current > 1 {
-                    match self.source[1] as char {
-                        'a' => self.check_keyword(2, "lse", TokenKind::False),
-                        'o' => self.check_keyword(2, "r", TokenKind::For),
-                        'u' => self.check_keyword(2, "n", TokenKind::Fun),
-                        _ => TokenKind::Identifier
-                    }
-                } else {
-                    TokenKind::Identifier
+            'a' if &self.source[1..self.current] == "nd".as_bytes() => TokenKind::And,
+            'c' if &self.source[1..self.current] == "lass".as_bytes() => TokenKind::Class,
+            'e' if &self.source[1..self.current] == "lse".as_bytes() => TokenKind::Else,
+            'i' if &self.source[1..self.current] == "f".as_bytes() => TokenKind::If,
+            'n' if &self.source[1..self.current] == "il".as_bytes() => TokenKind::Nil,
+            'o' if &self.source[1..self.current] == "r".as_bytes() => TokenKind::Or,
+            'p' if &self.source[1..self.current] == "rint".as_bytes() => TokenKind::Print,
+            'r' if &self.source[1..self.current] == "eturn".as_bytes() => TokenKind::Return,
+            's' if &self.source[1..self.current] == "uper".as_bytes() => TokenKind::Super,
+            'v' if &self.source[1..self.current] == "ar".as_bytes() => TokenKind::Var,
+            'w' if &self.source[1..self.current] == "hile".as_bytes() => TokenKind::While,
+            'f' if self.current > 1 => {
+                match self.source[1] as char {
+                    'a' if &self.source[2..self.current] == "lse".as_bytes() => TokenKind::False,
+                    'o' if &self.source[2..self.current] == "r".as_bytes() => TokenKind::For,
+                    'u' if &self.source[2..self.current] == "n".as_bytes() => TokenKind::Fun,
+                    _ => TokenKind::Identifier,
                 }
-            }
-            't' => {
-                if self.current > 1 {
-                    match self.source[1] as char {
-                        'h' => self.check_keyword(2, "is", TokenKind::This),
-                        'r' => self.check_keyword(2, "ue", TokenKind::True),
-                        _ => TokenKind::Identifier
-                    }
-                } else {
-                    TokenKind::Identifier
+            },
+            't' if self.current > 1 => {
+                match self.source[1] as char {
+                    'h' if &self.source[2..self.current] == "is".as_bytes() => TokenKind::This,
+                    'r' if &self.source[2..self.current] == "ue".as_bytes() => TokenKind::True,
+                    _ => TokenKind::Identifier,
                 }
             }
             _ => TokenKind::Identifier,
         }
     }
-
-    fn check_keyword(&self, start: usize, rest: &str, kind: TokenKind) -> TokenKind {
-        if &self.source[start..self.current] == rest.as_bytes() {
-            kind
-        } else {
-            TokenKind::Identifier
-        }
-    }
 }
 
 fn is_alpha(c: char) -> bool {
@@ -311,8 +295,12 @@ mod tests {
         assert_scan_token("1a", TokenKind::Number);
         assert_scan_token("1.1", TokenKind::Number);
 
+        assert_scan_token("a", TokenKind::Identifier);
+        assert_scan_token("an", TokenKind::Identifier);
         assert_scan_token("and", TokenKind::And);
         assert_scan_token("andy", TokenKind::Identifier);
+        assert_scan_token("false", TokenKind::False);
+        assert_scan_token("fa", TokenKind::Identifier);
 
         assert_scan_token("@", TokenKind::Error);
         assert_scan_token("", TokenKind::Eof);