Minimal Imperative Parsing Library | https://docs.rs/mipl
at main 30 lines 711 B view raw
1use crate::prelude::*; 2 3/// Consume tokens into a new parser while the concrete 4/// parser returns something. Stop consuming if it returns 5/// `None`. 6pub struct CollectWhile<Op: ConcreteParser>(Op); 7impl<Op> ConcreteSubparser<Op> for CollectWhile<Op> 8where 9 Op: ConcreteParser 10{ 11 fn subparse 12 (value: <Op>::Input, parser: &mut Parser) -> Parser 13 where 14 Op: concrete_parser::ContainerCp 15 { 16 let op = Op::new(value); 17 18 let mut tokens = Tokens::new_empty(); 19 20 loop { 21 if let Some(token) = op.try_next_token(parser) { 22 tokens.add_token(token); 23 } else { 24 break; 25 } 26 } 27 28 Parser::new(tokens) 29 } 30}