From 67ea72a99066959c14679047411dd0c19bd6f1ed Mon Sep 17 00:00:00 2001 From: Myrddin Dundragon Date: Mon, 5 May 2025 18:22:28 -0400 Subject: [PATCH] Added the needed pop functionality to TokenStream. --- src/token.rs | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/token.rs b/src/token.rs index ec45304..a90cfb4 100644 --- a/src/token.rs +++ b/src/token.rs @@ -238,6 +238,20 @@ impl TokenStream self.locations.push(span); } + /// Removes and returns the last token from the stream, if any. + /// + /// # Returns + /// `Some((lexeme, variant, span))` if there was a token to pop, + /// or `None` if the stream was empty. + pub fn pop(&mut self) -> Option<(String, T, Span)> + { + let lexeme = self.lexemes.pop()?; + let variant = self.variants.pop()?; + let span = self.locations.pop()?; + + Some((lexeme, variant, span)) + } + /// Returns a mutable iterator over the tokens in the stream. /// /// # Returns @@ -262,13 +276,31 @@ impl<'a, T> IntoIterator for &'a TokenStream } } +impl<'a, T> TokenStreamIter<'a, T> +{ + pub fn peek(&self, n: usize) -> Option> + { + let i = self.index + n; + if i < self.stream.len() + { + Some(Token { lexeme: &self.stream.lexemes[i], + variant: &self.stream.variants[i], + span: &self.stream.locations[i] }) + } + else + { + None + } + } +} + impl<'a, T> Iterator for TokenStreamIter<'a, T> { type Item = Token<'a, T>; fn next(&mut self) -> Option { - if self.index < self.stream.lexemes.len() + if self.index < self.stream.len() { let i = self.index; self.index += 1;