code: func (p *parser) unaryExpr() Expr {
  	switch t := p.peek(); t.typ {
  	case ItemADD, ItemSUB:
  		p.next()
  		e := p.unaryExpr()
  
  		// Simplify unary expressions for number literals.
  		if nl, ok := e.(*NumberLiteral); ok {
  			if t.typ == ItemSUB {
  				nl.Val *= -1
  			}
  			return nl
  		}
  		return &UnaryExpr{Op: t.typ, Expr: e}
  
  	case ItemLeftParen:
  		p.next()
  		e := p.expr()
  		p.expect(ItemRightParen, "paren expression")
  
  		return &ParenExpr{Expr: e}
  	}
  	e := p.primaryExpr()
  
  	// Expression might be followed by a range selector.
  	if p.peek().typ == ItemLeftBracket {
  		e = p.subqueryOrRangeSelector(e, true)
  	}
  
  	// Parse optional offset.
  	if p.peek().typ == ItemOffset {
  		offset := p.offset()
  
  		switch s := e.(type) {
  		case *VectorSelector:
  			s.Offset = offset
  		case *MatrixSelector:
  			s.Offset = offset
  		case *SubqueryExpr:
  			s.Offset = offset
  		default:
  			p.errorf("offset modifier must be preceded by an instant or range selector, but follows a %T instead", e)
  		}
  	}
  
  	return e
  }
docs: // unaryExpr parses a unary expression.
  //
  //		<Vector_selector> | <Matrix_selector> | (+|-) <number_literal> | '(' <expr> ')'
  //