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}