diff --git a/corpus/literals.txt b/corpus/literals.txt index 7d13c3301..371433231 100644 --- a/corpus/literals.txt +++ b/corpus/literals.txt @@ -42,6 +42,8 @@ works even in multiline strings, ${name} val string5 = s"$works${without}$spaces" val string6 = s"$a$b" + +val string7 = s"$$ $a" -------------------------------------------------------------------------------- (compilation_unit @@ -98,7 +100,14 @@ val string6 = s"$a$b" (interpolation (dollar_identifier)) (interpolation - (dollar_identifier)))))) + (dollar_identifier))))) + (val_definition + (identifier) + (interpolated_string_expression + (identifier) + (interpolated_string + (interpolation + (dollar_identifier)))))) ================================================================================ diff --git a/grammar.js b/grammar.js index 8163d3118..b7b84792e 100644 --- a/grammar.js +++ b/grammar.js @@ -1512,18 +1512,20 @@ module.exports = grammar({ _interpolated_multiline_string_start: $ => '"""', + _dollar_escape: $ => seq('$', '$'), + interpolation: $ => seq("$", choice($.dollar_identifier, $.block)), interpolated_string: $ => choice( seq( $._interpolated_string_start, - repeat(seq($._interpolated_string_middle, $.interpolation)), + repeat(seq($._interpolated_string_middle, choice($._dollar_escape, $.interpolation))), $._interpolated_string_end, ), seq( $._interpolated_multiline_string_start, - repeat(seq($._interpolated_multiline_string_middle, $.interpolation)), + repeat(seq($._interpolated_multiline_string_middle, choice($._dollar_escape, $.interpolation))), $._interpolated_multiline_string_end, ), ),