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
mod choice;
mod combinators;
mod map;
mod primitives;
mod sequence;
pub use choice::*;
pub use combinators::*;
pub use map::*;
pub use primitives::*;
pub use sequence::*;
@ -65,4 +67,11 @@ mod tests {
let output = parser.parse("abcd").unwrap();
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};
}
}