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) {
      
      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*
```
ebnf case_list :: = (( T_CASE expr ) | T_DEFAULT ) ( : | ; ) inner_statement *