impral/lexer/
groupenizer.rs1use super::*;
3
4pub fn groupenize(tokens: &mut PeekableTokenStream<impl TokenStream>, delimiter: Option<Symbol>) -> PeekableTokenStream<impl TokenStream + '_> {
6 std::iter::from_fn(move || {
7 match tokens.next() {
8 Some(Token {
9 content: TokenContent::Symbol(
10 symbol @ (
11 Symbol::ParenLeft |
12 Symbol::CurlyLeft |
13 Symbol::BraketLeft
14 )
15 ),
16 start,
17 end
18 }) => {
19 let group: Vec<Token> = groupenize(tokens, symbol.get_delimiter()).collect();
20 let end = group.last().map(|t| t.end).unwrap_or_else(|| end+1);
21 let group = TokenContent::Group(symbol, group);
22 Some(Token {
24 content: group,
25 start,
26 end
27 })
28 },
29 Some(Token {
30 content: TokenContent::Symbol(
31 symbol
32 ),
33 ..
34 }) if delimiter.map(|d| d == symbol).unwrap_or(false) => {
35 None },
37 Some(token) => Some(token),
38
39 None => None, }
42 }).peekmore()
43}