From 177de61f431a7ae385c0859c52cb48c7594d2bde Mon Sep 17 00:00:00 2001 From: caelansar <819711623@qq.com> Date: Sat, 23 Dec 2023 19:16:59 +0800 Subject: [PATCH] feat(lexer): extract Iter type --- src/lexer/mod.rs | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/lexer/mod.rs b/src/lexer/mod.rs index c4175b1..1d081de 100644 --- a/src/lexer/mod.rs +++ b/src/lexer/mod.rs @@ -7,7 +7,6 @@ pub struct Lexer<'a> { pos: usize, next_pos: usize, ch: Option, - end: bool, } impl<'a> Lexer<'a> { @@ -244,23 +243,37 @@ impl<'a> Lexer<'a> { } } } else { - self.end = true; Token::Eof }; self.read_char(); tok } + + pub fn iter<'b>(&'b mut self) -> Iter<'a, 'b> { + Iter { + inner: self, + end: false, + } + } } -impl<'a> Iterator for Lexer<'a> { +pub struct Iter<'a, 'b> { + inner: &'b mut Lexer<'a>, + end: bool, +} + +impl<'a, 'b> Iterator for Iter<'a, 'b> { type Item = Token; fn next(&mut self) -> Option { if self.end { - None - } else { - Some(self.next_token()) + return None; } + let token = self.inner.next_token(); + if let Token::Eof = token { + self.end = true + } + Some(token) } } @@ -389,7 +402,7 @@ mod test { #[test] fn test_lexer_iter() { let input = "let aa = 10;"; - let lexer = Lexer::new(input); + let mut lexer = Lexer::new(input); let expect = vec![ Token::Let, @@ -399,7 +412,7 @@ mod test { Token::SemiColon, Token::Eof, ]; - let res: Vec = lexer.into_iter().collect(); + let res: Vec = lexer.iter().collect(); assert_eq!(expect, res); }