code: function() {
      var query = new nodes.Query
        , expr
        , pred
        , id;
  
      // hash values support
      if ('ident' == this.peek().type
        && ('.' == this.lookahead(2).type
        || '[' == this.lookahead(2).type)) {
        this.cond = true;
        expr = this.expression();
        this.cond = false;
        query.push(new nodes.Feature(expr.nodes));
        return query;
      }
  
      if (pred = this.accept('ident') || this.accept('not')) {
        pred = new nodes.Literal(pred.val.string || pred.val);
  
        this.skipSpacesAndComments();
        if (id = this.accept('ident')) {
          query.type = id.val;
          query.predicate = pred;
        } else {
          query.type = pred;
        }
        this.skipSpacesAndComments();
  
        if (!this.accept('&&')) return query;
      }
  
      do {
        query.push(this.feature());
      } while (this.accept('&&'));
  
      return query;
    }
docs: expression
  | (ident | 'not')? ident ('and' feature)*
  | feature ('and' feature)*