Minimal Imperative Parsing Library | https://docs.rs/mipl
at main 36 lines 917 B view raw
1use crate::prelude::*; 2 3/// Consume tokens into a new parser until the concrete 4/// parser returns something. Stops when it hits `Some(_)`. 5/// 6/// Said concrete pattern here is provided by 7/// the generic parameter `Op`. 8pub struct CollectUntil<Op: ConcreteParser>(Op); 9impl<Op> ConcreteSubparser<Op> for CollectUntil<Op> 10where 11 Op: ConcreteParser 12{ 13 fn subparse 14 (value: Op::Input, parser: &mut Parser) -> Parser 15 where 16 Op: concrete_parser::ContainerCp 17 { 18 let op = Op::new(value); 19 20 let mut tokens: Tokens = Tokens::new_empty(); 21 22 loop { 23 if let Some(_token) = op.peek_for_token(parser) { 24 break; 25 } else { 26 if let Some(token) = parser.next() { 27 tokens.add_token(token); 28 } else { 29 break; 30 } 31 } 32 } 33 34 Parser::new(tokens) 35 } 36}