1
Fork 0

feat: Implement literal strings

Closes #5.
This commit is contained in:
Lucas Schwiderski 2023-03-10 10:42:54 +01:00
parent 81213f7927
commit 516ddd1b08
Signed by: lucas
GPG key ID: AA12679AAA6DF4D8
2 changed files with 47 additions and 1 deletions

View file

@ -6,6 +6,10 @@
== [Unreleased] == [Unreleased]
== Added
- implement literal strings
== Fixed == Fixed
- fix serializing strings containing `:` - fix serializing strings containing `:`

View file

@ -62,6 +62,13 @@ fn identifier(input: Span) -> IResult<Span, &str> {
})(input) })(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> { fn string_content(input: Span) -> IResult<Span, &str> {
let buf = input.fragment(); let buf = input.fragment();
let mut escaped = false; let mut escaped = false;
@ -99,7 +106,7 @@ fn delimited_string(input: Span) -> IResult<Span, &str> {
} }
fn 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> { 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] #[test]
fn parse_line_comment() { fn parse_line_comment() {
assert_ok!("// foo", line_comment, "", " foo"); assert_ok!("// foo", line_comment, "", " foo");