refactor(tazjin/rlox): Let scanner tokens own their lexeme
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
This commit is contained in:
parent
1d8e3f4f8b
commit
20a6cfeee2
5 changed files with 150 additions and 158 deletions
|
|
@ -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![],
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue