whole_func_string: function directives() {
          var i, p, pn;
  
          for (;;) {
              if (nexttoken.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("Missing semicolon.", nexttoken);
                      } else {
                          p = pn;
                      }
                  } else if (p.id === "}") {
                      // directive with no other statements, warn about missing semicolon
                      warning("Missing semicolon.", p);
                  } else if (p.id !== ";") {
                      break;
                  }
  
                  indentation();
                  advance();
                  if (directive[token.value]) {
                      warning("Unnecessary directive \"{a}\".", token, token.value);
                  }
  
                  if (token.value === "use strict") {
                      option.newcap = true;
                      option.undef = true;
                  }
  
                  // there's no directive negation, so always set to true
                  directive[token.value] = true;
  
                  if (p.id === ";") {
                      advance(";");
                  }
                  continue;
              }
              break;
          }
      }
func_code_string: function directives() {
          var i, p, pn;
  
          for (;;) {
              if (nexttoken.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("Missing semicolon.", nexttoken);
                      } else {
                          p = pn;
                      }
                  } else if (p.id === "}") {
                      // directive with no other statements, warn about missing semicolon
                      warning("Missing semicolon.", p);
                  } else if (p.id !== ";") {
                      break;
                  }
  
                  indentation();
                  advance();
                  if (directive[token.value]) {
                      warning("Unnecessary directive \"{a}\".", token, token.value);
                  }
  
                  if (token.value === "use strict") {
                      option.newcap = true;
                      option.undef = true;
                  }
  
                  // there's no directive negation, so always set to true
                  directive[token.value] = true;
  
                  if (p.id === ";") {
                      advance(";");
                  }
                  continue;
              }
              break;
          }
      }
func_documentation_string: /*
  read all directives
  recognizes a simple form of asi, but always
  warns, if it is used