 
   # Matches strings, including multi-line strings.
   string_token: ->
-    return false unless string: @match STRING, 1
+    string: @balanced_group ['"'], ['${', '}']
+    string: @balanced_group ["'"] if string is false
+    return false unless string
     @interpolate_string string.replace STRING_NEWLINES, " \\\n"
     @line += count string, "\n"
     @i += string.length

    @token 'REGEX', regex
    @i += regex.length
    true

  # Matches and conumes comments.
  comment_token: ->

# Token matching regexes.
IDENTIFIER    : /^([a-zA-Z$_](\w|\$)*)/
NUMBER        : /^(\b((0(x|X)[0-9a-fA-F]+)|([0-9]+(\.[0-9]+)?(e[+\-]?[0-9]+)?)))\b/i
HEREDOC       : /^("{6}|'{6}|"{3}\n?([\s\S]*?)\n?([ \t]*)"{3}|'{3}\n?([\s\S]*?)\n?([ \t]*)'{3})/
INTERPOLATION : /(^|[\s\S]*?(?:[\\]|\\\\)?)\$([a-zA-Z_@]\w*|{[\s\S]*?(?:[^\\]|\\\\)})/
JS            : /^(``|`([\s\S]*?)([^\\]|\\\\)`)/
