package core import ( "git.akyoto.dev/cli/q/src/build/asm" "git.akyoto.dev/cli/q/src/build/cpu" "git.akyoto.dev/cli/q/src/build/errors" "git.akyoto.dev/cli/q/src/build/token" ) // TokenToRegister moves a token into a register. // It only works with identifiers, numbers and strings. func (f *Function) TokenToRegister(t token.Token, register cpu.Register) error { switch t.Kind { case token.Identifier: name := t.Text(f.File.Bytes) variable := f.VariableByName(name) if variable == nil { return errors.New(&errors.UnknownIdentifier{Name: name}, f.File, t.Position) } f.UseVariable(variable) f.SaveRegister(register) f.RegisterRegister(asm.MOVE, register, variable.Register) return nil case token.Number, token.Rune: number, err := f.Number(t) if err != nil { return err } f.SaveRegister(register) f.RegisterNumber(asm.MOVE, register, number) return nil case token.String: data := t.Bytes(f.File.Bytes) data = String(data) label := f.AddBytes(data) f.SaveRegister(register) f.RegisterLabel(asm.MOVE, register, label) return nil default: return errors.New(errors.InvalidExpression, f.File, t.Position) } }