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

@ -1,9 +1,6 @@
package build
import (
"strconv"
"git.akyoto.dev/cli/q/src/build/asm"
"git.akyoto.dev/cli/q/src/build/expression"
"git.akyoto.dev/cli/q/src/errors"
)
@ -11,31 +8,21 @@ import (
// CompileAssignment compiles an assignment.
func (f *Function) CompileAssignment(expr *expression.Expression) error {
name := expr.Children[0].Token.Text()
register := f.Variables[name].Register
variable, exists := f.Variables[name]
switch expr.Token.Text() {
case "=":
f.ExpressionToRegister(expr.Children[1], register)
case "+=":
number, _ := strconv.Atoi(expr.Children[1].Token.Text())
f.Assembler.RegisterNumber(asm.ADD, register, number)
case "-=":
number, _ := strconv.Atoi(expr.Children[1].Token.Text())
f.Assembler.RegisterNumber(asm.SUB, register, number)
case "*=":
number, _ := strconv.Atoi(expr.Children[1].Token.Text())
f.Assembler.RegisterNumber(asm.MUL, register, number)
case "/=":
number, _ := strconv.Atoi(expr.Children[1].Token.Text())
f.Assembler.RegisterNumber(asm.DIV, register, number)
default:
return errors.New(&errors.InvalidInstruction{Instruction: expr.Token.Text()}, f.File, expr.Token.Position)
if !exists {
return errors.New(&errors.UnknownIdentifier{Name: name}, f.File, expr.Children[0].Token.Position)
}
return nil
if expr.Token.Text() == "=" {
return f.ExpressionToRegister(expr.Children[1], variable.Register)
}
right := expr.Children[1]
if right.IsLeaf() {
return f.Calculate(variable.Register, expr.Token, right.Token)
}
return f.Execute(expr.Token, variable.Register, expr.Children[1])
}