Support escaping backslash in sexp.

This commit is contained in:
Tom Alexander 2023-07-18 23:08:58 -04:00
parent a817eefce7
commit 0d6f6288c9
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE

View File

@ -175,7 +175,7 @@ fn quoted_atom<'s>(input: &'s str) -> Res<&'s str, Token<'s>> {
_ => false, _ => false,
}), }),
'\\', '\\',
one_of(r#""n"#), one_of(r#""n\\"#),
)(remaining)?; )(remaining)?;
let (remaining, _) = tag(r#"""#)(remaining)?; let (remaining, _) = tag(r#"""#)(remaining)?;
let source = get_consumed(input, remaining); let source = get_consumed(input, remaining);
@ -298,4 +298,27 @@ mod tests {
r#"baz"# 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 \\)""#
)
}
} }