code: func (p *parser) atomWords() (a atom, start int, err error) {
  	i := p.peek()
  	start = i.start
  	a = atom{}
  	switch i.typ {
  	case tokenLiteral:
  		err = newParseExpError(noLiteralSupport, *i)
  		return
  	case tokenQuotedLiteral:
  		err = newParseExpError(noQuotedLiteralSupport, *i)
  		return
  	case tokenColon:
  		err = newParseExpError(predicateError, *i)
  		return
  	case tokenPredicate:
  		i := p.next()
  		a.predicate = i.val
  	}
  	for {
  		switch p.peek().typ {
  		case tokenColon:
  			p.next()
  			continue
  		case tokenArg:
  			i := p.next()
  			a.args = append(a.args, i.val)
  			continue
  		case tokenQuotedArg:
  			i := p.next()
  			var uq string
  			uq, err = strconv.Unquote(i.val)
  			if err != nil {
  				return
  			}
  			a.args = append(a.args, uq)
  			continue
  		}
  		return
  	}
  }
docs: // AtomWords returns the parsed atom, the starting position of this
  // atom and an error.