Implemented complex expressions

This commit is contained in:
2024-06-26 22:51:14 +02:00
parent 988a538661
commit d1a3ffb1a5
7 changed files with 137 additions and 102 deletions

View File

@ -2,7 +2,6 @@ package build
import (
"git.akyoto.dev/cli/q/src/build/expression"
"git.akyoto.dev/cli/q/src/build/token"
"git.akyoto.dev/cli/q/src/errors"
)
@ -18,27 +17,18 @@ func (f *Function) CompileVariableDefinition(expr *expression.Expression) error
return errors.New(&errors.VariableAlreadyExists{Name: name}, f.File, expr.Children[0].Token.Position)
}
value := expr.Children[1]
err := value.EachLeaf(func(leaf *expression.Expression) error {
if leaf.Token.Kind == token.Identifier && !f.identifierExists(leaf.Token.Text()) {
return errors.New(&errors.UnknownIdentifier{Name: leaf.Token.Text()}, f.File, leaf.Token.Position)
}
return nil
})
if err != nil {
return err
}
reg, exists := f.CPU.FindFree(f.CPU.General)
if !exists {
panic("no free registers")
}
f.ExpressionToRegister(value, reg)
err := f.ExpressionToRegister(expr.Children[1], reg)
if err != nil {
return err
}
f.CPU.Use(reg)
f.Variables[name] = &Variable{