Skip to content

Commit c6e5cdb

Browse files
committed
WIP on main: 3c57b73 add check for test case using strinf literal
2 parents 3c57b73 + c042e1a commit c6e5cdb

2 files changed

Lines changed: 61 additions & 8 deletions

File tree

src/lexericals/lexer.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ impl Lexer {
3333

3434
pub fn next_token(&mut self) -> Token {
3535
//"=+(){},;";
36+
self.skip_whitespace(); // Skip whitespace characters
3637
let token = match self.ch {
3738
'=' => Token::new(Tokenkind::Assign, self.ch.to_string()),
3839
'+' => Token::new(Tokenkind::Plus, self.ch.to_string()),
@@ -49,6 +50,11 @@ impl Lexer {
4950
let literal = self.read_identifier();
5051
let kind = Tokenkind::lookup_ident(&literal);
5152
Token::new(kind, literal)
53+
}else if Lexer::is_digit(self.ch) {
54+
let kind = Tokenkind::Int;
55+
let literal = self.read_number();
56+
Token::new(kind, literal)
57+
5258
} else {
5359
Token::new(Tokenkind::Illegal, self.ch.to_string())
5460
},
@@ -58,10 +64,30 @@ impl Lexer {
5864
self.read_token(); // Move to the next character
5965
token
6066
}
67+
68+
fn skip_whitespace(&mut self) {
69+
while self.ch.is_whitespace() {
70+
self.read_token();
71+
}
72+
}
73+
74+
fn is_digit(ch: char) -> bool {
75+
ch.is_numeric()
76+
}
77+
6178
fn is_letter(ch: char) -> bool {
6279
ch.is_alphabetic() || ch == '_'
6380
}
6481

82+
fn read_number(&mut self) -> String {
83+
let mut literal = String::new();
84+
while Lexer::is_digit(self.ch) {
85+
literal.push(self.ch);
86+
self.read_token();
87+
}
88+
literal
89+
}
90+
6591
fn read_identifier(&mut self) -> String {
6692
let mut literal = String::new();
6793
while Lexer::is_letter(self.ch){
@@ -79,7 +105,8 @@ mod test {
79105
use super::*;
80106
#[test]
81107
fn read_token() {
82-
let input =r#"let five = 5;
108+
let input =r#"
109+
let five = 5;
83110
let ten = 10;
84111
let add = fn(x, y) {
85112
x + y;

src/main.rs

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
mod lexericals;
2-
use crate::lexericals::tokenizer::{Token, Tokenkind};
32
use crate::lexericals::lexer::Lexer;
43

54

@@ -11,17 +10,44 @@ fn main() {
1110
// println!("Token kind: {:?}, literal: {}", token.kind, token.literal);
1211
// println!("Token {:?}", token);
1312

14-
let input = "+=(){};";
13+
let input =r#"
14+
let five = 5;
15+
let ten = 10;
16+
let add = fn(x, y) {
17+
x + y;
18+
};
19+
let result = add(five, ten);
20+
"#;
21+
1522
let mut lexer = Lexer::new(input);
1623
println!("Lexer initialized with input: {}", input);
17-
// println!("Current character: {:?}", lexer);
18-
19-
for (idx,token) in lexer.input.clone().into_iter().enumerate() {
20-
println!("Token at index {}: {}", idx, token);
21-
println!("Current character: {:?}", lexer.next_token());
24+
let mut tokens = Vec::new();
25+
let mut token = lexer.next_token();
26+
while token.kind != lexericals::tokenizer::Tokenkind::Eof {
27+
tokens.push(token.literal);
28+
token = lexer.next_token();
2229
}
2330

31+
// loop {
32+
// let token = lexer.next_token();
33+
// if token.kind == lexericals::tokenizer::Tokenkind::Eof {
34+
// break;
35+
// }
36+
// tokens.push(token.literal);
37+
// }
38+
println!("Tokens: {:?}", tokens);
39+
40+
// for (idx,token) in lexer.input.clone().into_iter().enumerate() {
41+
// println!("charater at index:{} token:{}", idx, token);
42+
// let token = lexer.next_token();
43+
// println!("Tokenkind at index:{} is:{}", idx, token.kind);
44+
// println!("literal at index:{} is:{} ", idx, token.literal);
45+
// }
46+
2447
// println!(" last Current character: {:?}", lexer.next_token());
2548

2649
}
2750

51+
fn read_string(ch:char) -> String {
52+
todo!("Implement string reading logic");
53+
}

0 commit comments

Comments
 (0)