pipeline_script/lexer/
iter.rs1use crate::lexer::position::Position;
2use crate::lexer::token::Token;
3use crate::lexer::Lexer;
4
5pub struct TokenStream {
6 tokenizer: Lexer,
7 peek: Vec<(Token, Position)>,
8}
9
10impl Iterator for TokenStream {
11 type Item = (Token, Position);
12
13 fn next(&mut self) -> Option<Self::Item> {
14 match self.next_token() {
15 (Token::Eof, _) => None,
16 t => Some(t),
17 }
18 }
19}
20
21impl TokenStream {
22 pub fn new(lexer: Lexer) -> Self {
23 Self {
24 tokenizer: lexer,
25 peek: Vec::new(),
26 }
27 }
28 pub fn is_eof(&self) -> bool {
29 self.peek.is_empty() && self.tokenizer.is_eof()
30 }
31 pub fn set_lexer(&mut self, lexer: Lexer) {
32 self.tokenizer = lexer;
33 }
34 pub fn next_token(&mut self) -> (Token, Position) {
35 if !self.peek.is_empty() {
36 return self.peek.remove(0);
37 }
38 self.tokenizer
39 .next_token()
40 .unwrap_or((Token::Eof, Position::none()))
41 }
42 pub fn peek(&mut self) -> (Token, Position) {
43 self.peek_nth(0)
44 }
45 pub fn peek_nth(&mut self, n: usize) -> (Token, Position) {
46 while self.peek.len() <= n {
48 match self.tokenizer.next_token() {
49 Some(token) => self.peek.push(token),
50 None => self.peek.push((Token::Eof, Position::none())),
51 }
52 }
53
54 self.peek[n].clone()
56 }
57
58 pub fn peek_n(&mut self, n: usize) -> Vec<(Token, Position)> {
60 while self.peek.len() < n {
62 match self.tokenizer.next_token() {
63 Some(token) => self.peek.push(token),
64 None => self.peek.push((Token::Eof, Position::none())),
65 }
66 }
67
68 self.peek.iter().take(n).cloned().collect()
70 }
71}