Implemented if statements
This commit is contained in:
48
src/build/core/CompileIf.go
Normal file
48
src/build/core/CompileIf.go
Normal file
@ -0,0 +1,48 @@
|
||||
package core
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"git.akyoto.dev/cli/q/src/build/asm"
|
||||
"git.akyoto.dev/cli/q/src/build/ast"
|
||||
)
|
||||
|
||||
// CompileIf compiles a branch instruction.
|
||||
func (f *Function) CompileIf(branch *ast.If) error {
|
||||
condition := branch.Condition
|
||||
tmpRight := f.cpu.Input[1]
|
||||
err := f.ExpressionToRegister(condition.Children[1], tmpRight)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
tmpLeft := f.cpu.Input[0]
|
||||
err = f.ExpressionToRegister(condition.Children[0], tmpLeft)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
f.assembler.RegisterRegister(asm.COMPARE, tmpLeft, tmpRight)
|
||||
elseLabel := fmt.Sprintf("%s_if_%d_else", f.Name, f.count.branch)
|
||||
|
||||
switch condition.Token.Text() {
|
||||
case "==":
|
||||
f.assembler.Label(asm.JNE, elseLabel)
|
||||
case "!=":
|
||||
f.assembler.Label(asm.JE, elseLabel)
|
||||
case ">":
|
||||
f.assembler.Label(asm.JLE, elseLabel)
|
||||
case "<":
|
||||
f.assembler.Label(asm.JGE, elseLabel)
|
||||
case ">=":
|
||||
f.assembler.Label(asm.JL, elseLabel)
|
||||
case "<=":
|
||||
f.assembler.Label(asm.JG, elseLabel)
|
||||
}
|
||||
|
||||
defer f.assembler.Label(asm.LABEL, elseLabel)
|
||||
f.count.branch++
|
||||
return f.CompileAST(branch.Body)
|
||||
}
|
Reference in New Issue
Block a user