2021-12-20 14:34:21 +01:00
|
|
|
use super::preprocessor::preprocess;
|
|
|
|
use super::token::Token;
|
2021-12-19 21:38:21 +01:00
|
|
|
|
2021-12-20 14:34:21 +01:00
|
|
|
pub struct Lexer {
|
2021-12-19 21:38:21 +01:00
|
|
|
code: String,
|
|
|
|
pos: usize,
|
|
|
|
current: Option<char>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Lexer {
|
|
|
|
pub fn new(code: String) -> Lexer {
|
|
|
|
Lexer {
|
2021-12-20 14:34:21 +01:00
|
|
|
code: code.clone(),
|
|
|
|
pos: 0,
|
|
|
|
current: code.chars().nth(0),
|
2021-12-19 21:38:21 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn next(&mut self) {
|
|
|
|
self.pos += 1;
|
|
|
|
self.current = if self.pos < self.code.len() {
|
|
|
|
self.code.chars().nth(self.pos)
|
|
|
|
} else {
|
|
|
|
None
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn tokenize(&mut self) {
|
|
|
|
let mut tokens: Vec<Token> = vec![];
|
2021-12-20 14:34:21 +01:00
|
|
|
self.code = preprocess(self.code.clone());
|
2021-12-19 21:38:21 +01:00
|
|
|
|
|
|
|
loop {
|
2021-12-20 14:34:21 +01:00
|
|
|
let token: Option<Token> = match self.current {
|
|
|
|
Some('+') => Some(Token::ADD),
|
|
|
|
Some('-') => Some(Token::SUBTRACT),
|
|
|
|
Some('*') => Some(Token::MULTIPLY),
|
|
|
|
Some('/') => Some(Token::DIVIDE),
|
|
|
|
Some('(') => Some(Token::LBRACK),
|
|
|
|
Some(')') => Some(Token::RBRACK),
|
|
|
|
Some(' ') => None,
|
|
|
|
Some('\n') => None,
|
2021-12-19 21:38:21 +01:00
|
|
|
None => break,
|
2021-12-20 14:34:21 +01:00
|
|
|
Some(_) => None,
|
|
|
|
};
|
|
|
|
|
|
|
|
match token {
|
|
|
|
Some(token) => {
|
|
|
|
tokens.push(token);
|
|
|
|
self.next();
|
|
|
|
},
|
|
|
|
None => self.next(),
|
|
|
|
}
|
2021-12-19 21:38:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
println!("{:?}", tokens);
|
|
|
|
}
|
|
|
|
}
|