code: public Selector visitSelector(CSSParser.SelectorContext ctx) {
          if (ctxHasErrorNode(ctx)) {
              statement_stack.peek().invalid = true;
              return null;
          }
          selector_stack.push(new selector_scope());
          cz.vutbr.web.css.Selector sel;
          logEnter("selector");
          selector_stack.peek().s = sel = (cz.vutbr.web.css.Selector) rf.createSelector().unlock();
          if (ctx.IDENT() != null || ctx.ASTERISK() != null) {
              cz.vutbr.web.css.Selector.ElementName en = rf.createElement(cz.vutbr.web.css.Selector.ElementName.WILDCARD);
              if (ctx.IDENT() != null) {
                  en.setName(extractTextUnescaped(ctx.IDENT().getText()));
              }
              //log.debug("Adding element name: {}.", en.getName());
              selector_stack.peek().s.add(en);
          }
          for (CSSParser.SelpartContext selpartctx : ctx.selpart()) {
              visitSelpart(selpartctx);
          }
  
          logLeave("selector");
          selector_stack.pop();
          return sel;
      }
docs: selector
  : (IDENT | ASTERISK)  selpart* S*
  | selpart+ S*
  ;