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();
    }
protected String identifier() throws ParserException {
        
        StringBuilder sb = new StringBuilder();

        
        if (!end() && !Character.isLetter(current) && current != '_') {
            return "";
        }
        while (!end() && (Character.isLetterOrDigit(current) || current == '-' || current == '_')) {
            sb.append(current);
            next();
        }
        return sb.toString();
    }
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 ( ) ; }
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]+
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 ] +