function() {
    let offset = this.node();
    if (this.token === this.tok.T_STRING) {
      const text = this.text();
      this.next();
      offset = offset("identifier", text);
    } else if (this.token === this.tok.T_NUM_STRING) {
      const num = this.text();
      this.next();
      offset = offset("number", num, null);
    } else if (this.token === this.tok.T_VARIABLE) {
      const name = this.text().substring(1);
      this.next();
      offset = offset("variable", name, false, false);
    } else {
      this.expect([
        this.tok.T_STRING,
        this.tok.T_NUM_STRING,
        this.tok.T_VARIABLE
      ]);
      // fallback : consider as identifier
      const text = this.text();
      this.next();
      offset = offset("identifier", text);
    }
    return offset;
  }
function() {
    let offset = this.node();
    if (this.token === this.tok.T_STRING) {
      const text = this.text();
      this.next();
      offset = offset("identifier", text);
    } else if (this.token === this.tok.T_NUM_STRING) {
      const num = this.text();
      this.next();
      offset = offset("number", num, null);
    } else if (this.token === this.tok.T_VARIABLE) {
      const name = this.text().substring(1);
      this.next();
      offset = offset("variable", name, false, false);
    } else {
      this.expect([
        this.tok.T_STRING,
        this.tok.T_NUM_STRING,
        this.tok.T_VARIABLE
      ]);
      
      const text = this.text();
      this.next();
      offset = offset("identifier", text);
    }
    return offset;
  }
function ( ) { let offset = this . node ( ) ; if ( this . token === this . tok . T_STRING ) { const text = this . text ( ) ; this . next ( ) ; offset = offset ( "identifier" , text ) ; } else if ( this . token === this . tok . T_NUM_STRING ) { const num = this . text ( ) ; this . next ( ) ; offset = offset ( "number" , num , null ) ; } else if ( this . token === this . tok . T_VARIABLE ) { const name = this . text ( ) . substring ( 1 ) ; this . next ( ) ; offset = offset ( "variable" , name , false , false ) ; } else { this . expect ( [ this . tok . T_STRING , this . tok . T_NUM_STRING , this . tok . T_VARIABLE ] ) ; // fallback : consider as identifier const text = this . text ( ) ; this . next ( ) ; offset = offset ( "identifier" , text ) ; } return offset ; }
https://github.com/php/php-src/blob/493524454d66adde84e00d249d607ecd540de99f/Zend/zend_language_parser.y#L1231
https : // github . com / php / php - src / blob / 493524454d66adde84e00d249d607ecd540de99f / Zend / zend_language_parser . y#L1231