I’m trying to build a parser for a project and I’m getting the following error:
error[E0502]: cannot borrow `*self` as mutable because it is also borrowed as immutable
--> src\compiler\lexer.rs:31:34
|
29 | let mut iter = self.file.chars();
| ----------------- immutable borrow occurs here
30 |
31 | while let Some(lexeme) = self.get_lexeme(&mut iter) {
| ^^^^^^^^^^^^^^^^---------^
| | |
| | immutable borrow later used here
| mutable borrow occurs here
My struct looks like this:
pub enum LexemeKind {
// just some kinds of lexemes, like number or operator
}
pub struct Lexeme {
pub content: String,
pub kind: LexemeKind,
}
pub struct Lexer {
pub file: String,
pub lexemes: Vec<Lexeme>,
}
impl Lexer {
pub fn new(file_path: &String) -> Self {
// just gets file contents and creates empty Vec
}
pub fn process(&mut self) { // called in main.rs after Lexer::new()
let mut iter = self.file.chars(); // error occurs here
while let Some(lexeme) = self.get_lexeme(&mut iter) { // and here
self.lexemes.push(lexeme);
}
}
fn get_lexeme(&mut self, iter: &mut Chars) -> Option<Lexeme> {
if self.file.len() == 0 {
return None;
}
let kind = get_kind(iter.peek().unwrap());
// checks the kind of the first character
let content: String = match kind {
// pattern matching, assigns function to get token based on kind
// iter is also used as a parameter for these functions
};
Some(Lexeme {
content,
kind,
})
}
// functions to get entire token of characters with similair type
// such as: pub fn get_string(&mut self, iter: &mut Chars) -> String
// they also call file.split_off(index) and the result is returned
}
fn get_kind(c: char) -> LexemeKind {
// gets the lexeme kind by checking for opertor, number, brackets, etc.
}
I’m relatively new to Rust and I’m having trouble resolving the error. Any help would be appreciated.