diff --git a/src/main.rs b/src/main.rs index 3f2d7a8..3511b16 100644 --- a/src/main.rs +++ b/src/main.rs @@ -257,6 +257,7 @@ fn parse_expression<'a, 'b: 'a>(tokens: &'a mut TokenStream<'b>, highest_precede struct TokenStream<'a> { source: &'a str, cursor: usize, + last: Option, } impl<'a> TokenStream<'a> { @@ -264,6 +265,7 @@ impl<'a> TokenStream<'a> { return Self { source, cursor: 0, + last: None, }; } @@ -318,15 +320,22 @@ impl<'a> TokenStream<'a> { } pub fn next(&mut self) -> Option { - self.skip_whitespace(); - let token = self.parse_next()?; + let token = match self.last { + Some(_) => std::mem::take(&mut self.last).unwrap(), + None => { + self.skip_whitespace(); + self.parse_next()? + }, + }; + self.cursor += token.len(); return Some(token); } pub fn peek(&mut self) -> Option { self.skip_whitespace(); - return self.parse_next(); + self.last = Some(self.parse_next()?); + return self.last; } }