       choice("+=", "-=", "*=", "/="),
       @expression))
 
-    ternary: -> prec(-1, seq(
+    ternary: -> prec(PREC.TERNARY, seq(
       @expression, "?", @expression, ":", @expression))
 
     bool_op: -> choice(
-      prec(4, seq("!", @expression)),
-      prec(2, seq(@expression, "&&", @expression)),
-      prec(1, seq(@expression, "||", @expression)))
+      prec(PREC.NOT, seq("!", @expression)),
+      prec(PREC.AND, seq(@expression, "&&", @expression)),
+      prec(PREC.OR, seq(@expression, "||", @expression)))
 
     bitwise_op: -> choice(
-      prec(13, seq(@expression, ">>", @expression)),
-      prec(13, seq(@expression, "<<", @expression)),
-      prec(12, seq(@expression, "&", @expression)),
-      prec(11, seq(@expression, "|", @expression)))
-
-    comma_op: -> prec(-3, seq(
+      prec(PREC.TIMES, seq(@expression, ">>", @expression)),
+      prec(PREC.TIMES, seq(@expression, "<<", @expression)),
+      prec(PREC.AND, seq(@expression, "&", @expression)),
+      prec(PREC.OR, seq(@expression, "|", @expression)))
+
+    comma_op: -> prec(PREC.COMMA, seq(
       @expression, ",", @expression))
 
     math_op: -> choice(
-      prec(14, seq("-", @expression)),
-      prec(14, seq("+", @expression)),
-      prec(14, seq(@expression, "++")),
-      prec(14, seq(@expression, "--")),
-      prec(11, seq(@expression, "+", @expression)),
-      prec(11, seq(@expression, "-", @expression)),
-      prec(12, seq(@expression, "*", @expression)),
-      prec(12, seq(@expression, "/", @expression)))
+      prec(PREC.NEG, seq("-", @expression)),
+      prec(PREC.NEG, seq("+", @expression)),
+      prec(PREC.INC, seq(@expression, "++")),
+      prec(PREC.INC, seq(@expression, "--")),
+      prec(PREC.PLUS, seq(@expression, "+", @expression)),
+      prec(PREC.PLUS, seq(@expression, "-", @expression)),
+      prec(PREC.TIMES, seq(@expression, "*", @expression)),
+      prec(PREC.TIMES, seq(@expression, "/", @expression)))
 
     rel_op: -> choice(
-      prec(10, seq(@expression, "<", @expression)),
-      prec(10, seq(@expression, "<=", @expression)),
-      prec(10, seq(@expression, "==", @expression)),
-      prec(10, seq(@expression, "===", @expression)),
-      prec(10, seq(@expression, "!=", @expression)),
-      prec(10, seq(@expression, "!==", @expression)),
-      prec(10, seq(@expression, ">=", @expression)),
-      prec(10, seq(@expression, ">", @expression)))
+      prec(PREC.REL, seq(@expression, "<", @expression)),
+      prec(PREC.REL, seq(@expression, "<=", @expression)),
+      prec(PREC.REL, seq(@expression, "==", @expression)),
+      prec(PREC.REL, seq(@expression, "===", @expression)),
+      prec(PREC.REL, seq(@expression, "!=", @expression)),
+      prec(PREC.REL, seq(@expression, "!==", @expression)),
+      prec(PREC.REL, seq(@expression, ">=", @expression)),
+      prec(PREC.REL, seq(@expression, ">", @expression)))
 
     type_op: -> choice(
-      prec(14, seq(keyword("typeof"), @expression)),
-      prec(12, seq(@expression, keyword("instanceof"), @expression)),
-      prec(12, seq(@expression, keyword("in"), @expression)))
+      prec(PREC.TYPEOF, seq(keyword("typeof"), @expression)),
+      prec(PREC.REL, seq(@expression, keyword("instanceof"), @expression)),
+      prec(PREC.REL, seq(@expression, keyword("in"), @expression)))
 
     #
     # Primitives

      "(", optional(@formal_parameters), ")",
      @statement_block)

    function_call: -> prec(20, seq(
      @expression,
      "(", err(optional(@arguments)), ")"))

    constructor_call: -> prec(21, seq(
      keyword("new"),
      @expression,
      optional(seq(
        "(", err(optional(@arguments)), ")"))))

    member_access: -> prec(31, seq(
      @expression,
      ".",
      @identifier))

    subscript_access: -> prec(10, seq(
      @expression,
      "[", err(@expression), "]"))

    assignment: -> prec(-2, seq(
      choice(
        @identifier,
        @member_access,

      @string,
      @regex,
      @true,
      @false,
      @null,
      @undefined,
