Skip to content

Commit fec22ae

Browse files
committed
extend token::kind
1 parent eda3c78 commit fec22ae

3 files changed

Lines changed: 69 additions & 7 deletions

File tree

src/lexericals/lexer.rs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,14 @@ impl Lexer {
3535
//"=+(){},;";
3636
self.skip_whitespace(); // Skip whitespace characters
3737
let token = match self.ch {
38-
'=' => Token::new(Tokenkind::Assign, self.ch.to_string()),
38+
'=' => {
39+
self.read_token(); // Read the next character to check for '=='
40+
if self.ch == '=' {
41+
Token::new(Tokenkind::Eq, "==".to_string())
42+
}else {
43+
Token::new(Tokenkind::Assign, "=".to_string())
44+
}
45+
},
3946
'+' => Token::new(Tokenkind::Plus, self.ch.to_string()),
4047
'-' => Token::new(Tokenkind::Minus, self.ch.to_string()),
4148
',' => Token::new(Tokenkind::Comma, self.ch.to_string()),
@@ -44,6 +51,27 @@ impl Lexer {
4451
'}' => Token::new(Tokenkind::Rbrace, self.ch.to_string()),
4552
'{' => Token::new(Tokenkind::Lbrace, self.ch.to_string()),
4653
';' => Token::new(Tokenkind::Semicolon, self.ch.to_string()),
54+
'!' => {
55+
self.read_token(); // Read the next character to check for '!='
56+
if self.ch == '=' {
57+
Token::new(Tokenkind::NotEq, "!=".to_string())
58+
} else {
59+
Token::new(Tokenkind::Bang, "!".to_string())
60+
}
61+
}
62+
'*' => Token::new(Tokenkind::Asterisk, self.ch.to_string()),
63+
'/' => Token::new(Tokenkind::Slash, self.ch.to_string()),
64+
'%' => Token::new(Tokenkind::Pencentage, self.ch.to_string()),
65+
'<' => Token::new(Tokenkind::Lthan, self.ch.to_string()),
66+
'>' => Token::new(Tokenkind::Gthan, self.ch.to_string()),
67+
'&' => {
68+
self.read_token(); // Read the next character to check for '&&'
69+
if self.ch == '&' {
70+
Token::new(Tokenkind::And, "&&".to_string())
71+
} else {
72+
Token::new(Tokenkind::Illegal, "&".to_string())
73+
}
74+
}
4775
'\0' => Token::new(Tokenkind::Eof, String::new()), // End of file token
4876

4977
_ => {
@@ -124,6 +152,7 @@ mod test {
124152
x + y;
125153
};
126154
let result = add(five, ten);
155+
==
127156
"#;
128157

129158
let expect_token = vec![
@@ -168,6 +197,7 @@ mod test {
168197
Token::new(Tokenkind::Ident, String::from("ten")),
169198
Token::new(Tokenkind::Rparen, String::from(")")),
170199
Token::new(Tokenkind::Semicolon, String::from(";")),
200+
Token::new(Tokenkind::Eq, String::from("==")),
171201
Token::new(Tokenkind::Eof, String::new()),
172202
];
173203
let mut lexer = Lexer::new(input);

src/lexericals/tokenizer.rs

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,28 +16,42 @@ impl Token {
1616
#[allow(dead_code, unused_variables)]
1717
#[derive(Debug, PartialEq)]
1818
pub enum Tokenkind {
19+
// Illegal and End of File and identifiers
1920
Illegal,
2021
Eof,
2122
Ident,
23+
24+
25+
// Types
2226
Int,
2327
Float,
2428
String,
25-
Assign,
29+
Char,
30+
31+
// mathematical Operators
2632
Plus,
2733
Minus,
28-
Bang,
2934
Asterisk,
3035
Slash,
36+
Pencentage,
37+
38+
// special Characters
3139
Comma,
3240
Semicolon,
3341
Lparen,
3442
Rparen,
3543
Lbrace,
3644
Rbrace,
45+
Assign,
46+
47+
// comparison Operators
3748
Eq,
3849
NotEq,
3950
Lthan,
4051
Gthan,
52+
OR,
53+
And,
54+
Bang,
4155

4256
// Keywords
4357
Function,
@@ -50,29 +64,45 @@ pub enum Tokenkind {
5064
impl Display for Tokenkind {
5165
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5266
match self {
67+
// Illegal and End of File and identifiers
5368
Tokenkind::Illegal => write!(f, "Illegal"),
5469
Tokenkind::Eof => write!(f, "Eof"),
5570
Tokenkind::Ident => write!(f, "Ident"),
71+
72+
73+
// Types
5674
Tokenkind::Int => write!(f, "Int"),
5775
Tokenkind::Float => write!(f, "Float"),
5876
Tokenkind::String => write!(f, "String"),
59-
Tokenkind::Assign => write!(f, "Assign"),
77+
Tokenkind::Char => write!(f, "Char"),
78+
79+
80+
81+
// mathematical Operators
6082
Tokenkind::Plus => write!(f, "Plus"),
6183
Tokenkind::Minus => write!(f, "Minus"),
62-
Tokenkind::Bang => write!(f, "Bang"),
6384
Tokenkind::Asterisk => write!(f, "Asterisk"),
6485
Tokenkind::Slash => write!(f, "Slash"),
86+
Tokenkind::Pencentage => write!(f, "Percentage"),
87+
88+
// special Characters
6589
Tokenkind::Comma => write!(f, "Comma"),
6690
Tokenkind::Semicolon => write!(f, "Semicolon"),
6791
Tokenkind::Lparen => write!(f, "Lparen"),
6892
Tokenkind::Rparen => write!(f, "Rparen"),
6993
Tokenkind::Lbrace => write!(f, "Lbrace"),
7094
Tokenkind::Rbrace => write!(f, "Rbrace"),
95+
Tokenkind::Assign => write!(f, "Assign"),
96+
97+
// equality Operators
7198
Tokenkind::Eq => write!(f, "Eq"),
7299
Tokenkind::NotEq => write!(f, "NotEq"),
73100
Tokenkind::Lthan => write!(f, "Lthan"),
74101
Tokenkind::Gthan => write!(f, "Gthan"),
75-
102+
Tokenkind::OR => write!(f, "OR"),
103+
Tokenkind::And => write!(f, "And"),
104+
Tokenkind::Bang => write!(f, "Bang"),
105+
76106
// Keywords
77107
Tokenkind::Function => write!(f, "Function"),
78108
Tokenkind::Let => write!(f, "Let"),
@@ -85,7 +115,7 @@ impl Display for Tokenkind {
85115

86116
impl Tokenkind {
87117
pub fn lookup_ident(ident: &str) -> Self {
88-
match ident as &str {
118+
match ident{
89119
"fn" => Self::Function,
90120
"let" => Self::Let,
91121
"if" => Self::If,

src/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ fn main() {
1818
x + y;
1919
};
2020
let result = add(five, ten);
21+
==
2122
"#;
2223

2324
let mut lexer = Lexer::new(input);
@@ -109,6 +110,7 @@ fn read() -> Vec<Token> {
109110
Token::new(Tokenkind::Ident, String::from("ten")),
110111
Token::new(Tokenkind::Rparen, String::from(")")),
111112
Token::new(Tokenkind::Semicolon, String::from(";")),
113+
Token::new(Tokenkind::Eq, String::from("==")),
112114
Token::new(Tokenkind::Eof, String::new()),
113115
];
114116
expected_token

0 commit comments

Comments
 (0)