package core import ( "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(f.File.Bytes) variable := f.VariableByName(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, token.Rune: number, err := f.Number(operand) if err != nil { return err } return f.ExecuteRegisterNumber(operation, register, number) case token.String: if operation.Kind == token.Assign { return f.TokenToRegister(operand, register) } } return errors.New(errors.NotImplemented, f.File, operation.Position) }