From 0d6f6288c967ac53175a89a9e147f8e626028a1d Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Tue, 18 Jul 2023 23:08:58 -0400 Subject: [PATCH] Support escaping backslash in sexp. --- src/parser/sexp.rs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/parser/sexp.rs b/src/parser/sexp.rs index fc97365..8ed62b5 100644 --- a/src/parser/sexp.rs +++ b/src/parser/sexp.rs @@ -175,7 +175,7 @@ fn quoted_atom<'s>(input: &'s str) -> Res<&'s str, Token<'s>> { _ => false, }), '\\', - one_of(r#""n"#), + one_of(r#""n\\"#), )(remaining)?; let (remaining, _) = tag(r#"""#)(remaining)?; let source = get_consumed(input, remaining); @@ -298,4 +298,27 @@ mod tests { r#"baz"# ); } + + #[test] + fn string_containing_escaped_characters() { + let input = r#" (foo "\\( x=2 \\)" bar) "#; + let (remaining, parsed) = sexp_with_padding(input).expect("Parse the input"); + assert_eq!(remaining, ""); + assert!(match parsed { + Token::Atom(_) => false, + Token::List(_) => true, + Token::TextWithProperties(_) => false, + }); + let children = match parsed { + Token::List(children) => children, + _ => panic!("Should be a list."), + }; + assert_eq!( + match children.get(1) { + Some(Token::Atom(body)) => *body, + _ => panic!("First child should be an atom."), + }, + r#""\\( x=2 \\)""# + ) + } }