whole_func_string: function block(ordinary, stmt) {
          var a,
              b = inblock,
              old_indent = indent,
              m = strict_mode,
              s = scope,
              t;
  
          inblock = ordinary;
          scope = Object.create(scope);
          nonadjacent(token, nexttoken);
          t = nexttoken;
  
          if (nexttoken.id === '{') {
              advance('{');
              if (nexttoken.id !== '}' || token.line !== nexttoken.line) {
                  indent += option.indent;
                  while (!ordinary && nexttoken.from > indent) {
                      indent += option.indent;
                  }
                  if (!ordinary && !use_strict() && !m && option.strict &&
                          funct['(context)']['(global)']) {
                      warning("Missing \"use strict\" statement.");
                  }
                  a = statements();
                  strict_mode = m;
                  indent -= option.indent;
                  indentation();
              }
              advance('}', t);
              indent = old_indent;
          } else if (!ordinary) {
              error("Expected '{a}' and instead saw '{b}'.",
                    nexttoken, '{', nexttoken.value);
          } else {
              if (!stmt || option.curly)
                  warning("Expected '{a}' and instead saw '{b}'.",
                          nexttoken, '{', nexttoken.value);
  
              noreach = true;
              a = [statement()];
              noreach = false;
          }
          funct['(verb)'] = null;
          scope = s;
          inblock = b;
          if (ordinary && option.noempty && (!a || a.length === 0)) {
              warning("Empty block.");
          }
          return a;
      }
func_code_string: function block(ordinary, stmt) {
          var a,
              b = inblock,
              old_indent = indent,
              m = strict_mode,
              s = scope,
              t;
  
          inblock = ordinary;
          scope = Object.create(scope);
          nonadjacent(token, nexttoken);
          t = nexttoken;
  
          if (nexttoken.id === '{') {
              advance('{');
              if (nexttoken.id !== '}' || token.line !== nexttoken.line) {
                  indent += option.indent;
                  while (!ordinary && nexttoken.from > indent) {
                      indent += option.indent;
                  }
                  if (!ordinary && !use_strict() && !m && option.strict &&
                          funct['(context)']['(global)']) {
                      warning("Missing \"use strict\" statement.");
                  }
                  a = statements();
                  strict_mode = m;
                  indent -= option.indent;
                  indentation();
              }
              advance('}', t);
              indent = old_indent;
          } else if (!ordinary) {
              error("Expected '{a}' and instead saw '{b}'.",
                    nexttoken, '{', nexttoken.value);
          } else {
              if (!stmt || option.curly)
                  warning("Expected '{a}' and instead saw '{b}'.",
                          nexttoken, '{', nexttoken.value);
  
              noreach = true;
              a = [statement()];
              noreach = false;
          }
          funct['(verb)'] = null;
          scope = s;
          inblock = b;
          if (ordinary && option.noempty && (!a || a.length === 0)) {
              warning("Empty block.");
          }
          return a;
      }
func_documentation_string: /*
  Parses a single block. A block is a sequence of statements wrapped in
  braces.
  
  ordinary - true for everything but function bodies and try blocks.
  stmt     - true if block can be a single statement (e.g. in if/for/while).