whole_func_string: function() {
      this.expect(this.tok.T_TRY);
      const result = this.node("try");
      let always = null;
      const catches = [];
      const body = this.next().read_statement();
      // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L455
      while (this.token === this.tok.T_CATCH) {
        const item = this.node("catch");
        this.next().expect("(") && this.next();
        const what = this.read_list(this.read_namespace_name, "|", false);
        const variable = this.read_variable(true, false, false);
        this.expect(")");
        catches.push(item(this.next().read_statement(), what, variable));
      }
      if (this.token === this.tok.T_FINALLY) {
        always = this.next().read_statement();
      }
      return result(body, catches, always);
    }
func_code_string: function() {
      this.expect(this.tok.T_TRY);
      const result = this.node("try");
      let always = null;
      const catches = [];
      const body = this.next().read_statement();
      // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L455
      while (this.token === this.tok.T_CATCH) {
        const item = this.node("catch");
        this.next().expect("(") && this.next();
        const what = this.read_list(this.read_namespace_name, "|", false);
        const variable = this.read_variable(true, false, false);
        this.expect(")");
        catches.push(item(this.next().read_statement(), what, variable));
      }
      if (this.token === this.tok.T_FINALLY) {
        always = this.next().read_statement();
      }
      return result(body, catches, always);
    }
func_documentation_string: ```ebnf
  try ::= T_TRY '{' inner_statement* '}'
  (
  T_CATCH '(' namespace_name variable ')' '{'  inner_statement* '}'
  )*
  (T_FINALLY '{' inner_statement* '}')?
  ```
  @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L448
  @return {Try}