Improve lexer

This commit is contained in:
Alex Kotov 2023-04-02 14:43:52 +04:00
parent c3c376c1c4
commit 16ad2c2d3a
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
1 changed files with 26 additions and 35 deletions

View File

@ -32,44 +32,35 @@ impl Iterator for Lexer<'_> {
type Item = Result;
fn next(&mut self) -> Option<Self::Item> {
let mut option: Option<Token> = None;
while option.is_none() {
match &self.cur {
None => match self.tokenizer.iter(None) {
None => return None,
Some(value) => {
option = Some(Token {
value,
pos: self.pos,
});
}
},
Some(result) => match result {
Err(_) => {
return Some(Err(Error::Input(
self.cur.take().unwrap().unwrap_err(),
)));
}
Ok(chr) => {
let chr = *chr;
self.cur = self.input.next();
match self.tokenizer.iter(Some(chr.value)) {
None => {}
Some(value) => {
option = Some(Token {
value,
pos: self.pos,
});
self.pos = chr.pos;
}
match &self.cur {
None => match self.tokenizer.iter(None) {
None => None,
Some(value) => Some(Ok(Token {
value,
pos: self.pos,
})),
},
Some(result) => match result {
Err(_) => Some(Err(Error::Input(
self.cur.take().unwrap().unwrap_err(),
))),
Ok(chr) => {
let chr = *chr;
self.cur = self.input.next();
match self.tokenizer.iter(Some(chr.value)) {
None => self.next(),
Some(value) => {
let token = Token {
value,
pos: self.pos,
};
self.pos = chr.pos;
Some(Ok(token))
}
}
},
}
}
},
}
Some(Ok(option.unwrap()))
}
}