From dab6774a47e0f3697d1ad52c79cdc2e442d89320 Mon Sep 17 00:00:00 2001 From: xenofem Date: Sat, 20 Jun 2020 04:28:20 -0400 Subject: [PATCH] correctly parse grammars that don't have a final newline --- Cargo.toml | 2 +- src/lib.rs | 9 +++++++++ src/parser.rs | 6 +++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7c11125..424a491 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "purrchance" -version = "0.4.0" +version = "0.4.1" authors = ["xenofem "] description = "An unofficial Rust implementation of the Perchance grammar engine" repository = "https://git.xeno.science/xenofem/purrchance" diff --git a/src/lib.rs b/src/lib.rs index 36bb7ec..d68346f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -172,6 +172,7 @@ test let nt = Symbol::NonTerminal(String::from("test")); assert_eq!(nt.eval(&g), Some(String::from("foo"))); } + #[test] fn eval_loaded_grammar_multiple_lists() { let g = load_grammar(" @@ -184,4 +185,12 @@ test1 let nt = Symbol::NonTerminal(String::from("test")); assert_eq!(nt.eval(&g), Some(String::from("foo"))); } + + #[test] + fn eval_loaded_grammar_no_trailing_newline() { + let g = load_grammar("test + foo").unwrap(); + let nt = Symbol::NonTerminal(String::from("test")); + assert_eq!(nt.eval(&g), Some(String::from("foo"))); + } } diff --git a/src/parser.rs b/src/parser.rs index 84e92a8..9a050de 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -26,8 +26,12 @@ where } } +fn take_all(input: &str) -> IResult<&str, &str> { + take_while(|_| true)(input) +} + fn terminal(input: &str) -> IResult<&str, Symbol> { - let (input, mut terminal_val) = verify(take_until_any(vec!["[", "//", "^", "\n"]), |s: &str| s.len() > 0)(input)?; + let (input, mut terminal_val) = verify(alt((take_until_any(vec!["[", "//", "^", "\n"]), take_all)), |s: &str| s.len() > 0)(input)?; if !input.starts_with("[") { terminal_val = terminal_val.trim_end(); }