diff options
| -rw-r--r-- | src/lib.rs | 19 | ||||
| -rw-r--r-- | tests/sexpr.rs | 4 |
2 files changed, 20 insertions, 3 deletions
@@ -262,7 +262,10 @@ where }; let rest = match self.delimiter.check(rest.clone()) { - Ok((rest, _)) => rest, + Ok((rest, _)) => match self.parser.check(rest.clone()) { + Ok(_) => rest, + Err(_) => return Some(Err(EM::bind(|| rest))), + }, _ => rest, }; @@ -1030,6 +1033,20 @@ mod test { } #[test] + fn test_separated_list_with_trailing_delimiter() { + let input = "1.0."; + let it = InputIter::new(input); + + assert!( + numeric1() + .separated_by(tag(".")) + .at_least(1) + .check_finished(it) + .is_err() + ); + } + + #[test] fn test_find() { let input = "hello world"; let it = InputIter::new(input); diff --git a/tests/sexpr.rs b/tests/sexpr.rs index 1f8a0af..77ef3a0 100644 --- a/tests/sexpr.rs +++ b/tests/sexpr.rs @@ -2,7 +2,7 @@ use mon::{ Parser, ParserIter, alpha1, alphanumeric, alphanumeric1, input::InputIter, numeric1, tag, - whitespace, + whitespace, whitespace1, }; #[derive(Debug)] @@ -35,7 +35,7 @@ fn int<'a>() -> impl Parser<&'a str, Output = Sexpr> { fn sexpr<'a>() -> impl Parser<&'a str, Output = Sexpr> { |it| { sexpr() - .separated_by(whitespace().repeated().many()) + .separated_by(whitespace1()) .many() .delimited_by(tag("("), tag(")")) .map(|output| Sexpr::List(output)) |
