 
   # Constructs a string token by escaping quotes and newlines.
   makeString: (body, quote, heredoc) ->
+    return quote + quote unless body
     body = body.replace /\\([\s\S])/g, (match, contents) ->
       if contents in ['\n', quote] then contents else match
     body = body.replace /// #{quote} ///g, '\\$&'

    @i += value.length
    tag = value
    prev = last @tokens
    if value is '='
      @assignmentError() if not prev[1].reserved and include JS_FORBIDDEN, prev[1]
      if prev[1] in ['||', '&&']
        prev[0] = 'COMPOUND_ASSIGN'

# Tokens which could legitimately be invoked or indexed. A opening
# parentheses or bracket following these tokens will be recorded as the start
# of a function invocation or indexing operation.
CALLABLE  = ['IDENTIFIER', 'STRING', 'REGEX', ')', ']', '}', '?', '::', '@', 'THIS', 'SUPER']
INDEXABLE = CALLABLE.concat 'NUMBER', 'BOOL'

# Tokens that, when immediately preceding a `WHEN`, indicate that the `WHEN`
# occurs at the start of a line. We disambiguate these from trailing whens to
