Compare commits
2 Commits
41829019b6
...
bffaca4d68
Author | SHA1 | Date | |
---|---|---|---|
|
bffaca4d68 | ||
|
97d35df687 |
18
src/combinators.rs
Normal file
18
src/combinators.rs
Normal 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))
|
||||
}
|
||||
}
|
@ -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};
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user