   rules:
     program: -> repeat(@statement)
 
+    #
+    # Statements
+    #
+
     statement: -> choice(
       @expression_statement,
+      @var_declaration,
+      @statement_block,
+
       @if_statement,
       @switch_statement,
       @for_statement,
       @for_in_statement,
       @while_statement,
       @do_statement,
+      @try_statement,
+
       @break_statement,
-      @statement_block,
       @return_statement,
       @throw_statement,
-      @try_statement,
       @delete_statement,
-      @var_declaration)
+    )
 
     expression_statement: -> seq(
       err(@expression), terminator())
+
+    var_declaration: -> seq(
+      keyword("var"),
+      commaSep1(err(choice(
+        @identifier,
+        @var_assignment))),
+      terminator())
+
+    statement_block: -> seq(
+      "{", err(repeat(@statement)), "}")
 
     if_statement: -> seq(
       keyword("if"),

      keyword("finally"),
      @statement_block)

    throw_statement: -> seq(
      keyword("throw"),
      @expression,
      terminator())

    expression: -> choice(
      @identifier,
      @number,
      @string,

      keyword("while"),
      @_paren_expression)

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

    break_statement: -> seq(
      keyword("break"),
      terminator())

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

    throw_statement: -> seq(
      keyword("throw"),
      @expression,
      terminator())

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

    #
    # Statement components
    #

    case: -> seq(
      keyword("case"),
      @expression,
      ":",
      repeat(@statement))

    default: -> seq(
      keyword("default"),
      ":",
      repeat(@statement))

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