     o "Class"
     o "Splat"
     o "Existence"
-    o "Comment"
-    o "Extension"
+    o "COMMENT"
+    o "EXTENSION"
   ]
 
   # A an indented block of expressions. Note that the [Rewriter](rewriter.html)

  # 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 "AlphaNumeric ASSIGN Expression",         -> new AssignNode new ValueNode($1), $3, 'object'
    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).

  # The general group of accessors into an object, by property, by prototype
  # or by array index or slice.
  Accessor: [
    o "PROPERTY_ACCESS IDENTIFIER",             -> new AccessorNode $2
    o "PROTOTYPE_ACCESS IDENTIFIER",            -> new AccessorNode $2, 'prototype'
    o "::",                                     -> new AccessorNode(new LiteralNode('prototype'))
    o "SOAK_ACCESS IDENTIFIER",                 -> new AccessorNode $2, 'soak'
    o "Index"
    o "Slice",                                  -> new SliceNode $1
  ]
