protected List<Selector> groups() throws ParserException {

        List<Selector> groups = new ArrayList<Selector>();
        int groupNumber = 0;
        while (!end()) {
            ignoreWhitespaces();
            parserListener.beginGroup(groupNumber, pos);
            Selector selector = selector();
            groups.add(selector);
            parserListener.endGroup(selector);
            groupNumber++;
            ignoreWhitespaces();
            if (!end() && current != ',') {
                throw new ParserException("There is something left in the selector at position " + pos);
            }
            next();
        }
        return groups;

    }
protected List<Selector> groups() throws ParserException {

        List<Selector> groups = new ArrayList<Selector>();
        int groupNumber = 0;
        while (!end()) {
            ignoreWhitespaces();
            parserListener.beginGroup(groupNumber, pos);
            Selector selector = selector();
            groups.add(selector);
            parserListener.endGroup(selector);
            groupNumber++;
            ignoreWhitespaces();
            if (!end() && current != ',') {
                throw new ParserException("There is something left in the selector at position " + pos);
            }
            next();
        }
        return groups;

    }
protected List < Selector > groups ( ) throws ParserException { List < Selector > groups = new ArrayList < Selector > ( ) ; int groupNumber = 0 ; while ( ! end ( ) ) { ignoreWhitespaces ( ) ; parserListener . beginGroup ( groupNumber , pos ) ; Selector selector = selector ( ) ; groups . add ( selector ) ; parserListener . endGroup ( selector ) ; groupNumber ++ ; ignoreWhitespaces ( ) ; if ( ! end ( ) && current != ' ' ) { throw new ParserException ( "There is something left in the selector at position " + pos ) ; } next ( ) ; } return groups ; }
selectors_group
: selector [ COMMA S* selector ]*
selectors_group : selector [ COMMA S * selector ] *