whole_func_string: function() {
      const result = this.node("if");
      let body = null;
      let alternate = null;
      let shortForm = false;
      let test = null;
      test = this.next().read_if_expr();
  
      if (this.token === ":") {
        shortForm = true;
        this.next();
        body = this.node("block");
        const items = [];
        while (this.token !== this.EOF && this.token !== this.tok.T_ENDIF) {
          if (this.token === this.tok.T_ELSEIF) {
            alternate = this.read_elseif_short();
            break;
          } else if (this.token === this.tok.T_ELSE) {
            alternate = this.read_else_short();
            break;
          }
          items.push(this.read_inner_statement());
        }
        body = body(null, items);
        this.expect(this.tok.T_ENDIF) && this.next();
        this.expectEndOfStatement();
      } else {
        body = this.read_statement();
        if (this.token === this.tok.T_ELSEIF) {
          alternate = this.read_if();
        } else if (this.token === this.tok.T_ELSE) {
          alternate = this.next().read_statement();
        }
      }
      return result(test, body, alternate, shortForm);
    }
func_code_string: function() {
      const result = this.node("if");
      let body = null;
      let alternate = null;
      let shortForm = false;
      let test = null;
      test = this.next().read_if_expr();
  
      if (this.token === ":") {
        shortForm = true;
        this.next();
        body = this.node("block");
        const items = [];
        while (this.token !== this.EOF && this.token !== this.tok.T_ENDIF) {
          if (this.token === this.tok.T_ELSEIF) {
            alternate = this.read_elseif_short();
            break;
          } else if (this.token === this.tok.T_ELSE) {
            alternate = this.read_else_short();
            break;
          }
          items.push(this.read_inner_statement());
        }
        body = body(null, items);
        this.expect(this.tok.T_ENDIF) && this.next();
        this.expectEndOfStatement();
      } else {
        body = this.read_statement();
        if (this.token === this.tok.T_ELSEIF) {
          alternate = this.read_if();
        } else if (this.token === this.tok.T_ELSE) {
          alternate = this.next().read_statement();
        }
      }
      return result(test, body, alternate, shortForm);
    }
func_documentation_string: Reads an IF statement
  
  ```ebnf
  if ::= T_IF '(' expr ')' ':' ...
  ```