whole_func_string: function advance(id, t) {
          switch (token.id) {
          case '(number)':
              if (nexttoken.id === '.') {
                  warning(
  "A dot following a number can be confused with a decimal point.", token);
              }
              break;
          case '-':
              if (nexttoken.id === '-' || nexttoken.id === '--') {
                  warning("Confusing minusses.");
              }
              break;
          case '+':
              if (nexttoken.id === '+' || nexttoken.id === '++') {
                  warning("Confusing plusses.");
              }
              break;
          }
          if (token.type === '(string)' || token.identifier) {
              anonname = token.value;
          }
  
          if (id && nexttoken.id !== id) {
              if (t) {
                  if (nexttoken.id === '(end)') {
                      warning("Unmatched '{a}'.", t, t.id);
                  } else {
                      warning(
  "Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.",
                              nexttoken, id, t.id, t.line, nexttoken.value);
                  }
              } else if (nexttoken.type !== '(identifier)' ||
                              nexttoken.value !== id) {
                  warning("Expected '{a}' and instead saw '{b}'.",
                          nexttoken, id, nexttoken.value);
              }
          }
          prevtoken = token;
          token = nexttoken;
          for (;;) {
              nexttoken = lookahead.shift() || lex.token();
              if (nexttoken.id === '(end)' || nexttoken.id === '(error)') {
                  return;
              }
              if (nexttoken.type === 'special') {
                  doOption();
              } else {
                  if (nexttoken.id !== '(endline)') {
                      break;
                  }
              }
          }
      }
func_code_string: function advance(id, t) {
          switch (token.id) {
          case '(number)':
              if (nexttoken.id === '.') {
                  warning(
  "A dot following a number can be confused with a decimal point.", token);
              }
              break;
          case '-':
              if (nexttoken.id === '-' || nexttoken.id === '--') {
                  warning("Confusing minusses.");
              }
              break;
          case '+':
              if (nexttoken.id === '+' || nexttoken.id === '++') {
                  warning("Confusing plusses.");
              }
              break;
          }
          if (token.type === '(string)' || token.identifier) {
              anonname = token.value;
          }
  
          if (id && nexttoken.id !== id) {
              if (t) {
                  if (nexttoken.id === '(end)') {
                      warning("Unmatched '{a}'.", t, t.id);
                  } else {
                      warning(
  "Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.",
                              nexttoken, id, t.id, t.line, nexttoken.value);
                  }
              } else if (nexttoken.type !== '(identifier)' ||
                              nexttoken.value !== id) {
                  warning("Expected '{a}' and instead saw '{b}'.",
                          nexttoken, id, nexttoken.value);
              }
          }
          prevtoken = token;
          token = nexttoken;
          for (;;) {
              nexttoken = lookahead.shift() || lex.token();
              if (nexttoken.id === '(end)' || nexttoken.id === '(error)') {
                  return;
              }
              if (nexttoken.type === 'special') {
                  doOption();
              } else {
                  if (nexttoken.id !== '(endline)') {
                      break;
                  }
              }
          }
      }
func_documentation_string: Produce the next token. It looks for programming errors.