   # Assignment when it happens within an object literal. The difference from
   # the ordinary **Assign** is that these allow numbers and strings as keys.
   AssignObj: [
-    o "IDENTIFIER ASSIGN Expression",           -> new AssignNode new ValueNode($1), $3, 'object'
+    o "Identifier ASSIGN Expression",           -> new AssignNode new ValueNode($1), $3, 'object'
     o "AlphaNumeric ASSIGN Expression",         -> new AssignNode new ValueNode($1), $3, 'object'
-    o "COMMENT"
+    o "Comment"
   ]
 
   # A return statement from a function body.
   Return: [
     o "RETURN Expression",                      -> new ReturnNode $2
     o "RETURN",                                 -> new ReturnNode new ValueNode new LiteralNode 'null'
+  ]
+
+  # A comment. Because CoffeeScript passes comments through to JavaScript, we
+  # have to parse comments like any other construct, and identify all of the
+  # positions in which they can occur in the grammar.
+  Comment: [
+    o "COMMENT",                                -> new CommentNode yytext
   ]
 
   # [The existential operator](http://jashkenas.github.com/coffee-script/#existence).


  # Variables and properties that can be assigned to.
  SimpleAssignable: [
    o "IDENTIFIER",                             -> new ValueNode $1
    o "Value Accessor",                         -> $1.push $2
    o "Invocation Accessor",                    -> new ValueNode $1, [$2]
    o "ThisProperty"

  # (optional) reference to the current index. Or, *key, value*, in the case
  # of object comprehensions.
  ForVariables: [
    o "Identifier",                             -> [$1]
    o "Identifier , Identifier",                -> [$1, $3]
  ]

  # The source of a comprehension is an array or object with an optional filter
