diff --git a/corpus/strings.txt b/corpus/strings.txt index dc13b0d..ee0aa62 100644 --- a/corpus/strings.txt +++ b/corpus/strings.txt @@ -15,10 +15,19 @@ CMD ["\b\f\n\r\t\u0ABC\u12Cd"] (json_string))) (cmd_instruction (json_string_array - (json_string))) + (json_string + (escape_sequence) + (escape_sequence)))) (cmd_instruction (json_string_array - (json_string)))) + (json_string + (escape_sequence) + (escape_sequence) + (escape_sequence) + (escape_sequence) + (escape_sequence) + (escape_sequence) + (escape_sequence))))) ========================== Double-quoted strings @@ -48,12 +57,12 @@ ENV KEY "expansions: $FOO ${BAR}" (env_pair (unquoted_string) (double_quoted_string - (double_quoted_escape_sequence)))) + (escape_sequence)))) (env_instruction (env_pair (unquoted_string) (double_quoted_string - (double_quoted_escape_sequence)))) + (escape_sequence)))) (env_instruction (env_pair (unquoted_string) @@ -94,13 +103,13 @@ ENV KEY 'not escape sequences: \a \n' (env_pair (unquoted_string) (single_quoted_string - (single_quoted_escape_sequence) - (single_quoted_escape_sequence)))) + (escape_sequence) + (escape_sequence)))) (env_instruction (env_pair (unquoted_string) (single_quoted_string - (single_quoted_escape_sequence)))) + (escape_sequence)))) (env_instruction (env_pair (unquoted_string) diff --git a/grammar.js b/grammar.js index d59f61c..1f565ff 100644 --- a/grammar.js +++ b/grammar.js @@ -382,7 +382,20 @@ module.exports = grammar({ // Note that JSON strings are different from the other double-quoted // strings. They don't support $-expansions. // Convenient reference: https://www.json.org/ - json_string: ($) => /"(?:[^"\\]|\\(?:["\\/bfnrt]|u[0-9A-Fa-f]{4}))*"/, + json_string: ($) => seq( + '"', + repeat( + choice( + token.immediate(/[^"\\]+/), + alias($.json_escape_sequence, $.escape_sequence) + ) + ), + '"' + ), + + json_escape_sequence: ($) => token.immediate( + /\\(?:["\\/bfnrt]|u[0-9A-Fa-f]{4})/ + ), double_quoted_string: ($) => seq( @@ -390,7 +403,7 @@ module.exports = grammar({ repeat( choice( token.immediate(/[^"\n\\\$]+/), - $.double_quoted_escape_sequence, + alias($.double_quoted_escape_sequence, $.escape_sequence), "\\", $._immediate_expansion ) @@ -405,7 +418,7 @@ module.exports = grammar({ repeat( choice( token.immediate(/[^'\n\\]+/), - $.single_quoted_escape_sequence, + alias($.single_quoted_escape_sequence, $.escape_sequence), "\\", ) ),