       choice("+=", "-=", "*=", "/="),
       @expression))
 
-    object: -> seq(
-      "{", commaSep(err(@pair)), "}")
-
-    pair: -> seq(
-      choice(@identifier, @string),
-      ":",
-      @expression)
-
-    function: -> seq(
-      keyword("function"),
-      optional(@identifier),
-      "(", optional(@formal_parameters), ")",
-      @statement_block)
-
-    formal_parameters: ->
-      commaSep1(@identifier)
-
-    statement_block: -> seq(
-      "{", err(repeat(@statement)), "}")
-
-    array: -> seq(
-      "[", commaSep(err(@expression)), "]")
-
-    identifier: -> /[\a_$][\a\d_$]*/
-
-    number: -> token(choice(
-      seq(
-        "0x",
-        /[\da-fA-F]+/),
-      seq(
-        /\d+/,
-        optional(seq(".", /\d*/)))))
+    ternary: -> prec(-1, seq(
+      @expression, "?", @expression, ":", @expression))
 
     bool_op: -> choice(
       prec(4, seq("!", @expression)),

      keyword("while"),
      @_paren_expression)

    return_statement: -> seq(
      keyword("return"),
      optional(@expression),
      terminator())

    delete_statement: -> seq(
      keyword("delete"),
      choice(@member_access, @subscript_access),
      terminator())

    var_declaration: -> seq(
      keyword("var"),
      commaSep1(err(choice(
        @identifier,
        @var_assignment))),
      terminator())

    var_assignment: -> seq(
      @identifier,
      "=",
      @expression)

    try_statement: -> seq(
      keyword("try"),
      @statement_block,
      optional(@catch),
      optional(@finally))

    catch: -> seq(
      keyword("catch"),
      optional(seq("(", @identifier, ")"))

      @expression,
      optional(seq(
        "(", err(optional(@arguments)), ")"))))

    member_access: -> prec(31, seq(
      @expression,
