code: protected String identifier() throws ParserException {
          //TODO implement unicode, escape, [-], nonascii
          StringBuilder sb = new StringBuilder();
  
          //validates first character
          if (!end() && !Character.isLetter(current) && current != '_') {
              return "";
          }
          while (!end() && (Character.isLetterOrDigit(current) || current == '-' || current == '_')) {
              sb.append(current);
              next();
          }
          return sb.toString();
      }
docs: ident     [-]?{nmstart}{nmchar}*
  name      {nmchar}+
  nmstart   [_a-z]|{nonascii}|{escape}
  nonascii  [^\0-\177]
  unicode   \\[0-9a-f]{1,6}(\r\n|[ \n\r\t\f])?
  escape    {unicode}|\\[^\n\r\f0-9a-f]
  nmchar    [_a-z0-9-]|{nonascii}|{escape}
  num       [0-9]+|[0-9]*\.[0-9]+