From 5fc4d355a8aab8d6ad1adbef667ae8f84e402784 Mon Sep 17 00:00:00 2001 From: YannAhlgrim Date: Tue, 12 May 2026 16:43:24 +0200 Subject: [PATCH] fix u8 error --- src/lexer/mod.rs | 20 +++++++++++++------- src/main.rs | 2 +- src/token/mod.rs | 4 ++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/lexer/mod.rs b/src/lexer/mod.rs index 347966a..8d321e0 100644 --- a/src/lexer/mod.rs +++ b/src/lexer/mod.rs @@ -3,12 +3,9 @@ use crate::token::lookup_ident; use super::token::ASSIGN; use super::token::COMMA; use super::token::EOF; -use super::token::FUNCTION; -use super::token::IDENT; use super::token::ILLEGAL; use super::token::INT; use super::token::LBRACE; -use super::token::LET; use super::token::LPAREN; use super::token::PLUS; use super::token::RBRACE; @@ -34,8 +31,8 @@ pub trait LexerTraits { pub fn new(input_str: String) -> Lexer { let mut l: Lexer = Lexer { input: input_str, - position: Some(0), - read_pos: Some(1), + position: Some(-1), + read_pos: Some(0), ch: Some(0), }; l.read_char(); @@ -68,6 +65,7 @@ impl LexerTraits for Lexer { let c = char::from(lit); match c { + '\0' => tok = new_token(EOF, lit), '=' => tok = new_token(ASSIGN, lit), ';' => tok = new_token(SEMICOLON, lit), '(' => tok = new_token(LPAREN, lit), @@ -80,10 +78,10 @@ impl LexerTraits for Lexer { if c.is_alphabetic() { let lit = self.read_identifier(); let tok_type = lookup_ident(&lit); - return new_token(tok_type, lit.as_bytes()[0]); + return new_token_from_str(tok_type, lit); } else if c.is_ascii_digit() { let lit = self.read_number(); - return new_token(INT, lit.as_bytes()[0]); + return new_token_from_str(INT, lit); } else { tok = new_token(ILLEGAL, lit); } @@ -135,3 +133,11 @@ fn new_token(token_type: &str, ch: u8) -> Token { literal: lit, } } + +fn new_token_from_str(token_type: &str, lit: String) -> Token { + let token_type = String::from(token_type); + Token { + type_: token_type, + literal: lit, + } +} diff --git a/src/main.rs b/src/main.rs index c3714cd..28d45ec 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,7 +14,7 @@ fn main() { let mut l = new(input.to_string()); - for (i, tok) in (0..36).map(|_| l.next_token()).enumerate() { + for (_i, tok) in (0..37).map(|_| l.next_token()).enumerate() { println!("{}: {:?}", tok.type_, tok.literal); } } diff --git a/src/token/mod.rs b/src/token/mod.rs index c4555d5..eae46e4 100644 --- a/src/token/mod.rs +++ b/src/token/mod.rs @@ -21,10 +21,10 @@ pub const RBRACE: &str = "}"; pub const FUNCTION: &str = "FUNCTION"; pub const LET: &str = "LET"; -pub fn lookup_ident(ident: &str) -> &str { +pub fn lookup_ident(ident: &str) -> &'static str { match ident { "fn" => FUNCTION, "let" => LET, - _ => ILLEGAL, + _ => IDENT, } }