code: function() {
      const result = this.node("namespace");
      let body;
      this.expect(this.tok.T_NAMESPACE) && this.next();
      if (this.token == "{") {
        this.currentNamespace = [""];
        body = this.next().read_top_statements();
        this.expect("}") && this.next();
        return result([""], body, true);
      } else {
        const name = this.read_namespace_name();
        if (this.token == ";") {
          this.currentNamespace = name;
          body = this.next().read_top_statements();
          this.expect(this.EOF);
          return result(name.name, body, false);
        } else if (this.token == "{") {
          this.currentNamespace = name;
          body = this.next().read_top_statements();
          this.expect("}") && this.next();
          return result(name.name, body, true);
        } else if (this.token === "(") {
          // resolve ambuiguity between namespace & function call
          name.resolution = this.ast.reference.RELATIVE_NAME;
          name.name = name.name.substring(1);
          result.destroy();
          return this.node("call")(name, this.read_function_argument_list());
        } else {
          this.error(["{", ";"]);
          // graceful mode :
          this.currentNamespace = name;
          body = this.read_top_statements();
          this.expect(this.EOF);
          return result(name, body, false);
        }
      }
    }
docs: Reads a namespace declaration block
  ```ebnf
  namespace ::= T_NAMESPACE namespace_name? '{'
  top_statements
  '}'
  | T_NAMESPACE namespace_name ';' top_statements
  ```
  @see http://php.net/manual/en/language.namespaces.php
  @return {Namespace}