Improve string literal parsing and add unit tests

pull/25/head
Wilfred Hughes 2021-07-20 20:07:21 +07:00
parent c48e8e2977
commit c184a7da8f
2 changed files with 71 additions and 6 deletions

@ -12,7 +12,7 @@ atom_patterns = [
]
string_patterns = [
# Double-quoted strings
'"((\\")|[^"])*"',
'"((\\.)|[^"])*"',
# Single quoted strings
"'((\\\\')|[^'])*'",
# Backtick strings
@ -57,7 +57,7 @@ atom_patterns = [
]
string_patterns = [
# Double-quoted strings
'"((\\")|[^"])*"',
'"((\\.)|[^"])*"',
# Single quoted strings
"'((\\\\')|[^'])*'",
]
@ -80,7 +80,7 @@ atom_patterns = [
]
string_patterns = [
# Double-quoted strings
'"((\\")|[^"])*"',
'"((\\.)|[^"])*"',
]
comment_patterns = [
';.*',
@ -123,7 +123,7 @@ atom_patterns = [
]
string_patterns = [
# Double-quoted strings
'"((\\")|[^"])*"',
'"((\\.)|[^"])*"',
]
comment_patterns = [
# Mult-line comments
@ -146,7 +146,7 @@ atom_patterns = [
]
string_patterns = [
# Double-quoted strings
'"((\\")|[^"])*"',
'"((\\.)|[^"])*"',
]
comment_patterns = [
';.*',
@ -176,7 +176,7 @@ atom_patterns = [
]
string_patterns = [
# Double-quoted strings
'"((\\")|[^"])*"',
'"((\\.)|[^"])*"',
]
comment_patterns = [
# Single line comments

@ -470,6 +470,71 @@ mod tests {
);
}
#[test]
fn test_parse_string_escaped_doublequote() {
let arena = Arena::new();
assert_syntaxes(
// "\""
&parse(&arena, "\"\\\"\"", &lang()),
&[Syntax::new_atom(
&arena,
vec![SingleLineSpan {
line: 0.into(),
start_col: 0,
end_col: 4,
}],
"\"\\\"\"",
)],
);
}
#[test]
fn test_parse_string_escaped_backlash() {
let arena = Arena::new();
assert_syntaxes(
// "\\"
&parse(&arena, "\"\\\\\"", &lang()),
&[Syntax::new_atom(
&arena,
vec![SingleLineSpan {
line: 0.into(),
start_col: 0,
end_col: 4,
}],
"\"\\\\\"",
)],
);
}
#[test]
fn test_parse_string_escaped_backlash_and_second_string() {
let arena = Arena::new();
assert_syntaxes(
// "\\" "a"
&parse(&arena, "\"\\\\\" \"a\"", &lang()),
&[Syntax::new_atom(
&arena,
vec![SingleLineSpan {
line: 0.into(),
start_col: 0,
end_col: 4,
}],
"\"\\\\\"",
), Syntax::new_atom(
&arena,
vec![SingleLineSpan {
line: 0.into(),
start_col: 5,
end_col: 8,
}],
"\"a\"",
)],
);
}
#[test]
fn test_parse_multiple() {
let arena = Arena::new();