about summary refs log tree commit diff
path: root/users/tazjin/rlox/src/scanner.rs
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2021-01-14T15·36+0300
committertazjin <mail@tazj.in>2021-01-14T16·53+0000
commit20a6cfeee233bde9ba1f482fa4545f5e395d6235 (patch)
tree95c0f22e1fc187135fa66010e22e3ae13d2e5b3c /users/tazjin/rlox/src/scanner.rs
parent1d8e3f4f8b4479a47e744b3d153fe0e624958817 (diff)
refactor(tazjin/rlox): Let scanner tokens own their lexeme r/2107
This removes the runtime dependency on a borrow into the program
source code.

It's not yet ideal because there are a lot of tokens where we really
don't care about the lexeme, but this is what the book does and I
am not going to change that.

Change-Id: I888e18f98597766d6f725cbf9241e8eb2bd839e2
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2394
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
Diffstat (limited to 'users/tazjin/rlox/src/scanner.rs')
-rw-r--r--users/tazjin/rlox/src/scanner.rs10
1 files changed, 5 insertions, 5 deletions
diff --git a/users/tazjin/rlox/src/scanner.rs b/users/tazjin/rlox/src/scanner.rs
index fde43975316f..36c2d6a966ae 100644
--- a/users/tazjin/rlox/src/scanner.rs
+++ b/users/tazjin/rlox/src/scanner.rs
@@ -53,15 +53,15 @@ pub enum TokenKind {
 }
 
 #[derive(Clone, Debug)]
-pub struct Token<'a> {
+pub struct Token {
     pub kind: TokenKind,
-    pub lexeme: &'a [char],
+    pub lexeme: String,
     pub line: usize,
 }
 
 struct Scanner<'a> {
     source: &'a [char],
-    tokens: Vec<Token<'a>>,
+    tokens: Vec<Token>,
     errors: Vec<Error>,
     start: usize,   // offset of first character in current lexeme
     current: usize, // current offset into source
@@ -82,7 +82,7 @@ impl<'a> Scanner<'a> {
         let lexeme = &self.source[self.start..self.current];
         self.tokens.push(Token {
             kind,
-            lexeme,
+            lexeme: lexeme.into_iter().collect(),
             line: self.line,
         })
     }
@@ -263,7 +263,7 @@ impl<'a> Scanner<'a> {
     }
 }
 
-pub fn scan<'a>(input: &'a [char]) -> Result<Vec<Token<'a>>, Vec<Error>> {
+pub fn scan<'a>(input: &'a [char]) -> Result<Vec<Token>, Vec<Error>> {
     let mut scanner = Scanner {
         source: &input,
         tokens: vec![],