     else if include COMPOUND_ASSIGN, value then tag = 'COMPOUND_ASSIGN'
     else if include UNARY          , value then tag = 'UNARY'
     else if include SHIFT          , value then tag = 'SHIFT'
-    else if value is '?' and prev.spaced   then tag = 'LOGIC'
-    else if prev and not prev.spaced and include CALLABLE, prev[0]
-      if value is '('
+    else if value is '?' and prev?.spaced  then tag = 'LOGIC'
+    else if prev and not prev.spaced
+      if value is '(' and include CALLABLE, prev[0]
         prev[0] = 'FUNC_EXIST' if prev[0] is '?'
         tag = 'CALL_START'
-      else if value is '['
+      else if value is '[' and include INDEXABLE, prev[0]
         tag = 'INDEX_START'
         switch prev[0]
           when '?'  then prev[0] = 'INDEX_SOAK'

    @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'


  # 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, '\\$&'
