src/parser/loops.js
function() {
    if (this.token === this.tok.T_LIST || this.token === "[") {
      const isShort = this.token === "[";
      const result = this.node("list");
      this.next();
      if (!isShort && this.expect("(")) this.next();
      const assignList = this.read_array_pair_list(isShort);
      if (this.expect(isShort ? "]" : ")")) this.next();
      return result(assignList, isShort);
    } else {
      return this.read_variable(false, false, false);
    }
  }
function() {
    if (this.token === this.tok.T_LIST || this.token === "[") {
      const isShort = this.token === "[";
      const result = this.node("list");
      this.next();
      if (!isShort && this.expect("(")) this.next();
      const assignList = this.read_array_pair_list(isShort);
      if (this.expect(isShort ? "]" : ")")) this.next();
      return result(assignList, isShort);
    } else {
      return this.read_variable(false, false, false);
    }
  }
Reads a foreach variable statement
```ebnf
foreach_variable =
variable |
'&' variable |
T_LIST '(' assignment_list ')' |
'[' assignment_list ']'
```
@see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L544
@return {Expression}