code: @Override
      protected String badIdentifier(String expected) {
          error(expected);
  
          final String id = "@" + (nextId++);
          if (!peekPunctuation()) {
              final Token token = getNextToken();
              return "BAD_IDENTIFIER" + "_" + friendlyName(token) + id;
          } else {
              return "NO_IDENTIFIER" + id;
          }
      }
docs: Called by the parser whenever a required identifier is missing.
  
  It always records a syntax error and then creates a fake identifier.
  
  If the next token token isn't punctuation then get it and turn it into
  a fake identifier. Otherwise create a new fake identifier and leave the
  punctuation for somebody else to process