From 6959379182af36ef3bfac36854dec0ce1269cafa Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Mon, 3 Feb 2025 15:22:57 +0100 Subject: [PATCH] Simplified identifier lookup --- src/core/Define.go | 5 +++-- src/core/ExpressionToMemory.go | 11 +++-------- src/core/Identifier.go | 25 +++++++++++++++++++++++++ src/core/IdentifierExists.go | 13 ------------- src/core/TokenToRegister.go | 11 +++-------- 5 files changed, 34 insertions(+), 31 deletions(-) create mode 100644 src/core/Identifier.go delete mode 100644 src/core/IdentifierExists.go diff --git a/src/core/Define.go b/src/core/Define.go index ecd4178..94f7428 100644 --- a/src/core/Define.go +++ b/src/core/Define.go @@ -10,8 +10,9 @@ import ( // Define defines a new variable. func (f *Function) Define(leaf *expression.Expression) (*scope.Variable, error) { name := leaf.Token.Text(f.File.Bytes) + variable, _ := f.Identifier(name) - if f.IdentifierExists(name) { + if variable != nil { return nil, errors.New(&errors.VariableAlreadyExists{Name: name}, f.File, leaf.Token.Position) } @@ -21,7 +22,7 @@ func (f *Function) Define(leaf *expression.Expression) (*scope.Variable, error) return nil, errors.New(&errors.UnusedVariable{Name: name}, f.File, leaf.Token.Position) } - variable := &scope.Variable{ + variable = &scope.Variable{ Name: name, Register: f.NewRegister(), Alive: uses, diff --git a/src/core/ExpressionToMemory.go b/src/core/ExpressionToMemory.go index bd84657..29ca917 100644 --- a/src/core/ExpressionToMemory.go +++ b/src/core/ExpressionToMemory.go @@ -1,8 +1,6 @@ package core import ( - "fmt" - "git.akyoto.dev/cli/q/src/asm" "git.akyoto.dev/cli/q/src/errors" "git.akyoto.dev/cli/q/src/expression" @@ -16,7 +14,7 @@ func (f *Function) ExpressionToMemory(node *expression.Expression, memory asm.Me if node.IsLeaf() { if node.Token.Kind == token.Identifier { name := node.Token.Text(f.File.Bytes) - variable := f.VariableByName(name) + variable, function := f.Identifier(name) if variable != nil { f.UseVariable(variable) @@ -24,11 +22,8 @@ func (f *Function) ExpressionToMemory(node *expression.Expression, memory asm.Me return types.Pointer, nil } - uniqueName := fmt.Sprintf("%s.%s", f.Package, name) - _, exists := f.Functions[uniqueName] - - if exists { - f.MemoryLabel(asm.STORE, memory, uniqueName) + if function != nil { + f.MemoryLabel(asm.STORE, memory, function.UniqueName) return types.Pointer, nil } diff --git a/src/core/Identifier.go b/src/core/Identifier.go new file mode 100644 index 0000000..0150c56 --- /dev/null +++ b/src/core/Identifier.go @@ -0,0 +1,25 @@ +package core + +import ( + "fmt" + + "git.akyoto.dev/cli/q/src/scope" +) + +// Identifier looks up an identifier which can be a variable or a function. +func (f *Function) Identifier(name string) (*scope.Variable, *Function) { + variable := f.VariableByName(name) + + if variable != nil { + return variable, nil + } + + uniqueName := fmt.Sprintf("%s.%s", f.Package, name) + function, exists := f.Functions[uniqueName] + + if exists { + return nil, function + } + + return nil, nil +} diff --git a/src/core/IdentifierExists.go b/src/core/IdentifierExists.go deleted file mode 100644 index efa3ed7..0000000 --- a/src/core/IdentifierExists.go +++ /dev/null @@ -1,13 +0,0 @@ -package core - -// IdentifierExists returns true if the identifier has been defined. -func (f *Function) IdentifierExists(name string) bool { - variable := f.VariableByName(name) - - if variable != nil { - return true - } - - _, exists := f.Functions[name] - return exists -} diff --git a/src/core/TokenToRegister.go b/src/core/TokenToRegister.go index 0b189e5..8f8d53a 100644 --- a/src/core/TokenToRegister.go +++ b/src/core/TokenToRegister.go @@ -1,8 +1,6 @@ package core import ( - "fmt" - "git.akyoto.dev/cli/q/src/asm" "git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/cli/q/src/errors" @@ -16,7 +14,7 @@ func (f *Function) TokenToRegister(t token.Token, register cpu.Register) (*types switch t.Kind { case token.Identifier: name := t.Text(f.File.Bytes) - variable := f.VariableByName(name) + variable, function := f.Identifier(name) if variable != nil { f.UseVariable(variable) @@ -25,12 +23,9 @@ func (f *Function) TokenToRegister(t token.Token, register cpu.Register) (*types return variable.Type, nil } - uniqueName := fmt.Sprintf("%s.%s", f.Package, name) - _, exists := f.Functions[uniqueName] - - if exists { + if function != nil { f.SaveRegister(register) - f.RegisterLabel(asm.MOVE, register, uniqueName) + f.RegisterLabel(asm.MOVE, register, function.UniqueName) return types.Pointer, nil }