34 lines
800 B
Go
34 lines
800 B
Go
|
package core
|
||
|
|
||
|
import (
|
||
|
"git.akyoto.dev/cli/q/src/build/asm"
|
||
|
"git.akyoto.dev/cli/q/src/build/ast"
|
||
|
"git.akyoto.dev/cli/q/src/build/cpu"
|
||
|
"git.akyoto.dev/cli/q/src/build/expression"
|
||
|
)
|
||
|
|
||
|
// ExpressionToRegister puts the result of an expression into the specified register.
|
||
|
func (f *Function) ExpressionToRegister(root *expression.Expression, register cpu.Register) error {
|
||
|
if root.IsLeaf() {
|
||
|
return f.TokenToRegister(root.Token, register)
|
||
|
}
|
||
|
|
||
|
if ast.IsFunctionCall(root) {
|
||
|
err := f.CompileCall(root)
|
||
|
f.assembler.RegisterRegister(asm.MOVE, register, f.cpu.Output[0])
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
left := root.Children[0]
|
||
|
right := root.Children[1]
|
||
|
|
||
|
err := f.ExpressionToRegister(left, register)
|
||
|
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
f.SaveRegister(register)
|
||
|
return f.Execute(root.Token, register, right)
|
||
|
}
|