code: function directives() {
      var i, p, pn;
  
      for (;;) {
        if (state.tokens.next.id === "(string)") {
          p = peek(0);
          if (p.id === "(endline)") {
            i = 1;
            do {
              pn = peek(i);
              i = i + 1;
            } while (pn.id === "(endline)");
  
            if (pn.id !== ";") {
              if (pn.id !== "(string)" && pn.id !== "(number)" &&
                pn.id !== "(regexp)" && pn.identifier !== true &&
                pn.id !== "}") {
                break;
              }
              warning("W033", state.tokens.next);
            } else {
              p = pn;
            }
          } else if (p.id === "}") {
            // Directive with no other statements, warn about missing semicolon
            warning("W033", p);
          } else if (p.id !== ";") {
            break;
          }
  
          advance();
          if (state.directive[state.tokens.curr.value]) {
            warning("W034", state.tokens.curr, state.tokens.curr.value);
          }
  
          if (state.tokens.curr.value === "use strict") {
            if (!state.option["(explicitNewcap)"])
              state.option.newcap = true;
            state.option.undef = true;
          }
  
          // there's no directive negation, so always set to true
          state.directive[state.tokens.curr.value] = true;
  
          if (p.id === ";") {
            advance(";");
          }
          continue;
        }
        break;
      }
    }
docs: /*
  read all directives
  recognizes a simple form of asi, but always
  warns, if it is used