       "(", optional(@formal_parameters), ")",
       @statement_block)
 
-    function_call: -> prec(20, seq(
+    function_call: -> prec(PREC.CALL, seq(
       @expression,
       "(", err(optional(@arguments)), ")"))
 
-    constructor_call: -> prec(21, seq(
+    constructor_call: -> prec(PREC.NEW, seq(
       keyword("new"),
       @expression,
       optional(seq(
         "(", err(optional(@arguments)), ")"))))
 
-    member_access: -> prec(31, seq(
+    member_access: -> prec(PREC.MEMBER, seq(
       @expression,
       ".",
       @identifier))
 
-    subscript_access: -> prec(10, seq(
+    subscript_access: -> prec(PREC.MEMBER, seq(
       @expression,
       "[", err(@expression), "]"))
 
-    assignment: -> prec(-2, seq(
+    assignment: -> prec(PREC.ASSIGN, seq(
       choice(
         @identifier,
         @member_access,

      choice("+=", "-=", "*=", "/="),
      @expression))

    ternary: -> prec(-1, seq(
      @expression, "?", @expression, ":", @expression))

    bool_op: -> choice(
      prec(4, seq("!", @expression)),
      prec(2, seq(@expression, "&&", @expression)),
      prec(1, 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(
      @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)))

    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)))

    type_op: -> choice(
      prec(14, seq(keyword("typeof"), @expression)),
      prec(12, seq(@expression, keyword("instanceof"), @expression)),
      prec(12, seq(@expression, keyword("in"), @expression)))

    #
    # Primitives

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