parent
81213f7927
commit
516ddd1b08
2 changed files with 47 additions and 1 deletions
|
@ -6,6 +6,10 @@
|
|||
|
||||
== [Unreleased]
|
||||
|
||||
== Added
|
||||
|
||||
- implement literal strings
|
||||
|
||||
== Fixed
|
||||
|
||||
- fix serializing strings containing `:`
|
||||
|
|
|
@ -62,6 +62,13 @@ fn identifier(input: Span) -> IResult<Span, &str> {
|
|||
})(input)
|
||||
}
|
||||
|
||||
fn literal_string(input: Span) -> IResult<Span, &str> {
|
||||
map(
|
||||
delimited(tag("\"\"\""), take_until("\"\"\""), tag("\"\"\"")),
|
||||
|val: Span| *val.fragment(),
|
||||
)(input)
|
||||
}
|
||||
|
||||
fn string_content(input: Span) -> IResult<Span, &str> {
|
||||
let buf = input.fragment();
|
||||
let mut escaped = false;
|
||||
|
@ -99,7 +106,7 @@ fn delimited_string(input: Span) -> IResult<Span, &str> {
|
|||
}
|
||||
|
||||
fn string(input: Span) -> IResult<Span, &str> {
|
||||
alt((identifier, delimited_string))(input)
|
||||
alt((identifier, literal_string, delimited_string))(input)
|
||||
}
|
||||
|
||||
fn line_comment(input: Span) -> IResult<Span, &str> {
|
||||
|
@ -340,6 +347,41 @@ mod test {
|
|||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_literal_string() {
|
||||
assert_ok!(r#""""""""#, literal_string, "", "");
|
||||
assert_ok!(r#""""foo""""#, literal_string, "", "foo");
|
||||
assert_ok!(r#""""foo"""""#, literal_string, "\"", "foo");
|
||||
assert_ok!(r#"""""foo""""#, literal_string, "", "\"foo");
|
||||
assert_ok!(r#""""\n""""#, literal_string, "", "\\n");
|
||||
|
||||
{
|
||||
let raw = r#"
|
||||
This is a lengthy description!
|
||||
|
||||
It contains line breaks.
|
||||
|
||||
Escape sequences, like \n and \t, are parsed literally.
|
||||
"Quoted strings are fine", so are two sucessive quotes: "".
|
||||
"#;
|
||||
|
||||
let input = format!(r#""""{}""""#, raw);
|
||||
|
||||
assert_ok!(input.as_str(), literal_string, "", raw);
|
||||
}
|
||||
|
||||
{
|
||||
let input = Span::from(r#"""""""#);
|
||||
assert_eq!(
|
||||
literal_string(input),
|
||||
Err(Err::Error(Error::new(
|
||||
unsafe { Span::new_from_raw_offset(3, 1, "\"\"", ()) },
|
||||
ErrorKind::TakeUntil
|
||||
)))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_line_comment() {
|
||||
assert_ok!("// foo", line_comment, "", " foo");
|
||||
|
|
Loading…
Add table
Reference in a new issue