code: func (p *Parser) parseIdentifiersList() (sets.String, error) {
  	s := sets.NewString()
  	for {
  		tok, lit := p.consume(Values)
  		switch tok {
  		case IdentifierToken:
  			s.Insert(lit)
  			tok2, lit2 := p.lookahead(Values)
  			switch tok2 {
  			case CommaToken:
  				continue
  			case ClosedParToken:
  				return s, nil
  			default:
  				return nil, fmt.Errorf("found '%s', expected: ',' or ')'", lit2)
  			}
  		case CommaToken: // handled here since we can have "(,"
  			if s.Len() == 0 {
  				s.Insert("") // to handle (,
  			}
  			tok2, _ := p.lookahead(Values)
  			if tok2 == ClosedParToken {
  				s.Insert("") // to handle ,)  Double "" removed by StringSet
  				return s, nil
  			}
  			if tok2 == CommaToken {
  				p.consume(Values)
  				s.Insert("") // to handle ,, Double "" removed by StringSet
  			}
  		default: // it can be operator
  			return s, fmt.Errorf("found '%s', expected: ',', or identifier", lit)
  		}
  	}
  }
docs: // parseIdentifiersList parses a (possibly empty) list of
  // of comma separated (possibly empty) identifiers