package core import ( "strconv" "git.akyoto.dev/cli/q/src/build/cpu" "git.akyoto.dev/cli/q/src/build/errors" "git.akyoto.dev/cli/q/src/build/token" ) // ExecuteLeaf performs an operation on a register with the given leaf operand. func (f *Function) ExecuteLeaf(operation token.Token, register cpu.Register, operand token.Token) error { switch operand.Kind { case token.Identifier: name := operand.Text() variable := f.Variable(name) if variable == nil { return errors.New(&errors.UnknownIdentifier{Name: name}, f.File, operand.Position) } defer f.useVariable(variable) return f.ExecuteRegisterRegister(operation, register, variable.Register) case token.Number: value := operand.Text() number, err := strconv.Atoi(value) if err != nil { return err } return f.ExecuteRegisterNumber(operation, register, number) case token.String: if operation.Text() == "=" { return f.TokenToRegister(operand, register) } } return errors.New(errors.NotImplemented, f.File, operation.Position) }