whole_func_string: function() {
      switch (this.token) {
        case this.tok.T_FUNCTION:
          return this.read_function(false, false);
        // optional flags
        case this.tok.T_ABSTRACT:
        case this.tok.T_FINAL:
        case this.tok.T_CLASS:
          return this.read_class();
        case this.tok.T_INTERFACE:
          return this.read_interface();
        case this.tok.T_TRAIT:
          return this.read_trait();
        case this.tok.T_HALT_COMPILER: {
          this.raiseError(
            "__HALT_COMPILER() can only be used from the outermost scope"
          );
          // fallback : returns a node but does not stop the parsing
          let node = this.node("halt");
          this.next().expect("(") && this.next();
          this.expect(")") && this.next();
          node = node(this.lexer._input.substring(this.lexer.offset));
          this.expect(";") && this.next();
          return node;
        }
        default:
          return this.read_statement();
      }
    }
func_code_string: function() {
      switch (this.token) {
        case this.tok.T_FUNCTION:
          return this.read_function(false, false);
        // optional flags
        case this.tok.T_ABSTRACT:
        case this.tok.T_FINAL:
        case this.tok.T_CLASS:
          return this.read_class();
        case this.tok.T_INTERFACE:
          return this.read_interface();
        case this.tok.T_TRAIT:
          return this.read_trait();
        case this.tok.T_HALT_COMPILER: {
          this.raiseError(
            "__HALT_COMPILER() can only be used from the outermost scope"
          );
          // fallback : returns a node but does not stop the parsing
          let node = this.node("halt");
          this.next().expect("(") && this.next();
          this.expect(")") && this.next();
          node = node(this.lexer._input.substring(this.lexer.offset));
          this.expect(";") && this.next();
          return node;
        }
        default:
          return this.read_statement();
      }
    }
func_documentation_string: reads a simple inner statement
  ```ebnf
  inner_statement ::= '{' inner_statements '}' | token
  ```