whole_func_string: function(shortForm) {
      if (
        this.token === "," ||
        (!shortForm && this.token === ")") ||
        (shortForm && this.token === "]")
      ) {
        return null;
      }
      if (this.token === "&") {
        return this.next().read_variable(true, false, true);
      } else {
        const entry = this.node(ArrayEntry);
        const expr = this.read_expr();
        if (this.token === this.tok.T_DOUBLE_ARROW) {
          if (this.next().token === "&") {
            return entry(expr, this.next().read_variable(true, false, true));
          } else {
            return entry(expr, this.read_expr());
          }
        }
        return expr;
      }
    }
func_code_string: function(shortForm) {
      if (
        this.token === "," ||
        (!shortForm && this.token === ")") ||
        (shortForm && this.token === "]")
      ) {
        return null;
      }
      if (this.token === "&") {
        return this.next().read_variable(true, false, true);
      } else {
        const entry = this.node(ArrayEntry);
        const expr = this.read_expr();
        if (this.token === this.tok.T_DOUBLE_ARROW) {
          if (this.next().token === "&") {
            return entry(expr, this.next().read_variable(true, false, true));
          } else {
            return entry(expr, this.read_expr());
          }
        }
        return expr;
      }
    }
func_documentation_string: Reads an entry
  array_pair:
  expr T_DOUBLE_ARROW expr
  | expr
  | expr T_DOUBLE_ARROW '&' variable
  | '&' variable
  | expr T_DOUBLE_ARROW T_LIST '(' array_pair_list ')'
  | T_LIST '(' array_pair_list ')'