Improve lexer
This commit is contained in:
parent
c3c376c1c4
commit
16ad2c2d3a
61
src/lexer.rs
61
src/lexer.rs
|
@ -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()))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue