text: /**
   * Copyright (C) 2018 Glayzzle (BSD3 License)
   * @authors https://github.com/glayzzle/php-parser/graphs/contributors
   * @url http://glayzzle.com
   */
  "use strict";
  
  module.exports = {
    /**
     * ```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}
     */
    read_try: 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);
        let variable = null;
        if (this.token === this.tok.T_VARIABLE) {
          variable = this.read_variable(true, 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);
    },
  };
  