 # Matches identifying literals: variables, keywords, method names, etc.
 lex::identifier_token: ->
   return false unless id: @match IDENTIFIER, 1
-  # Keywords are special identifiers tagged with their own name,
-  # 'if' will result in an ['IF', "if"] token.
-  tag: if KEYWORDS.indexOf(id) >= 0 then id.toUpperCase() else 'IDENTIFIER'
-  tag: 'LEADING_WHEN' if tag is 'WHEN' and BEFORE_WHEN.indexOf(@tag()) >= 0
-  @tag(1, 'PROTOTYPE_ACCESS') if tag is 'IDENTIFIER' and @value() is '::'
-  if tag is 'IDENTIFIER' and @value() is '.' and !(@value(2) is '.')
+  @tag(1, 'PROTOTYPE_ACCESS') if @value() is '::'
+  if @value() is '.' and not (@value(2) is '.')
     if @tag(2) is '?'
       @tag(1, 'SOAK_ACCESS')
       @tokens.splice(-2, 1)
     else
       @tag(1, 'PROPERTY_ACCESS')
+  tag: 'IDENTIFIER'
+  tag:  id.toUpperCase() if KEYWORDS.indexOf(id) >= 0 and not (ACCESSORS.indexOf(@tag()) >= 0)
+  tag: 'LEADING_WHEN' if tag is 'WHEN' and BEFORE_WHEN.indexOf(@tag()) >= 0
   @token(tag, id)
   @i += id.length
   true

# Matches and consumes non-meaningful whitespace.
lex::whitespace_token: ->
  return false unless space: @match WHITESPACE, 1
  @spaced: @value()
  @i += space.length
  true


  @indent  : 0          # The current indent level.
  @indents : []         # The stack of all indent levels we are currently within.
  @tokens  : []         # Collection of all parsed tokens in the form [:TOKEN_TYPE, value]
  while @i < @code.length
    @chunk: @code.slice(@i)
    @extract_next_token()
