whole_func_string: function(flags) {
      const result = this.node("propertystatement");
  
      const properties = this.read_list(
        /**
         * Reads a variable declaration
         *
         * ```ebnf
         *  variable_declaration ::= T_VARIABLE '=' scalar
         * ```
         */
        function read_variable_declaration() {
          const result = this.node("property");
          this.expect(this.tok.T_VARIABLE);
          let propName = this.node("identifier");
          const name = this.text().substring(1); // ignore $
          this.next();
          propName = propName(name);
          if (this.token === ";" || this.token === ",") {
            return result(propName, null);
          } else if (this.token === "=") {
            // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L815
            return result(propName, this.next().read_expr());
          } else {
            this.expect([",", ";", "="]);
            return result(propName, null);
          }
        },
        ","
      );
  
      return result(null, properties, flags);
    }
func_code_string: function(flags) {
      const result = this.node("propertystatement");
  
      const properties = this.read_list(
        /**
         * Reads a variable declaration
         *
         * ```ebnf
         *  variable_declaration ::= T_VARIABLE '=' scalar
         * ```
         */
        function read_variable_declaration() {
          const result = this.node("property");
          this.expect(this.tok.T_VARIABLE);
          let propName = this.node("identifier");
          const name = this.text().substring(1); // ignore $
          this.next();
          propName = propName(name);
          if (this.token === ";" || this.token === ",") {
            return result(propName, null);
          } else if (this.token === "=") {
            // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L815
            return result(propName, this.next().read_expr());
          } else {
            this.expect([",", ";", "="]);
            return result(propName, null);
          }
        },
        ","
      );
  
      return result(null, properties, flags);
    }
func_documentation_string: Reads variable list
  ```ebnf
  variable_list ::= (variable_declaration ',')* variable_declaration
  ```