in syntax/parse.go [779:836]
func (p *parser) parsePrimary() Expr {
switch p.tok {
case IDENT:
return p.parseIdent()
case INT, FLOAT, STRING, BYTES:
var val interface{}
tok := p.tok
switch tok {
case INT:
if p.tokval.bigInt != nil {
val = p.tokval.bigInt
} else {
val = p.tokval.int
}
case FLOAT:
val = p.tokval.float
case STRING, BYTES:
val = p.tokval.string
}
raw := p.tokval.raw
pos := p.nextToken()
return &Literal{Token: tok, TokenPos: pos, Raw: raw, Value: val}
case LBRACK:
return p.parseList()
case LBRACE:
return p.parseDict()
case LPAREN:
lparen := p.nextToken()
if p.tok == RPAREN {
// empty tuple
rparen := p.nextToken()
return &TupleExpr{Lparen: lparen, Rparen: rparen}
}
e := p.parseExpr(true) // allow trailing comma
rparen := p.consume(RPAREN)
return &ParenExpr{
Lparen: lparen,
X: e,
Rparen: rparen,
}
case MINUS, PLUS, TILDE: // unary
tok := p.tok
pos := p.nextToken()
x := p.parsePrimaryWithSuffix()
return &UnaryExpr{
OpPos: pos,
Op: tok,
X: x,
}
}
p.in.errorf(p.in.pos, "got %#v, want primary expression", p.tok)
panic("unreachable")
}