whole_func_string: function(expect, isBinary = false) {
      let node = this.node("encapsed");
      this.next();
      const start = this.lexer.yylloc.prev_offset - (isBinary ? 1 : 0);
      const value = [];
      let type = null;
  
      if (expect === "`") {
        type = this.ast.encapsed.TYPE_SHELL;
      } else if (expect === '"') {
        type = this.ast.encapsed.TYPE_STRING;
      } else {
        type = this.ast.encapsed.TYPE_HEREDOC;
      }
  
      // reading encapsed parts
      while (this.token !== expect && this.token !== this.EOF) {
        value.push(this.read_encapsed_string_item(true));
      }
  
      this.expect(expect) && this.next();
      node = node(
        value,
        this.lexer._input.substring(start - 1, this.lexer.yylloc.first_offset),
        type
      );
  
      if (expect === this.tok.T_END_HEREDOC) {
        node.label = this.lexer.heredoc_label;
      }
      return node;
    }
func_code_string: function(expect, isBinary = false) {
      let node = this.node("encapsed");
      this.next();
      const start = this.lexer.yylloc.prev_offset - (isBinary ? 1 : 0);
      const value = [];
      let type = null;
  
      if (expect === "`") {
        type = this.ast.encapsed.TYPE_SHELL;
      } else if (expect === '"') {
        type = this.ast.encapsed.TYPE_STRING;
      } else {
        type = this.ast.encapsed.TYPE_HEREDOC;
      }
  
      // reading encapsed parts
      while (this.token !== expect && this.token !== this.EOF) {
        value.push(this.read_encapsed_string_item(true));
      }
  
      this.expect(expect) && this.next();
      node = node(
        value,
        this.lexer._input.substring(start - 1, this.lexer.yylloc.first_offset),
        type
      );
  
      if (expect === this.tok.T_END_HEREDOC) {
        node.label = this.lexer.heredoc_label;
      }
      return node;
    }
func_documentation_string: Reads an encapsed string