pseudo_interpreter/lexer/functions/
comparison.rs

1use super::super::Token;
2use crate::{constants::error_handler::PseudoError, lexer::lexer::Lexer};
3
4pub trait Comparison {
5    /// catch comparisons
6    /// catch =, ==, <, >, <=, >=, !=
7    /// catch &&, ||
8    /// catch !
9    fn encode_comparison(&mut self) -> Result<Token, PseudoError>;
10}
11
12impl <'a> Comparison for Lexer<'a> {
13    fn encode_comparison(&mut self) -> Result<Token, PseudoError> {
14        match self.current_char {
15            Some('<') => {
16                self.next_char();
17                if let Some('=') = self.current_char {
18                    self.next_char();
19                    Ok(Token::LessThanEqual)
20                } else {
21                    Ok(Token::LessThan)
22                }
23            }
24            Some('>') => {
25                self.next_char();
26                if let Some('=') = self.current_char {
27                    self.next_char();
28                    Ok(Token::GreaterThanEqual)
29                } else {
30                    Ok(Token::GreaterThan)
31                }
32            }
33            Some('!') => {
34                self.next_char();
35                if let Some('=') = self.current_char {
36                    self.next_char();
37                    Ok(Token::NotEqual)
38                } else {
39                    Ok(Token::Not)
40                }
41            }
42            Some('=') => {
43                self.next_char();
44                if let Some('=') = self.current_char {
45                    self.next_char();
46                    Ok(Token::Equal)
47                } else {
48                    Ok(Token::Assign)
49                }
50            }
51            Some('&') => {
52                self.next_char();
53                if let Some('&') = self.current_char {
54                    self.next_char();
55                    Ok(Token::And)
56                } else {
57                    return Err(PseudoError::InvalidToken("Invalid character: &".to_string()));
58                }
59            }
60            Some('|') => {
61                self.next_char();
62                if let Some('|') = self.current_char {
63                    self.next_char();
64                    Ok(Token::Or)
65                } else {
66                    return Err(PseudoError::InvalidToken("Invalid character: |".to_string()));
67                }
68            }
69            _ => return Err(PseudoError::InvalidToken("Invalid character:".to_string())),
70        }
71    }
72}