code: func (p *Parser) parseSegmentedIdents() ([]string, error) {
  	ident, err := p.ParseIdent()
  	if err != nil {
  		return nil, err
  	}
  	idents := []string{ident}
  
  	// Parse remaining (optional) identifiers.
  	for {
  		if tok, _, _ := p.Scan(); tok != DOT {
  			// No more segments so we're done.
  			p.Unscan()
  			break
  		}
  
  		if ch := p.peekRune(); ch == '/' {
  			// Next segment is a regex so we're done.
  			break
  		} else if ch == ':' {
  			// Next segment is context-specific so let caller handle it.
  			break
  		} else if ch == '.' {
  			// Add an empty identifier.
  			idents = append(idents, "")
  			continue
  		}
  
  		// Parse the next identifier.
  		if ident, err = p.ParseIdent(); err != nil {
  			return nil, err
  		}
  
  		idents = append(idents, ident)
  	}
  
  	if len(idents) > 3 {
  		msg := fmt.Sprintf("too many segments in %s", QuoteIdent(idents...))
  		return nil, &ParseError{Message: msg}
  	}
  
  	return idents, nil
  }
docs: // parseSegmentedIdents parses a segmented identifiers.
  // e.g.,  "db"."rp".measurement  or  "db"..measurement