src/parser/switch.js
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);
  }
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);
  }
```ebnf
case_list ::= ((T_CASE expr) | T_DEFAULT) (':' | ';') inner_statement*
```