whole_func_string: function(stopToken) {
      const result = this.node("case");
      let test = null;
      let body = null;
      const items = [];
      if (this.token === this.tok.T_CASE) {
        test = this.next().read_expr();
      } else if (this.token === this.tok.T_DEFAULT) {
        // the defaut entry - no condition
        this.next();
      } else {
        this.expect([this.tok.T_CASE, this.tok.T_DEFAULT]);
      }
      this.expect([":", ";"]) && this.next();
      body = this.node("block");
      while (
        this.token != this.EOF &&
        this.token !== stopToken &&
        this.token !== this.tok.T_CASE &&
        this.token !== this.tok.T_DEFAULT
      ) {
        items.push(this.read_inner_statement());
      }
      return result(test, items.length > 0 ? body(null, items) : null);
    }
func_code_string: function(stopToken) {
      const result = this.node("case");
      let test = null;
      let body = null;
      const items = [];
      if (this.token === this.tok.T_CASE) {
        test = this.next().read_expr();
      } else if (this.token === this.tok.T_DEFAULT) {
        // the defaut entry - no condition
        this.next();
      } else {
        this.expect([this.tok.T_CASE, this.tok.T_DEFAULT]);
      }
      this.expect([":", ";"]) && this.next();
      body = this.node("block");
      while (
        this.token != this.EOF &&
        this.token !== stopToken &&
        this.token !== this.tok.T_CASE &&
        this.token !== this.tok.T_DEFAULT
      ) {
        items.push(this.read_inner_statement());
      }
      return result(test, items.length > 0 ? body(null, items) : null);
    }
func_documentation_string: ```ebnf
  case_list ::= ((T_CASE expr) | T_DEFAULT) (':' | ';') inner_statement*
  ```