devalang_core/core/lexer/handler/
operator.rs1use crate::core::lexer::token::{Token, TokenKind};
2
3pub fn handle_operator_lexer(
4 ch: char,
5 chars: &mut std::iter::Peekable<std::str::Chars>,
6 current_indent: &mut usize,
7 _indent_stack: &mut [usize],
8 tokens: &mut Vec<Token>,
9 line: &mut usize,
10 column: &mut usize,
11) {
12 let next = chars.peek().copied();
13
14 let (kind, len) = match (ch, next) {
15 ('=', Some('=')) => (TokenKind::DoubleEquals, 2),
16 ('!', Some('=')) => (TokenKind::NotEquals, 2),
17 ('>', Some('=')) => (TokenKind::GreaterEqual, 2),
18 ('<', Some('=')) => (TokenKind::LessEqual, 2),
19 ('+', _) => (TokenKind::Plus, 1),
20 ('*', _) => (TokenKind::Asterisk, 1),
21 ('=', _) => (TokenKind::Equals, 1),
22 ('>', _) => (TokenKind::Greater, 1),
23 ('<', _) => (TokenKind::Less, 1),
24 _ => {
25 return;
26 }
27 };
28
29 if len == 2 {
30 chars.next(); }
32
33 tokens.push(Token {
34 kind,
35 lexeme: if len == 2 {
36 format!("{}{}", ch, next.unwrap())
37 } else {
38 ch.to_string()
39 },
40 line: *line,
41 column: *column,
42 indent: *current_indent,
43 });
44
45 *column += len;
46}