@@ -59,11 +59,34 @@ impl Lexer {
5959 Token :: new ( Tokenkind :: Bang , "!" . to_string ( ) )
6060 }
6161 }
62+ '|' => {
63+ self . read_token ( ) ; // Read the next character to check for '||'
64+ if self . ch == '|' {
65+ Token :: new ( Tokenkind :: OR , "||" . to_string ( ) )
66+ } else {
67+ Token :: new ( Tokenkind :: Illegal , "|" . to_string ( ) )
68+ }
69+ } ,
6270 '*' => Token :: new ( Tokenkind :: Asterisk , self . ch . to_string ( ) ) ,
6371 '/' => Token :: new ( Tokenkind :: Slash , self . ch . to_string ( ) ) ,
6472 '%' => 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 ( ) ) ,
73+ '<' => {
74+ self . read_token ( ) ; // Read the next character to check for '<='
75+ if self . ch == '=' {
76+ Token :: new ( Tokenkind :: Lthanoreq , "<=" . to_string ( ) )
77+ } else {
78+ Token :: new ( Tokenkind :: Lthan , "<" . to_string ( ) )
79+ }
80+
81+ } ,
82+ '>' =>{
83+ self . read_token ( ) ; // Read the next character to check for '>='
84+ if self . ch == '=' {
85+ Token :: new ( Tokenkind :: Gthanoreq , ">=" . to_string ( ) )
86+ } else {
87+ Token :: new ( Tokenkind :: Gthan , ">" . to_string ( ) )
88+ }
89+ } ,
6790 '&' => {
6891 self . read_token ( ) ; // Read the next character to check for '&&'
6992 if self . ch == '&' {
@@ -215,4 +238,122 @@ mod test {
215238 ) ; // Move to the next character
216239 }
217240 }
241+ #[ test]
242+ fn test_skip_whitespace ( ) {
243+ let input = " let five = 5; \n let ten = 10;" ;
244+ let mut lexer = Lexer :: new ( input) ;
245+ let token1 = lexer. next_token ( ) ;
246+ assert_eq ! ( token1. kind, Tokenkind :: Let ) ;
247+ assert_eq ! ( token1. literal, "let" ) ;
248+ }
249+
250+ #[ test]
251+ fn test_read_number ( ) {
252+ let input = "12345 67890 12.34 56.78" ;
253+ let mut lexer = Lexer :: new ( input) ;
254+ let token1 = lexer. next_token ( ) ;
255+ assert_eq ! ( token1. kind, Tokenkind :: Int ) ;
256+ assert_eq ! ( token1. literal, "12345" ) ;
257+ }
258+ #[ test]
259+ fn test_read_float ( ) {
260+ let input = "0.34 56.78" ;
261+ let mut lexer = Lexer :: new ( input) ;
262+ let token1 = lexer. next_token ( ) ;
263+ assert_eq ! ( token1. kind, Tokenkind :: Float ) ;
264+ assert_eq ! ( token1. literal, "0.34" ) ;
265+
266+ let token2 = lexer. next_token ( ) ;
267+ assert_eq ! ( token2. kind, Tokenkind :: Float ) ;
268+ assert_eq ! ( token2. literal, "56.78" ) ;
269+ }
270+ #[ test]
271+ fn test_read_keywords ( ) {
272+ let input = "let fn if else return" ;
273+ let mut lexer = Lexer :: new ( input) ;
274+ let token1 = lexer. next_token ( ) ;
275+ assert_eq ! ( token1. kind, Tokenkind :: Let ) ;
276+ assert_eq ! ( token1. literal, "let" ) ;
277+
278+ let token2 = lexer. next_token ( ) ;
279+ assert_eq ! ( token2. kind, Tokenkind :: Function ) ;
280+ assert_eq ! ( token2. literal, "fn" ) ;
281+
282+ let token3 = lexer. next_token ( ) ;
283+ assert_eq ! ( token3. kind, Tokenkind :: If ) ;
284+ assert_eq ! ( token3. literal, "if" ) ;
285+
286+ let token4 = lexer. next_token ( ) ;
287+ assert_eq ! ( token4. kind, Tokenkind :: Else ) ;
288+ assert_eq ! ( token4. literal, "else" ) ;
289+
290+ let token5 = lexer. next_token ( ) ;
291+ assert_eq ! ( token5. kind, Tokenkind :: Return ) ;
292+ assert_eq ! ( token5. literal, "return" ) ;
293+
294+ }
295+ #[ test]
296+ fn test_read_identifiers ( ) {
297+ let input = "variable_name anotherVariable _privateVar" ;
298+ let mut lexer = Lexer :: new ( input) ;
299+ let token1 = lexer. next_token ( ) ;
300+ assert_eq ! ( token1. kind, Tokenkind :: Ident ) ;
301+ assert_eq ! ( token1. literal, "variable_name" ) ;
302+ let token2 = lexer. next_token ( ) ;
303+ assert_eq ! ( token2. kind, Tokenkind :: Ident ) ;
304+ assert_eq ! ( token2. literal, "anotherVariable" ) ;
305+ let token3 = lexer. next_token ( ) ;
306+ assert_eq ! ( token3. kind, Tokenkind :: Ident ) ;
307+ assert_eq ! ( token3. literal, "_privateVar" ) ;
308+ }
309+ #[ test]
310+ fn test_read_operators ( ) {
311+ let input = "+ - * / % < > && || ! = == != >= <= " ;
312+ let mut lexer = Lexer :: new ( input) ;
313+ let token1 = lexer. next_token ( ) ;
314+ assert_eq ! ( token1. kind, Tokenkind :: Plus ) ;
315+ assert_eq ! ( token1. literal, "+" ) ;
316+ let token2 = lexer. next_token ( ) ;
317+ assert_eq ! ( token2. kind, Tokenkind :: Minus ) ;
318+ assert_eq ! ( token2. literal, "-" ) ;
319+ let token3 = lexer. next_token ( ) ;
320+ assert_eq ! ( token3. kind, Tokenkind :: Asterisk ) ;
321+ assert_eq ! ( token3. literal, "*" ) ;
322+ let token4 = lexer. next_token ( ) ;
323+ assert_eq ! ( token4. kind, Tokenkind :: Slash ) ;
324+ assert_eq ! ( token4. literal, "/" ) ;
325+ let token5 = lexer. next_token ( ) ;
326+ assert_eq ! ( token5. kind, Tokenkind :: Pencentage ) ;
327+ assert_eq ! ( token5. literal, "%" ) ;
328+ let token6 = lexer. next_token ( ) ;
329+ assert_eq ! ( token6. kind, Tokenkind :: Lthan ) ;
330+ assert_eq ! ( token6. literal, "<" ) ;
331+ let token7 = lexer. next_token ( ) ;
332+ assert_eq ! ( token7. kind, Tokenkind :: Gthan ) ;
333+ assert_eq ! ( token7. literal, ">" ) ;
334+ let token8 = lexer. next_token ( ) ;
335+ assert_eq ! ( token8. kind, Tokenkind :: And ) ;
336+ assert_eq ! ( token8. literal, "&&" ) ;
337+ let token9 = lexer. next_token ( ) ;
338+ assert_eq ! ( token9. kind, Tokenkind :: OR ) ;
339+ assert_eq ! ( token9. literal, "||" ) ;
340+ let token10 = lexer. next_token ( ) ;
341+ assert_eq ! ( token10. kind, Tokenkind :: Bang ) ;
342+ assert_eq ! ( token10. literal, "!" ) ;
343+ let token11 = lexer. next_token ( ) ;
344+ assert_eq ! ( token11. kind, Tokenkind :: Assign ) ;
345+ assert_eq ! ( token11. literal, "=" ) ;
346+ let token12 = lexer. next_token ( ) ;
347+ assert_eq ! ( token12. kind, Tokenkind :: Eq ) ;
348+ assert_eq ! ( token12. literal, "==" ) ;
349+ let token13 = lexer. next_token ( ) ;
350+ assert_eq ! ( token13. kind, Tokenkind :: NotEq ) ;
351+ assert_eq ! ( token13. literal, "!=" ) ;
352+ let token14 = lexer. next_token ( ) ;
353+ assert_eq ! ( token14. kind, Tokenkind :: Gthanoreq ) ;
354+ assert_eq ! ( token14. literal, ">=" ) ;
355+ let token15 = lexer. next_token ( ) ;
356+ assert_eq ! ( token15. kind, Tokenkind :: Lthanoreq ) ;
357+ assert_eq ! ( token15. literal, "<=" ) ;
358+ }
218359}
0 commit comments