whole_func_string: function() {
      const result = this.node("while");
      this.expect(this.tok.T_WHILE) && this.next();
      let test = null;
      let body = null;
      let shortForm = false;
      if (this.expect("(")) this.next();
      test = this.read_expr();
      if (this.expect(")")) this.next();
      if (this.token === ":") {
        shortForm = true;
        body = this.read_short_form(this.tok.T_ENDWHILE);
      } else {
        body = this.read_statement();
      }
      return result(test, body, shortForm);
    }
func_code_string: function() {
      const result = this.node("while");
      this.expect(this.tok.T_WHILE) && this.next();
      let test = null;
      let body = null;
      let shortForm = false;
      if (this.expect("(")) this.next();
      test = this.read_expr();
      if (this.expect(")")) this.next();
      if (this.token === ":") {
        shortForm = true;
        body = this.read_short_form(this.tok.T_ENDWHILE);
      } else {
        body = this.read_statement();
      }
      return result(test, body, shortForm);
    }
func_documentation_string: Reads a while statement
  ```ebnf
  while ::= T_WHILE (statement | ':' inner_statement_list T_ENDWHILE ';')
  ```
  @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L587
  @return {While}