Compare commits

...

2 Commits

Author SHA1 Message Date
Greg Shuflin
bffaca4d68 combinators 2024-01-26 00:23:21 -08:00
Greg Shuflin
97d35df687 repeated combinator 2024-01-26 00:20:57 -08:00
2 changed files with 27 additions and 0 deletions

18
src/combinators.rs Normal file
View File

@ -0,0 +1,18 @@
use crate::Parser;
pub fn repeated<P, I, O, E>(parser: P) -> impl Parser<I, Vec<O>, E>
where
P: Parser<I, O, E>,
I: Copy,
{
move |input: I| {
let mut acc = input;
let mut results = vec![];
while let Ok((item, rest)) = parser.parse(acc) {
results.push(item);
acc = rest;
}
Ok((results, acc))
}
}

View File

@ -1,10 +1,12 @@
#![allow(dead_code)] //TODO eventually turn this off #![allow(dead_code)] //TODO eventually turn this off
mod choice; mod choice;
mod combinators;
mod map; mod map;
mod primitives; mod primitives;
mod sequence; mod sequence;
pub use choice::*; pub use choice::*;
pub use combinators::*;
pub use map::*; pub use map::*;
pub use primitives::*; pub use primitives::*;
pub use sequence::*; pub use sequence::*;
@ -65,4 +67,11 @@ mod tests {
let output = parser.parse("abcd").unwrap(); let output = parser.parse("abcd").unwrap();
assert_eq!((59, "cd"), output); assert_eq!((59, "cd"), output);
} }
#[test]
fn test_combinators() {
let parser = sequence(map(repeated(literal_char('a')), |_| 10), literal_char('b'));
let output = parser.parse("aaaaaaaabcd").unwrap();
assert_eq! {((10, 'b'), "cd"), output};
}
} }