whole_func_string: function optionalidentifier(fnparam) {
          if (nexttoken.identifier) {
              advance();
              if (option.safe && banned[token.value]) {
                  warning("ADsafe violation: '{a}'.", token, token.value);
              } else if (token.reserved && !option.es5) {
                  // `undefined` as a function param is a common pattern to protect
                  // against the case when somebody does `undefined = true` and
                  // help with minification. More info: https://gist.github.com/315916
                  if (!fnparam || token.value != 'undefined') {
                      warning("Expected an identifier and instead saw '{a}' (a reserved word).",
                              token, token.id);
                  }
              }
              return token.value;
          }
      }
func_code_string: function optionalidentifier(fnparam) {
          if (nexttoken.identifier) {
              advance();
              if (option.safe && banned[token.value]) {
                  warning("ADsafe violation: '{a}'.", token, token.value);
              } else if (token.reserved && !option.es5) {
                  // `undefined` as a function param is a common pattern to protect
                  // against the case when somebody does `undefined = true` and
                  // help with minification. More info: https://gist.github.com/315916
                  if (!fnparam || token.value != 'undefined') {
                      warning("Expected an identifier and instead saw '{a}' (a reserved word).",
                              token, token.id);
                  }
              }
              return token.value;
          }
      }
func_documentation_string: fnparam means that this identifier is being defined as a function argument (see identifier())