lexer_rs/lexer/
parser_iter.rs

1//a Imports
2use crate::BoxDynLexerParseFn;
3use crate::Lexer;
4
5//a ParserIterator
6//tp ParserIterator
7/// An iterator over a Lexer presenting the parsed Tokens from it
8
9pub struct ParserIterator<'a, L>
10where
11    L: Lexer,
12{
13    lexer: &'a L,
14    state: L::State,
15    parsers: &'a [BoxDynLexerParseFn<'a, L>],
16}
17
18//ip ParserIterator
19impl<'a, L> ParserIterator<'a, L>
20where
21    L: Lexer,
22    // F : std::ops::Deref<Target = dyn Fn(&'a L, <L as Lexer>::State, char) -> LexerParseResult<<L as Lexer>::State, <L as Lexer>::Token, <L as Lexer>::Error> + 'a>,
23{
24    /// Create a new token stream iterator to parse a string and deliver tokens
25    pub fn new(lexer: &'a L, state: L::State, parsers: &'a [BoxDynLexerParseFn<'a, L>]) -> Self {
26        Self {
27            lexer,
28            state,
29            parsers,
30        }
31    }
32}
33
34//ip Iterator for ParserIterator
35impl<'a, L> Iterator for ParserIterator<'a, L>
36where
37    L: Lexer,
38    //    F : std::ops::Deref<Target = dyn Fn(&'a L, <L as Lexer>::State, char) -> LexerParseResult<<L as Lexer>::State, <L as Lexer>::Token, <L as Lexer>::Error> + 'a>,
39{
40    type Item = Result<L::Token, L::Error>;
41    fn next(&mut self) -> Option<Self::Item> {
42        match self.lexer.parse(self.state, self.parsers) {
43            Err(e) => Some(Err(e)),
44            Ok(Some((state, token))) => {
45                self.state = state;
46                Some(Ok(token))
47            }
48            _ => None,
49        }
50    }
51}